summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/styles/qcleanlooksstyle.cpp10
-rw-r--r--src/network/bearer/qnetworkconfigmanager.cpp23
-rw-r--r--src/plugins/bearer/symbian/qnetworksession_impl.cpp82
-rw-r--r--src/plugins/bearer/symbian/qnetworksession_impl.h11
-rw-r--r--src/plugins/bearer/symbian/symbianengine.cpp86
-rw-r--r--src/plugins/bearer/symbian/symbianengine.h17
6 files changed, 156 insertions, 73 deletions
diff --git a/src/gui/styles/qcleanlooksstyle.cpp b/src/gui/styles/qcleanlooksstyle.cpp
index ada5293..306219d 100644
--- a/src/gui/styles/qcleanlooksstyle.cpp
+++ b/src/gui/styles/qcleanlooksstyle.cpp
@@ -2157,7 +2157,7 @@ void QCleanlooksStyle::drawControl(ControlElement element, const QStyleOption *o
}
if (button->features & QStyleOptionButton::HasMenu)
- ir = ir.adjusted(0, 0, -pixelMetric(PM_MenuButtonIndicator, button, widget), 0);
+ ir = ir.adjusted(0, 0, -proxy()->pixelMetric(PM_MenuButtonIndicator, button, widget), 0);
proxy()->drawItemText(painter, ir, tf, button->palette, (button->state & State_Enabled),
button->text, QPalette::ButtonText);
}
@@ -4014,8 +4014,8 @@ QRect QCleanlooksStyle::subControlRect(ComplexControl control, const QStyleOptio
switch (subControl) {
case SC_SliderHandle: {
if (slider->orientation == Qt::Horizontal) {
- rect.setHeight(pixelMetric(PM_SliderThickness));
- rect.setWidth(pixelMetric(PM_SliderLength));
+ rect.setHeight(proxy()->pixelMetric(PM_SliderThickness));
+ rect.setWidth(proxy()->pixelMetric(PM_SliderLength));
int centerY = slider->rect.center().y() - rect.height() / 2;
if (slider->tickPosition & QSlider::TicksAbove)
centerY += tickSize;
@@ -4023,8 +4023,8 @@ QRect QCleanlooksStyle::subControlRect(ComplexControl control, const QStyleOptio
centerY -= tickSize;
rect.moveTop(centerY);
} else {
- rect.setWidth(pixelMetric(PM_SliderThickness));
- rect.setHeight(pixelMetric(PM_SliderLength));
+ rect.setWidth(proxy()->pixelMetric(PM_SliderThickness));
+ rect.setHeight(proxy()->pixelMetric(PM_SliderLength));
int centerX = slider->rect.center().x() - rect.width() / 2;
if (slider->tickPosition & QSlider::TicksAbove)
centerX += tickSize;
diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp
index 65014a6..23d7800 100644
--- a/src/network/bearer/qnetworkconfigmanager.cpp
+++ b/src/network/bearer/qnetworkconfigmanager.cpp
@@ -45,12 +45,33 @@
#include "qbearerengine_p.h"
#include <QtCore/qstringlist.h>
+#include <QtCore/qcoreapplication.h>
#ifndef QT_NO_BEARERMANAGEMENT
QT_BEGIN_NAMESPACE
-Q_GLOBAL_STATIC(QNetworkConfigurationManagerPrivate, connManager);
+#define Q_GLOBAL_STATIC_QAPP_DESTRUCTION(TYPE, NAME) \
+ Q_GLOBAL_STATIC_INIT(TYPE, NAME); \
+ static void NAME##_cleanup() \
+ { \
+ delete this_##NAME.pointer; \
+ this_##NAME.pointer = 0; \
+ this_##NAME.destroyed = true; \
+ } \
+ static TYPE *NAME() \
+ { \
+ if (!this_##NAME.pointer && !this_##NAME.destroyed) { \
+ TYPE *x = new TYPE; \
+ if (!this_##NAME.pointer.testAndSetOrdered(0, x)) \
+ delete x; \
+ else \
+ qAddPostRoutine(NAME##_cleanup); \
+ } \
+ return this_##NAME.pointer; \
+ }
+
+Q_GLOBAL_STATIC_QAPP_DESTRUCTION(QNetworkConfigurationManagerPrivate, connManager);
QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate()
{
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 32eb61a..19f13c2 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -48,6 +48,14 @@
#include <stdapis/sys/socket.h>
#include <stdapis/net/if.h>
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+#include <cmmanager.h>
+#endif
+
+#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#include <extendedconnpref.h>
+#endif
+
#ifndef QT_NO_BEARERMANAGEMENT
QT_BEGIN_NAMESPACE
@@ -113,7 +121,7 @@ QNetworkSessionPrivateImpl::~QNetworkSessionPrivateImpl()
#endif
}
-void QNetworkSessionPrivateImpl::configurationStateChanged(TUint32 accessPointId, TUint32 connMonId, QNetworkSession::State newState)
+void QNetworkSessionPrivateImpl::configurationStateChanged(quint32 accessPointId, quint32 connMonId, QNetworkSession::State newState)
{
if (iHandleStateNotificationsFromManager) {
#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
@@ -170,8 +178,10 @@ void QNetworkSessionPrivateImpl::syncStateWithInterface()
return;
if (iFirstSync) {
- QObject::connect(engine, SIGNAL(configurationStateChanged(TUint32, TUint32, QNetworkSession::State)),
- this, SLOT(configurationStateChanged(TUint32, TUint32, QNetworkSession::State)));
+ QObject::connect(engine,
+ SIGNAL(configurationStateChanged(quint32,quint32,QNetworkSession::State)),
+ this,
+ SLOT(configurationStateChanged(quint32,quint32,QNetworkSession::State)));
// Listen to configuration removals, so that in case the configuration
// this session is based on is removed, session knows to enter Invalid -state.
QObject::connect(engine, SIGNAL(configurationRemoved(QNetworkConfigurationPrivatePointer)),
@@ -902,13 +912,13 @@ QNetworkConfiguration QNetworkSessionPrivateImpl::activeConfiguration(TUint32 ia
if (iapId == 0) {
_LIT(KSetting, "IAP\\Id");
iConnection.GetIntSetting(KSetting, iapId);
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
// Check if this is an Easy WLAN configuration. On Symbian^3 RConnection may report
// the used configuration as 'EasyWLAN' IAP ID if someone has just opened the configuration
// from WLAN Scan dialog, _and_ that connection is still up. We need to find the
// real matching configuration. Function alters the Easy WLAN ID to real IAP ID (only if
// easy WLAN):
- engine->easyWlanTrueIapId(iapId);
+ easyWlanTrueIapId(iapId);
#endif
}
@@ -948,7 +958,7 @@ QNetworkConfiguration QNetworkSessionPrivateImpl::activeConfiguration(TUint32 ia
}
}
} else {
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
// On Symbian^3 (only, not earlier or Symbian^4) if the SNAP was not reachable, it triggers
// user choice type of activity (EasyWLAN). As a result, a new IAP may be created, and
// hence if was not found yet. Therefore update configurations and see if there is something new.
@@ -1319,7 +1329,7 @@ bool QNetworkSessionPrivateImpl::newState(QNetworkSession::State newState, TUint
}
}
}
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
// If the retVal is not true here, it means that the status update may apply to an IAP outside of
// SNAP (session is based on SNAP but follows IAP outside of it), which may occur on Symbian^3 EasyWlan.
if (retVal == false && activeConfig.isValid() &&
@@ -1472,6 +1482,64 @@ void QNetworkSessionPrivateImpl::restoreDefaultIf()
setdefaultif(&ifr);
}
+#if defined(SNAP_FUNCTIONALITY_AVAILABLE)
+bool QNetworkSessionPrivateImpl::easyWlanTrueIapId(TUint32 &trueIapId) const
+{
+ RCmManager iCmManager;
+ TRAPD(err, iCmManager.OpenL());
+ if (err != KErrNone)
+ return false;
+
+ // Check if this is easy wlan id in the first place
+ if (trueIapId != iCmManager.EasyWlanIdL()) {
+ iCmManager.Close();
+ return false;
+ }
+
+ iCmManager.Close();
+
+ // Loop through all connections that connection monitor is aware
+ // and check for IAPs based on easy WLAN
+ TRequestStatus status;
+ TUint connectionCount;
+ iConnectionMonitor.GetConnectionCount(connectionCount, status);
+ User::WaitForRequest(status);
+ TUint connectionId;
+ TUint subConnectionCount;
+ TUint apId;
+ if (status.Int() == KErrNone) {
+ for (TUint i = 1; i <= connectionCount; i++) {
+ iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount);
+ iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount,
+ KIAPId, apId, status);
+ User::WaitForRequest(status);
+ if (apId == trueIapId) {
+ TBuf<50>easyWlanNetworkName;
+ iConnectionMonitor.GetStringAttribute(connectionId, 0, KNetworkName,
+ easyWlanNetworkName, status);
+ User::WaitForRequest(status);
+ if (status.Int() != KErrNone)
+ continue;
+
+ const QString ssid = QString::fromUtf16(easyWlanNetworkName.Ptr(),
+ easyWlanNetworkName.Length());
+
+ QNetworkConfigurationPrivatePointer ptr = engine->configurationFromSsid(ssid);
+ if (ptr) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNCM easyWlanTrueIapId(), found true IAP ID: "
+ << toSymbianConfig(ptr)->numericIdentifier();
+#endif
+ trueIapId = toSymbianConfig(ptr)->numericIdentifier();
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+#endif
+
ConnectionProgressNotifier::ConnectionProgressNotifier(QNetworkSessionPrivateImpl& owner, RConnection& connection)
: CActive(CActive::EPriorityUserInput), iOwner(owner), iConnection(connection)
{
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.h b/src/plugins/bearer/symbian/qnetworksession_impl.h
index 1b0e968..51f2e70 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.h
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.h
@@ -64,9 +64,6 @@
#ifdef SNAP_FUNCTIONALITY_AVAILABLE
#include <comms-infras/cs_mobility_apiext.h>
#endif
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
- #include <extendedconnpref.h>
-#endif
QT_BEGIN_NAMESPACE
@@ -132,7 +129,8 @@ protected: // From CActive
void DoCancel();
private Q_SLOTS:
- void configurationStateChanged(TUint32 accessPointId, TUint32 connMonId, QNetworkSession::State newState);
+ void configurationStateChanged(quint32 accessPointId, quint32 connMonId,
+ QNetworkSession::State newState);
void configurationRemoved(QNetworkConfigurationPrivatePointer config);
void configurationAdded(QNetworkConfigurationPrivatePointer config);
@@ -148,6 +146,11 @@ private:
QNetworkInterface interface(TUint iapId) const;
#endif
+#if defined(SNAP_FUNCTIONALITY_AVAILABLE)
+ bool easyWlanTrueIapId(TUint32 &trueIapId) const;
+#endif
+
+
private: // data
SymbianEngine *engine;
diff --git a/src/plugins/bearer/symbian/symbianengine.cpp b/src/plugins/bearer/symbian/symbianengine.cpp
index 9593461..2e2b671 100644
--- a/src/plugins/bearer/symbian/symbianengine.cpp
+++ b/src/plugins/bearer/symbian/symbianengine.cpp
@@ -692,7 +692,7 @@ void SymbianEngine::updateActiveAccessPoints()
User::WaitForRequest(status);
QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
if (!ptr) {
// If IAP was not found, check if the update was about EasyWLAN
ptr = configurationFromEasyWlan(apId, connectionId);
@@ -1054,7 +1054,7 @@ void SymbianEngine::EventL(const CConnMonEventBase& aEvent)
QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
if (!ptr) {
// Check if status was regarding EasyWLAN
ptr = configurationFromEasyWlan(apId, connectionId);
@@ -1079,7 +1079,7 @@ void SymbianEngine::EventL(const CConnMonEventBase& aEvent)
User::WaitForRequest(status);
QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
if (!ptr) {
// Check for EasyWLAN
ptr = configurationFromEasyWlan(apId, connectionId);
@@ -1189,7 +1189,7 @@ void SymbianEngine::EventL(const CConnMonEventBase& aEvent)
User::WaitForRequest(status);
QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
if (!ptr) {
// If IAP was not found, check if the update was about EasyWLAN
ptr = configurationFromEasyWlan(apId, connectionId);
@@ -1210,11 +1210,39 @@ void SymbianEngine::EventL(const CConnMonEventBase& aEvent)
}
}
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+/*
+ Returns the network configuration that matches the given SSID.
+*/
+QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromSsid(const QString &ssid)
+{
+ QMutexLocker locker(&mutex);
+
+ // Browser through all items and check their name for match
+ QHash<QString, QNetworkConfigurationPrivatePointer>::ConstIterator i =
+ accessPointConfigurations.constBegin();
+ while (i != accessPointConfigurations.constEnd()) {
+ QNetworkConfigurationPrivatePointer ptr = i.value();
+
+ QMutexLocker configLocker(&ptr->mutex);
+
+ if (ptr->name == ssid) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNCM EasyWlan uses real SSID: " << ssid;
+#endif
+ return ptr;
+ }
+ ++i;
+ }
+
+ return QNetworkConfigurationPrivatePointer();
+}
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
// Tries to derive configuration from EasyWLAN.
// First checks if the interface brought up was EasyWLAN, then derives the real SSID,
// and looks up configuration based on that one.
-QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromEasyWlan(TUint32 apId, TUint connectionId)
+QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromEasyWlan(TUint32 apId,
+ TUint connectionId)
{
if (apId == iCmManager.EasyWlanIdL()) {
TRequestStatus status;
@@ -1223,11 +1251,12 @@ QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromEasyWlan(TUi
easyWlanNetworkName, status );
User::WaitForRequest(status);
if (status.Int() == KErrNone) {
- QString realSSID = QString::fromUtf16(easyWlanNetworkName.Ptr(), easyWlanNetworkName.Length());
+ const QString realSSID = QString::fromUtf16(easyWlanNetworkName.Ptr(),
+ easyWlanNetworkName.Length());
// Browser through all items and check their name for match
- QHash<QString, QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> >::const_iterator i =
- accessPointConfigurations.constBegin();
+ QHash<QString, QNetworkConfigurationPrivatePointer>::ConstIterator i =
+ accessPointConfigurations.constBegin();
while (i != accessPointConfigurations.constEnd()) {
QNetworkConfigurationPrivatePointer ptr = i.value();
@@ -1245,45 +1274,6 @@ QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromEasyWlan(TUi
}
return QNetworkConfigurationPrivatePointer();
}
-
-bool SymbianEngine::easyWlanTrueIapId(TUint32& trueIapId)
-{
- // Check if this is easy wlan id in the first place
- if (trueIapId != iCmManager.EasyWlanIdL())
- return false;
-
- // Loop through all connections that connection monitor is aware
- // and check for IAPs based on easy WLAN
- TRequestStatus status;
- TUint connectionCount;
- iConnectionMonitor.GetConnectionCount(connectionCount, status);
- User::WaitForRequest(status);
- TUint connectionId;
- TUint subConnectionCount;
- TUint apId;
- if (status.Int() == KErrNone) {
- for (TUint i = 1; i <= connectionCount; i++) {
- iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount);
- iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount,
- KIAPId, apId, status);
- User::WaitForRequest(status);
- if (apId == trueIapId) {
- QNetworkConfigurationPrivatePointer ptr =
- configurationFromEasyWlan(apId, connectionId);
- if (ptr) {
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNCM easyWlanTrueIapId(), found true IAP ID: "
- << toSymbianConfig(ptr)->numericIdentifier();
-#endif
- trueIapId = toSymbianConfig(ptr)->numericIdentifier();
- return true;
- }
- }
- }
- }
- return false;
-}
-
#endif
// Sessions may use this function to report configuration state changes,
diff --git a/src/plugins/bearer/symbian/symbianengine.h b/src/plugins/bearer/symbian/symbianengine.h
index 1fe6395..7c1076e 100644
--- a/src/plugins/bearer/symbian/symbianengine.h
+++ b/src/plugins/bearer/symbian/symbianengine.h
@@ -138,10 +138,15 @@ public:
QStringList accessPointConfigurationIdentifiers();
+ QNetworkConfigurationPrivatePointer configurationFromSsid(const QString &ssid);
+
+ // For QNetworkSessionPrivateImpl to indicate about state changes
+ void configurationStateChangeReport(TUint32 accessPointId, QNetworkSession::State newState);
+
Q_SIGNALS:
void onlineStateChanged(bool isOnline);
- void configurationStateChanged(TUint32 accessPointId, TUint32 connMonId,
+ void configurationStateChanged(quint32 accessPointId, quint32 connMonId,
QNetworkSession::State newState);
public Q_SLOTS:
@@ -187,12 +192,9 @@ protected:
private:
// MConnectionMonitorObserver
void EventL(const CConnMonEventBase& aEvent);
- // For QNetworkSessionPrivate to indicate about state changes
- void configurationStateChangeReport(TUint32 accessPointId,
- QNetworkSession::State newState);
-#ifdef OCC_FUNCTIONALITY_AVAILABLE
- QNetworkConfigurationPrivatePointer configurationFromEasyWlan(TUint32 apId, TUint connectionId);
- bool easyWlanTrueIapId(TUint32& trueIapId);
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ QNetworkConfigurationPrivatePointer configurationFromEasyWlan(TUint32 apId,
+ TUint connectionId);
#endif
private: // Data
@@ -212,7 +214,6 @@ private: // Data
friend class QNetworkSessionPrivate;
friend class AccessPointsAvailabilityScanner;
- friend class QNetworkSessionPrivateImpl;
#ifdef SNAP_FUNCTIONALITY_AVAILABLE
RCmManager iCmManager;
it/diff/demos/embedded/anomaly/anomaly.pro?h=v4.8.0-beta&id=d4a4b01f2f08a9031d692344d0d264de472da25e&id2=058520de736230b6867210c3f7c12d976c15adde'>demos/embedded/anomaly/anomaly.pro31
-rw-r--r--demos/embedded/anomaly/src/AddressBar.cpp109
-rw-r--r--demos/embedded/anomaly/src/AddressBar.h73
-rw-r--r--demos/embedded/anomaly/src/BookmarksView.cpp70
-rw-r--r--demos/embedded/anomaly/src/BookmarksView.h64
-rw-r--r--demos/embedded/anomaly/src/BrowserView.cpp185
-rw-r--r--demos/embedded/anomaly/src/BrowserView.h92
-rw-r--r--demos/embedded/anomaly/src/BrowserWindow.cpp187
-rw-r--r--demos/embedded/anomaly/src/BrowserWindow.h79
-rw-r--r--demos/embedded/anomaly/src/ControlStrip.cpp101
-rw-r--r--demos/embedded/anomaly/src/ControlStrip.h72
-rw-r--r--demos/embedded/anomaly/src/HomeView.cpp76
-rw-r--r--demos/embedded/anomaly/src/HomeView.h74
-rw-r--r--demos/embedded/anomaly/src/Main.cpp71
-rw-r--r--demos/embedded/anomaly/src/TitleBar.cpp124
-rw-r--r--demos/embedded/anomaly/src/TitleBar.h70
-rw-r--r--demos/embedded/anomaly/src/ZoomStrip.cpp82
-rw-r--r--demos/embedded/anomaly/src/ZoomStrip.h70
-rw-r--r--demos/embedded/anomaly/src/anomaly.qrc9
-rw-r--r--demos/embedded/anomaly/src/flickcharm.cpp327
-rw-r--r--demos/embedded/anomaly/src/flickcharm.h67
-rw-r--r--demos/embedded/anomaly/src/images/edit-find.pngbin0 -> 1636 bytes-rw-r--r--demos/embedded/anomaly/src/images/go-next.pngbin0 -> 1219 bytes-rw-r--r--demos/embedded/anomaly/src/images/go-previous.pngbin0 -> 1200 bytes-rw-r--r--demos/embedded/anomaly/src/images/list-add.pngbin0 -> 601 bytes-rw-r--r--demos/embedded/anomaly/src/images/list-remove.pngbin0 -> 317 bytes-rw-r--r--demos/embedded/desktopservices/contenttab.cpp154
-rw-r--r--demos/embedded/desktopservices/contenttab.h101
-rw-r--r--demos/embedded/desktopservices/data/Explosion.wavbin0 -> 18427 bytes-rw-r--r--demos/embedded/desktopservices/data/designer.pngbin0 -> 4205 bytes-rw-r--r--demos/embedded/desktopservices/data/monkey_on_64x64.pngbin0 -> 3479 bytes-rw-r--r--demos/embedded/desktopservices/data/sax.mp3bin0 -> 417844 bytes-rw-r--r--demos/embedded/desktopservices/desktopservices.pro22
-rw-r--r--demos/embedded/desktopservices/desktopservices.qrc8
-rw-r--r--demos/embedded/desktopservices/desktopwidget.cpp90
-rw-r--r--demos/embedded/desktopservices/desktopwidget.h73
-rw-r--r--demos/embedded/desktopservices/linktab.cpp88
-rw-r--r--demos/embedded/desktopservices/linktab.h86
-rw-r--r--demos/embedded/desktopservices/main.cpp56
-rw-r--r--demos/embedded/desktopservices/resources/browser.pngbin0 -> 2739 bytes-rw-r--r--demos/embedded/desktopservices/resources/heart.svg55
-rw-r--r--demos/embedded/desktopservices/resources/message.pngbin0 -> 2234 bytes-rw-r--r--demos/embedded/desktopservices/resources/music.pngbin0 -> 2322 bytes-rw-r--r--demos/embedded/desktopservices/resources/photo.pngbin0 -> 2430 bytes-rw-r--r--demos/embedded/digiflip/digiflip.cpp425
-rw-r--r--demos/embedded/digiflip/digiflip.pro1
-rw-r--r--demos/embedded/embedded.pro18
-rw-r--r--demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp2
-rw-r--r--demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro9
-rw-r--r--demos/embedded/flickable/flickable.cpp284
-rw-r--r--demos/embedded/flickable/flickable.h80
-rw-r--r--demos/embedded/flickable/flickable.pro2
-rw-r--r--demos/embedded/flickable/main.cpp233
-rw-r--r--demos/embedded/flightinfo/aircraft.pngbin0 -> 28713 bytes-rw-r--r--demos/embedded/flightinfo/flightinfo.cpp415
-rw-r--r--demos/embedded/flightinfo/flightinfo.pro12
-rw-r--r--demos/embedded/flightinfo/flightinfo.qrc5
-rw-r--r--demos/embedded/flightinfo/form.ui226
-rw-r--r--demos/embedded/fluidlauncher/config_s60/config.xml27
-rw-r--r--demos/embedded/fluidlauncher/fluidlauncher.cpp126
-rw-r--r--demos/embedded/fluidlauncher/fluidlauncher.h4
-rw-r--r--demos/embedded/fluidlauncher/fluidlauncher.pro95
-rw-r--r--demos/embedded/fluidlauncher/pictureflow.cpp339
-rw-r--r--demos/embedded/fluidlauncher/pictureflow.h37
-rw-r--r--demos/embedded/fluidlauncher/screenshots/anomaly_s60.pngbin0 -> 39093 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/context2d_s60.pngbin0 -> 39405 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/desktopservices_s60.pngbin0 -> 31757 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/digiflip.pngbin0 -> 3508 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/drilldown_s60.pngbin0 -> 47687 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/embeddedsvgviewer_s60.pngbin0 -> 29917 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/flickable.pngbin0 -> 21107 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/flightinfo_s60.pngbin0 -> 24473 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/fridgemagnets_s60.pngbin0 -> 39865 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/ftp_s60.pngbin0 -> 32534 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/lightmaps.pngbin0 -> 114178 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/raycasting.pngbin0 -> 43006 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/saxbookmarks_s60.pngbin0 -> 47182 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/softkeys_s60.pngbin0 -> 28562 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/styledemo_s60.pngbin0 -> 51957 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/weatherinfo.pngbin0 -> 38521 bytes-rw-r--r--demos/embedded/fluidlauncher/screenshots/wiggly_s60.pngbin0 -> 5549 bytes-rw-r--r--demos/embedded/lightmaps/lightmaps.cpp579
-rw-r--r--demos/embedded/lightmaps/lightmaps.pro10
-rw-r--r--demos/embedded/raycasting/raycasting.cpp310
-rw-r--r--demos/embedded/raycasting/raycasting.pro3
-rw-r--r--demos/embedded/raycasting/raycasting.qrc5
-rw-r--r--demos/embedded/raycasting/textures.pngbin0 -> 42319 bytes-rw-r--r--demos/embedded/styledemo/files/application.qss2
-rw-r--r--demos/embedded/styledemo/files/blue.qss3
-rw-r--r--demos/embedded/styledemo/files/khaki.qss3
-rw-r--r--demos/embedded/styledemo/files/transparent.qss1
-rw-r--r--demos/embedded/styledemo/styledemo.pro5
-rw-r--r--demos/embedded/styledemo/stylewidget.ui345
-rw-r--r--demos/embedded/weatherinfo/icons/README.txt5
-rw-r--r--demos/embedded/weatherinfo/icons/weather-few-clouds.svg738
-rw-r--r--demos/embedded/weatherinfo/icons/weather-fog.svg1585
-rw-r--r--demos/embedded/weatherinfo/icons/weather-haze.svg1121
-rw-r--r--demos/embedded/weatherinfo/icons/weather-icy.svg255
-rw-r--r--demos/embedded/weatherinfo/icons/weather-overcast.svg3036
-rw-r--r--demos/embedded/weatherinfo/icons/weather-showers.svg4753
-rw-r--r--demos/embedded/weatherinfo/icons/weather-sleet.svg5196
-rw-r--r--demos/embedded/weatherinfo/icons/weather-snow.svg1974
-rw-r--r--demos/embedded/weatherinfo/icons/weather-storm.svg4308
-rw-r--r--demos/embedded/weatherinfo/icons/weather-sunny-very-few-clouds.svg593
-rw-r--r--demos/embedded/weatherinfo/icons/weather-sunny.svg1330
-rw-r--r--demos/embedded/weatherinfo/icons/weather-thundershower.svg4587
-rw-r--r--demos/embedded/weatherinfo/weatherinfo.cpp511
-rw-r--r--demos/embedded/weatherinfo/weatherinfo.pro11
-rw-r--r--demos/embedded/weatherinfo/weatherinfo.qrc16
-rw-r--r--demos/embeddeddialogs/embeddeddialogs.pro2
-rw-r--r--demos/embeddeddialogs/main.cpp1
-rw-r--r--demos/gradients/gradients.pro2
-rw-r--r--demos/interview/interview.pro1
-rw-r--r--demos/macmainwindow/macmainwindow.pro2
-rw-r--r--demos/mainwindow/mainwindow.pro1
-rw-r--r--demos/mediaplayer/mediaplayer.pro5
-rw-r--r--demos/pathstroke/pathstroke.pro4
-rw-r--r--demos/qtdemo/colors.cpp31
-rw-r--r--demos/qtdemo/colors.h4
-rw-r--r--demos/qtdemo/mainwindow.cpp15
-rw-r--r--demos/qtdemo/qtdemo.pro4
-rw-r--r--demos/qtdemo/qtdemo.rc30
-rw-r--r--demos/qtdemo/xml/examples.xml23
-rw-r--r--demos/shared/shared.pri3
-rw-r--r--demos/shared/shared.pro5
-rw-r--r--demos/spreadsheet/spreadsheet.cpp2
-rw-r--r--demos/spreadsheet/spreadsheet.pro1
-rw-r--r--demos/sqlbrowser/sqlbrowser.pro2
-rw-r--r--demos/sub-attaq/animationmanager.cpp93
-rw-r--r--demos/sub-attaq/animationmanager.h70
-rw-r--r--demos/sub-attaq/boat.cpp318
-rw-r--r--demos/sub-attaq/boat.h101
-rw-r--r--demos/sub-attaq/boat_p.h256
-rw-r--r--demos/sub-attaq/bomb.cpp124
-rw-r--r--demos/sub-attaq/bomb.h75
-rw-r--r--demos/sub-attaq/custompropertyanimation.cpp108
-rw-r--r--demos/sub-attaq/custompropertyanimation.h114
-rw-r--r--demos/sub-attaq/data.xml39
-rw-r--r--demos/sub-attaq/graphicsscene.cpp377
-rw-r--r--demos/sub-attaq/graphicsscene.h133
-rw-r--r--demos/sub-attaq/main.cpp57
-rw-r--r--demos/sub-attaq/mainwindow.cpp97
-rw-r--r--demos/sub-attaq/mainwindow.h64
-rw-r--r--demos/sub-attaq/pics/big/background.pngbin0 -> 48858 bytes-rw-r--r--demos/sub-attaq/pics/big/boat.pngbin0 -> 5198 bytes-rw-r--r--demos/sub-attaq/pics/big/bomb.pngbin0 -> 760 bytes-rw-r--r--demos/sub-attaq/pics/big/explosion/boat/step1.pngbin0 -> 5760 bytes-rw-r--r--demos/sub-attaq/pics/big/explosion/boat/step2.pngbin0 -> 9976 bytes-rw-r--r--demos/sub-attaq/pics/big/explosion/boat/step3.pngbin0 -> 12411 bytes-rw-r--r--demos/sub-attaq/pics/big/explosion/boat/step4.pngbin0 -> 15438 bytes-rw-r--r--demos/sub-attaq/pics/big/explosion/submarine/step1.pngbin0 -> 3354 bytes-rw-r--r--demos/sub-attaq/pics/big/explosion/submarine/step2.pngbin0 -> 6205 bytes-rw-r--r--demos/sub-attaq/pics/big/explosion/submarine/step3.pngbin0 -> 6678 bytes-rw-r--r--demos/sub-attaq/pics/big/explosion/submarine/step4.pngbin0 -> 6666 bytes-rw-r--r--demos/sub-attaq/pics/big/submarine.pngbin0 -> 3202 bytes-rw-r--r--demos/sub-attaq/pics/big/surface.pngbin0 -> 575 bytes-rw-r--r--demos/sub-attaq/pics/big/torpedo.pngbin0 -> 951 bytes-rw-r--r--demos/sub-attaq/pics/scalable/background-n810.svg171
-rw-r--r--demos/sub-attaq/pics/scalable/background.svg171
-rw-r--r--demos/sub-attaq/pics/scalable/boat.svg279
-rw-r--r--demos/sub-attaq/pics/scalable/bomb.svg138
-rw-r--r--demos/sub-attaq/pics/scalable/sand.svg103
-rw-r--r--demos/sub-attaq/pics/scalable/see.svg44
-rw-r--r--demos/sub-attaq/pics/scalable/sky.svg45
-rw-r--r--demos/sub-attaq/pics/scalable/sub-attaq.svg1473
-rw-r--r--demos/sub-attaq/pics/scalable/submarine.svg214
-rw-r--r--demos/sub-attaq/pics/scalable/surface.svg49
-rw-r--r--demos/sub-attaq/pics/scalable/torpedo.svg127
-rw-r--r--demos/sub-attaq/pics/small/background.pngbin0 -> 34634 bytes-rw-r--r--demos/sub-attaq/pics/small/boat.pngbin0 -> 2394 bytes-rw-r--r--demos/sub-attaq/pics/small/bomb.pngbin0 -> 760 bytes-rw-r--r--demos/sub-attaq/pics/small/submarine.pngbin0 -> 1338 bytes-rw-r--r--demos/sub-attaq/pics/small/surface.pngbin0 -> 502 bytes-rw-r--r--demos/sub-attaq/pics/small/torpedo.pngbin0 -> 951 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-a.pngbin0 -> 5972 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-a2.pngbin0 -> 5969 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-b.pngbin0 -> 6869 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-dash.pngbin0 -> 2255 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-excl.pngbin0 -> 2740 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-q.pngbin0 -> 7016 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-s.pngbin0 -> 5817 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-t.pngbin0 -> 3717 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-t2.pngbin0 -> 3688 bytes-rw-r--r--demos/sub-attaq/pics/welcome/logo-u.pngbin0 -> 5374 bytes-rw-r--r--demos/sub-attaq/pixmapitem.cpp59
-rw-r--r--demos/sub-attaq/pixmapitem.h63
-rw-r--r--demos/sub-attaq/progressitem.cpp67
-rw-r--r--demos/sub-attaq/progressitem.h61
-rw-r--r--demos/sub-attaq/qanimationstate.cpp150
-rw-r--r--demos/sub-attaq/qanimationstate.h92
-rw-r--r--demos/sub-attaq/states.cpp342
-rw-r--r--demos/sub-attaq/states.h182
-rw-r--r--demos/sub-attaq/sub-attaq.pro43
-rw-r--r--demos/sub-attaq/subattaq.qrc39
-rw-r--r--demos/sub-attaq/submarine.cpp218
-rw-r--r--demos/sub-attaq/submarine.h96
-rw-r--r--demos/sub-attaq/submarine_p.h138
-rw-r--r--demos/sub-attaq/textinformationitem.cpp54
-rw-r--r--demos/sub-attaq/textinformationitem.h55
-rw-r--r--demos/sub-attaq/torpedo.cpp120
-rw-r--r--demos/sub-attaq/torpedo.h75
-rw-r--r--demos/symbianpkgrules.pri13
-rw-r--r--demos/textedit/textedit.cpp90
-rw-r--r--demos/textedit/textedit.pro1
-rw-r--r--demos/undo/undo.pro1
-rw-r--r--dist/README8
-rw-r--r--dist/changes-3.0.04
-rw-r--r--dist/changes-3.0.0-beta14
-rw-r--r--dist/changes-4.3.02
-rw-r--r--dist/changes-4.4.4-temple65
-rw-r--r--dist/changes-4.5.0-garden241
-rw-r--r--dist/changes-4.5.2-tower436
-rw-r--r--dist/changes-4.6.0121
-rw-r--r--doc/doc.pri11
-rw-r--r--doc/src/accelerators.qdoc137
-rw-r--r--doc/src/accessible.qdoc600
-rw-r--r--doc/src/activeqt-dumpcpp.qdoc143
-rw-r--r--doc/src/activeqt.qdoc88
-rw-r--r--doc/src/annotated.qdoc62
-rw-r--r--doc/src/appicon.qdoc226
-rw-r--r--doc/src/assistant-manual.qdoc810
-rw-r--r--doc/src/atomic-operations.qdoc89
-rw-r--r--doc/src/bughowto.qdoc9
-rw-r--r--doc/src/classes.qdoc124
-rw-r--r--doc/src/classes/exportedfunctions.qdoc141
-rw-r--r--doc/src/classes/phonon-api.qdoc5023
-rw-r--r--doc/src/classes/phonon-namespace.qdoc54
-rw-r--r--doc/src/classes/qpatternistdummy.cpp (renamed from doc/src/qpatternistdummy.cpp)0
-rw-r--r--doc/src/codecs.qdoc534
-rw-r--r--doc/src/commercialeditions.qdoc134
-rw-r--r--doc/src/compatclasses.qdoc54
-rw-r--r--doc/src/containers.qdoc775
-rw-r--r--doc/src/coordsys.qdoc486
-rw-r--r--doc/src/credits.qdoc1
-rw-r--r--doc/src/custom-types.qdoc178
-rw-r--r--doc/src/datastreamformat.qdoc320
-rw-r--r--doc/src/debug.qdoc256
-rw-r--r--doc/src/demos.qdoc151
-rw-r--r--doc/src/demos/qtdemo.qdoc (renamed from doc/src/qtdemo.qdoc)0
-rw-r--r--doc/src/demos/sub-attaq.qdoc54
-rw-r--r--doc/src/deployment.qdoc1476
-rw-r--r--doc/src/deployment/deployment-plugins.qdoc236
-rw-r--r--doc/src/deployment/deployment.qdoc1474
-rw-r--r--doc/src/deployment/qt-conf.qdoc135
-rw-r--r--doc/src/deployment/qtconfig.qdoc (renamed from doc/src/qtconfig.qdoc)0
-rw-r--r--doc/src/designer-manual.qdoc2742
-rw-r--r--doc/src/desktop-integration.qdoc90
-rw-r--r--doc/src/developing-on-mac.qdoc254
-rw-r--r--doc/src/development/activeqt-dumpcpp.qdoc143
-rw-r--r--doc/src/development/activeqt-dumpdoc.qdoc (renamed from doc/src/activeqt-dumpdoc.qdoc)0
-rw-r--r--doc/src/development/activeqt-idc.qdoc (renamed from doc/src/activeqt-idc.qdoc)0
-rw-r--r--doc/src/development/activeqt-testcon.qdoc (renamed from doc/src/activeqt-testcon.qdoc)0
-rw-r--r--doc/src/development/assistant-manual.qdoc810
-rw-r--r--doc/src/development/debug.qdoc243
-rw-r--r--doc/src/development/designer-manual.qdoc2836
-rw-r--r--doc/src/development/developing-on-mac.qdoc271
-rw-r--r--doc/src/development/developing-with-qt.qdoc74
-rw-r--r--doc/src/development/moc.qdoc335
-rw-r--r--doc/src/development/qmake-manual.qdoc4722
-rw-r--r--doc/src/development/qmsdev.qdoc166
-rw-r--r--doc/src/development/qtestlib.qdoc778
-rw-r--r--doc/src/development/rcc.qdoc95
-rw-r--r--doc/src/development/tools-list.qdoc84
-rw-r--r--doc/src/development/uic.qdoc88
-rw-r--r--doc/src/diagrams/animations-architecture.svg351
-rw-r--r--doc/src/diagrams/dbus-examples.pngbin0 -> 19642 bytes-rw-r--r--doc/src/diagrams/dependencies.lout59
-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-dockwidget.txt (renamed from doc/src/diagrams/designer-adding-dockwidget.txt)0
-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-dockwidget1.png (renamed from doc/src/diagrams/designer-adding-dockwidget1.png)bin8897 -> 8897 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-dockwidget1.zip (renamed from doc/src/diagrams/designer-adding-dockwidget1.zip)bin12252 -> 12252 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-menu-action1.png (renamed from doc/src/diagrams/designer-adding-menu-action1.png)bin16173 -> 16173 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-menu-action1.zip (renamed from doc/src/diagrams/designer-adding-menu-action1.zip)bin19245 -> 19245 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-menu-action2.zip (renamed from doc/src/diagrams/designer-adding-menu-action2.zip)bin19587 -> 19587 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-toolbar-action1.png (renamed from doc/src/diagrams/designer-adding-toolbar-action1.png)bin14911 -> 14911 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-toolbar-action1.zip (renamed from doc/src/diagrams/designer-adding-toolbar-action1.zip)bin17515 -> 17515 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-adding-toolbar-action2.zip (renamed from doc/src/diagrams/designer-adding-toolbar-action2.zip)bin15433 -> 15433 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-dynamic-property.png (renamed from doc/src/diagrams/designer-creating-dynamic-property.png)bin7561 -> 7561 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu-entry1.png (renamed from doc/src/diagrams/designer-creating-menu-entry1.png)bin9618 -> 9618 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu-entry1.zip (renamed from doc/src/diagrams/designer-creating-menu-entry1.zip)bin11753 -> 11753 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu-entry2.png (renamed from doc/src/diagrams/designer-creating-menu-entry2.png)bin9090 -> 9090 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu-entry2.zip (renamed from doc/src/diagrams/designer-creating-menu-entry2.zip)bin11709 -> 11709 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu-entry3.png (renamed from doc/src/diagrams/designer-creating-menu-entry3.png)bin5435 -> 5435 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu-entry3.zip (renamed from doc/src/diagrams/designer-creating-menu-entry3.zip)bin11520 -> 11520 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu-entry4.png (renamed from doc/src/diagrams/designer-creating-menu-entry4.png)bin10141 -> 10141 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu-entry4.zip (renamed from doc/src/diagrams/designer-creating-menu-entry4.zip)bin12473 -> 12473 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu.txt (renamed from doc/src/diagrams/designer-creating-menu.txt)0
-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu1.png (renamed from doc/src/diagrams/designer-creating-menu1.png)bin4733 -> 4733 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu1.zip (renamed from doc/src/diagrams/designer-creating-menu1.zip)bin5279 -> 5279 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu2.png (renamed from doc/src/diagrams/designer-creating-menu2.png)bin4296 -> 4296 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu2.zip (renamed from doc/src/diagrams/designer-creating-menu2.zip)bin5295 -> 5295 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu3.png (renamed from doc/src/diagrams/designer-creating-menu3.png)bin5053 -> 5053 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu3.zip (renamed from doc/src/diagrams/designer-creating-menu3.zip)bin6197 -> 6197 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menu4.png (renamed from doc/src/diagrams/designer-creating-menu4.png)bin5274 -> 5274 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menubar.png (renamed from doc/src/diagrams/designer-creating-menubar.png)bin7024 -> 7024 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-creating-menubar.zip (renamed from doc/src/diagrams/designer-creating-menubar.zip)bin10485 -> 10485 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-edit-resource.zip (renamed from doc/src/diagrams/designer-edit-resource.zip)bin11195 -> 11195 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-find-icon.zip (renamed from doc/src/diagrams/designer-find-icon.zip)bin47820 -> 47820 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-form-layoutfunction-crop.png (renamed from doc/src/diagrams/designer-form-layoutfunction-crop.png)bin5132 -> 5132 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-form-layoutfunction.png (renamed from doc/src/diagrams/designer-form-layoutfunction.png)bin15912 -> 15912 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-form-layoutfunction.zip (renamed from doc/src/diagrams/designer-form-layoutfunction.zip)bin21179 -> 21179 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-main-window.zip (renamed from doc/src/diagrams/designer-main-window.zip)bin35959 -> 35959 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-mainwindow-actions.ui (renamed from doc/src/diagrams/designer-mainwindow-actions.ui)0
-rw-r--r--doc/src/diagrams/designer-manual/designer-palette-brush-editor.zip (renamed from doc/src/diagrams/designer-palette-brush-editor.zip)bin17703 -> 17703 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-palette-editor.zip (renamed from doc/src/diagrams/designer-palette-editor.zip)bin30588 -> 30588 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-palette-gradient-editor.zip (renamed from doc/src/diagrams/designer-palette-gradient-editor.zip)bin55456 -> 55456 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-palette-pattern-editor.zip (renamed from doc/src/diagrams/designer-palette-pattern-editor.zip)bin15845 -> 15845 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-resource-editor.zip (renamed from doc/src/diagrams/designer-resource-editor.zip)bin12287 -> 12287 bytes-rw-r--r--doc/src/diagrams/designer-manual/designer-widget-box.zip (renamed from doc/src/diagrams/designer-widget-box.zip)bin30530 -> 30530 bytes-rw-r--r--doc/src/diagrams/designer-manual/rgbController.ui212
-rw-r--r--doc/src/diagrams/programs/easingcurve/easingcurve.pro13
-rw-r--r--doc/src/diagrams/programs/easingcurve/main.cpp125
-rw-r--r--doc/src/diagrams/x11_dependencies.sk1542
-rw-r--r--doc/src/distributingqt.qdoc154
-rw-r--r--doc/src/dnd.qdoc543
-rw-r--r--doc/src/ecmascript.qdoc313
-rw-r--r--doc/src/editions.qdoc76
-rw-r--r--doc/src/emb-charinput.qdoc126
-rw-r--r--doc/src/emb-crosscompiling.qdoc191
-rw-r--r--doc/src/emb-deployment.qdoc111
-rw-r--r--doc/src/emb-install.qdoc197
-rw-r--r--doc/src/emb-pointer.qdoc216
-rw-r--r--doc/src/emb-running.qdoc210
-rw-r--r--doc/src/eventsandfilters.qdoc221
-rw-r--r--doc/src/examples-overview.qdoc348
-rw-r--r--doc/src/examples.qdoc410
-rw-r--r--doc/src/examples/application.qdoc18
-rw-r--r--doc/src/examples/arrowpad.qdoc8
-rw-r--r--doc/src/examples/audiodevices.qdoc54
-rw-r--r--doc/src/examples/audioinput.qdoc54
-rw-r--r--doc/src/examples/audiooutput.qdoc52
-rw-r--r--doc/src/examples/basicgraphicslayouts.qdoc55
-rw-r--r--doc/src/examples/calculatorform.qdoc6
-rw-r--r--doc/src/examples/collidingmice-example.qdoc4
-rw-r--r--doc/src/examples/completer.qdoc16
-rw-r--r--doc/src/examples/contiguouscache.qdoc97
-rw-r--r--doc/src/examples/diagramscene.qdoc7
-rw-r--r--doc/src/examples/drilldown.qdoc4
-rw-r--r--doc/src/examples/eventtransitions.qdoc86
-rw-r--r--doc/src/examples/factorial.qdoc102
-rw-r--r--doc/src/examples/helloscript.qdoc12
-rw-r--r--doc/src/examples/hellotr.qdoc26
-rw-r--r--doc/src/examples/htmlinfo.qdoc89
-rw-r--r--doc/src/examples/inputpanel.qdoc238
-rw-r--r--doc/src/examples/moveblocks.qdoc228
-rw-r--r--doc/src/examples/multipleinheritance.qdoc2
-rw-r--r--doc/src/examples/overpainting.qdoc7
-rw-r--r--doc/src/examples/pingpong.qdoc107
-rw-r--r--doc/src/examples/qtscriptcalculator.qdoc7
-rw-r--r--doc/src/examples/qtscripttetrix.qdoc2
-rw-r--r--doc/src/examples/qxmlstreambookmarks.qdoc41
-rw-r--r--doc/src/examples/rogue.qdoc222
-rw-r--r--doc/src/examples/schema.qdoc143
-rw-r--r--doc/src/examples/scribble.qdoc2
-rw-r--r--doc/src/examples/simpletextviewer.qdoc7
-rw-r--r--doc/src/examples/stickman.qdoc115
-rw-r--r--doc/src/examples/svggenerator.qdoc4
-rw-r--r--doc/src/examples/tablet.qdoc5
-rw-r--r--doc/src/examples/textfinder.qdoc4
-rw-r--r--doc/src/examples/trafficinfo.qdoc2
-rw-r--r--doc/src/examples/trafficlight.qdoc99
-rw-r--r--doc/src/examples/transformations.qdoc6
-rw-r--r--doc/src/examples/twowaybutton.qdoc82
-rw-r--r--doc/src/examples/videographicsitem.qdoc52
-rw-r--r--doc/src/examples/videowidget.qdoc187
-rw-r--r--doc/src/examples/worldtimeclockbuilder.qdoc2
-rw-r--r--doc/src/exceptionsafety.qdoc156
-rw-r--r--doc/src/exportedfunctions.qdoc136
-rw-r--r--doc/src/external-resources.qdoc10
-rw-r--r--doc/src/files-and-resources/datastreamformat.qdoc363
-rw-r--r--doc/src/files-and-resources/resources.qdoc203
-rw-r--r--doc/src/focus.qdoc213
-rw-r--r--doc/src/frameworks-technologies/accessible.qdoc624
-rw-r--r--doc/src/frameworks-technologies/activeqt-container.qdoc218
-rw-r--r--doc/src/frameworks-technologies/activeqt-server.qdoc856
-rw-r--r--doc/src/frameworks-technologies/activeqt.qdoc100
-rw-r--r--doc/src/frameworks-technologies/animation.qdoc377
-rw-r--r--doc/src/frameworks-technologies/containers.qdoc810
-rw-r--r--doc/src/frameworks-technologies/dbus-adaptors.qdoc494
-rw-r--r--doc/src/frameworks-technologies/dbus-intro.qdoc229
-rw-r--r--doc/src/frameworks-technologies/desktop-integration.qdoc111
-rw-r--r--doc/src/frameworks-technologies/dnd.qdoc449
-rw-r--r--doc/src/frameworks-technologies/eventsandfilters.qdoc235
-rw-r--r--doc/src/frameworks-technologies/gestures.qdoc170
-rw-r--r--doc/src/frameworks-technologies/graphicsview.qdoc574
-rw-r--r--doc/src/frameworks-technologies/implicit-sharing.qdoc152
-rw-r--r--doc/src/frameworks-technologies/ipc.qdoc89
-rw-r--r--doc/src/frameworks-technologies/model-view-programming.qdoc2498
-rw-r--r--doc/src/frameworks-technologies/phonon.qdoc558
-rw-r--r--doc/src/frameworks-technologies/plugins-howto.qdoc311
-rw-r--r--doc/src/frameworks-technologies/qthelp.qdoc382
-rw-r--r--doc/src/frameworks-technologies/qundo.qdoc113
-rw-r--r--doc/src/frameworks-technologies/richtext.qdoc1226
-rw-r--r--doc/src/frameworks-technologies/statemachine.qdoc548
-rw-r--r--doc/src/frameworks-technologies/templates.qdoc229
-rw-r--r--doc/src/frameworks-technologies/threads.qdoc700
-rw-r--r--doc/src/frameworks-technologies/unicode.qdoc182
-rw-r--r--doc/src/functions.qdoc63
-rw-r--r--doc/src/gallery.qdoc151
-rw-r--r--doc/src/geometry.qdoc150
-rw-r--r--doc/src/getting-started/demos.qdoc166
-rw-r--r--doc/src/getting-started/examples.qdoc1115
-rw-r--r--doc/src/getting-started/how-to-learn-qt.qdoc118
-rw-r--r--doc/src/getting-started/installation.qdoc985
-rw-r--r--doc/src/getting-started/known-issues.qdoc174
-rw-r--r--doc/src/getting-started/tutorials.qdoc103
-rw-r--r--doc/src/graphicsview.qdoc544
-rw-r--r--doc/src/groups.qdoc599
-rw-r--r--doc/src/guibooks.qdoc121
-rw-r--r--doc/src/hierarchy.qdoc52
-rw-r--r--doc/src/how-to-learn-qt.qdoc115
-rw-r--r--doc/src/howtos/accelerators.qdoc138
-rw-r--r--doc/src/howtos/appicon.qdoc230
-rw-r--r--doc/src/howtos/custom-types.qdoc179
-rw-r--r--doc/src/howtos/guibooks.qdoc120
-rw-r--r--doc/src/howtos/openvg.qdoc322
-rw-r--r--doc/src/howtos/qtdesigner.qdoc144
-rw-r--r--doc/src/howtos/restoring-geometry.qdoc82
-rw-r--r--doc/src/howtos/session.qdoc178
-rw-r--r--doc/src/howtos/sharedlibrary.qdoc176
-rw-r--r--doc/src/howtos/timers.qdoc137
-rw-r--r--doc/src/howtos/unix-signal-handlers.qdoc105
-rw-r--r--doc/src/i18n.qdoc508
-rw-r--r--doc/src/images/activeqt-examples.pngbin0 -> 6671 bytes-rw-r--r--doc/src/images/animation-examples.pngbin0 -> 28060 bytes-rw-r--r--doc/src/images/animations-architecture.pngbin0 -> 27619 bytes-rw-r--r--doc/src/images/checkboxes-exclusive.pngbin0 -> 5079 bytes-rw-r--r--doc/src/images/checkboxes-non-exclusive.pngbin0 -> 5614 bytes-rw-r--r--doc/src/images/dbus-examples.pngbin0 -> 6181 bytes-rw-r--r--doc/src/images/factorial-example.pngbin0 -> 4032 bytes-rw-r--r--doc/src/images/gestures.pngbin0 -> 178365 bytes-rw-r--r--doc/src/images/graphicseffect-blur.pngbin0 -> 41433 bytes-rw-r--r--doc/src/images/graphicseffect-colorize.pngbin0 -> 35062 bytes-rw-r--r--doc/src/images/graphicseffect-drop-shadow.pngbin0 -> 38770 bytes-rw-r--r--doc/src/images/graphicseffect-effects.pngbin0 -> 112462 bytes-rw-r--r--doc/src/images/graphicseffect-grayscale.pngbin0 -> 35056 bytes-rw-r--r--doc/src/images/graphicseffect-opacity.pngbin0 -> 33879 bytes-rw-r--r--doc/src/images/graphicseffect-pixelize.pngbin0 -> 23577 bytes-rw-r--r--doc/src/images/graphicseffect-widget.pngbin0 -> 16693 bytes-rw-r--r--doc/src/images/inputpanel-example.pngbin0 -> 7899 bytes-rw-r--r--doc/src/images/ipc-examples.pngbin0 -> 7727 bytes-rw-r--r--doc/src/images/move-blocks-chart.pngbin0 -> 15740 bytes-rw-r--r--doc/src/images/moveblocks-example.pngbin0 -> 4532 bytes-rw-r--r--doc/src/images/pingpong-example.pngbin0 -> 7843 bytes-rw-r--r--doc/src/images/qeasingcurve-cosinecurve.pngbin0 -> 3419 bytes-rw-r--r--doc/src/images/qeasingcurve-inback.pngbin0 -> 2808 bytes-rw-r--r--doc/src/images/qeasingcurve-inbounce.pngbin0 -> 3154 bytes-rw-r--r--doc/src/images/qeasingcurve-incirc.pngbin0 -> 2605 bytes-rw-r--r--doc/src/images/qeasingcurve-incubic.pngbin0 -> 2722 bytes-rw-r--r--doc/src/images/qeasingcurve-incurve.pngbin0 -> 2692 bytes-rw-r--r--doc/src/images/qeasingcurve-inelastic.pngbin0 -> 3304 bytes-rw-r--r--doc/src/images/qeasingcurve-inexpo.pngbin0 -> 2675 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutback.pngbin0 -> 3241 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutbounce.pngbin0 -> 3386 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutcirc.pngbin0 -> 2843 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutcubic.pngbin0 -> 2931 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutelastic.pngbin0 -> 3461 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutexpo.pngbin0 -> 3004 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutquad.pngbin0 -> 2893 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutquart.pngbin0 -> 2925 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutquint.pngbin0 -> 2823 bytes-rw-r--r--doc/src/images/qeasingcurve-inoutsine.pngbin0 -> 2891 bytes-rw-r--r--doc/src/images/qeasingcurve-inquad.pngbin0 -> 2733 bytes-rw-r--r--doc/src/images/qeasingcurve-inquart.pngbin0 -> 2727 bytes-rw-r--r--doc/src/images/qeasingcurve-inquint.pngbin0 -> 2630 bytes-rw-r--r--doc/src/images/qeasingcurve-insine.pngbin0 -> 2567 bytes-rw-r--r--doc/src/images/qeasingcurve-linear.pngbin0 -> 2318 bytes-rw-r--r--doc/src/images/qeasingcurve-outback.pngbin0 -> 2852 bytes-rw-r--r--doc/src/images/qeasingcurve-outbounce.pngbin0 -> 3360 bytes-rw-r--r--doc/src/images/qeasingcurve-outcirc.pngbin0 -> 2796 bytes-rw-r--r--doc/src/images/qeasingcurve-outcubic.pngbin0 -> 2792 bytes-rw-r--r--doc/src/images/qeasingcurve-outcurve.pngbin0 -> 2724 bytes-rw-r--r--doc/src/images/qeasingcurve-outelastic.pngbin0 -> 3423 bytes-rw-r--r--doc/src/images/qeasingcurve-outexpo.pngbin0 -> 2803 bytes-rw-r--r--doc/src/images/qeasingcurve-outinback.pngbin0 -> 3026 bytes-rw-r--r--doc/src/images/qeasingcurve-outinbounce.pngbin0 -> 3629 bytes-rw-r--r--doc/src/images/qeasingcurve-outincirc.pngbin0 -> 2822 bytes-rw-r--r--doc/src/images/qeasingcurve-outincubic.pngbin0 -> 2872 bytes-rw-r--r--doc/src/images/qeasingcurve-outinelastic.pngbin0 -> 3941 bytes-rw-r--r--doc/src/images/qeasingcurve-outinexpo.pngbin0 -> 2923 bytes-rw-r--r--doc/src/images/qeasingcurve-outinquad.pngbin0 -> 2858 bytes-rw-r--r--doc/src/images/qeasingcurve-outinquart.pngbin0 -> 2830 bytes-rw-r--r--doc/src/images/qeasingcurve-outinquint.pngbin0 -> 2724 bytes-rw-r--r--doc/src/images/qeasingcurve-outinsine.pngbin0 -> 2817 bytes-rw-r--r--doc/src/images/qeasingcurve-outquad.pngbin0 -> 2760 bytes-rw-r--r--doc/src/images/qeasingcurve-outquart.pngbin0 -> 2764 bytes-rw-r--r--doc/src/images/qeasingcurve-outquint.pngbin0 -> 2687 bytes-rw-r--r--doc/src/images/qeasingcurve-outsine.pngbin0 -> 2773 bytes-rw-r--r--doc/src/images/qeasingcurve-sinecurve.pngbin0 -> 3329 bytes-rw-r--r--doc/src/images/qq-thumbnail.pngbin0 -> 27022 bytes-rw-r--r--doc/src/images/rogue-example.pngbin0 -> 10364 bytes-rw-r--r--doc/src/images/rogue-statechart.pngbin0 -> 2490 bytes-rw-r--r--doc/src/images/schema-example.pngbin0 -> 84320 bytes-rw-r--r--doc/src/images/statemachine-button-history.pngbin0 -> 8493 bytes-rw-r--r--doc/src/images/statemachine-button-nested.pngbin0 -> 7051 bytes-rw-r--r--doc/src/images/statemachine-button.pngbin0 -> 4233 bytes-rw-r--r--doc/src/images/statemachine-customevents.pngbin0 -> 2544 bytes-rw-r--r--doc/src/images/statemachine-customevents2.pngbin0 -> 6713 bytes-rw-r--r--doc/src/images/statemachine-examples.pngbin0 -> 3326 bytes-rw-r--r--doc/src/images/statemachine-finished.pngbin0 -> 5518 bytes-rw-r--r--doc/src/images/statemachine-nonparallel.pngbin0 -> 5350 bytes-rw-r--r--doc/src/images/statemachine-parallel.pngbin0 -> 8631 bytes-rw-r--r--doc/src/images/stickman-example.pngbin0 -> 18867 bytes-rw-r--r--doc/src/images/stickman-example1.pngbin0 -> 64543 bytes-rw-r--r--doc/src/images/stickman-example2.pngbin0 -> 37412 bytes-rw-r--r--doc/src/images/stickman-example3.pngbin0 -> 23591 bytes-rw-r--r--doc/src/images/sub-attaq-demo.pngbin0 -> 51552 bytes-rw-r--r--doc/src/images/tankgame-example.pngbin0 -> 16089 bytes-rw-r--r--doc/src/images/trafficlight-example.pngbin0 -> 5325 bytes-rw-r--r--doc/src/images/trafficlight-example1.pngbin0 -> 3694 bytes-rw-r--r--doc/src/images/trafficlight-example2.pngbin0 -> 7257 bytes-rw-r--r--doc/src/images/video-videographicsitem.pngbin0 -> 54436 bytes-rw-r--r--doc/src/images/video-videowidget.pngbin0 -> 54199 bytes-rw-r--r--doc/src/images/webkit-examples.pngbin26874 -> 19323 bytes-rw-r--r--doc/src/images/whatsnewanimatedtiles.pngbin0 -> 168909 bytes-rw-r--r--doc/src/images/x11_dependencies.pngbin93480 -> 68043 bytes-rw-r--r--doc/src/index.qdoc206
-rw-r--r--doc/src/installation.qdoc757
-rw-r--r--doc/src/internationalization/i18n.qdoc515
-rw-r--r--doc/src/internationalization/linguist-manual.qdoc1512
-rw-r--r--doc/src/introtodbus.qdoc212
-rw-r--r--doc/src/ipc.qdoc91
-rw-r--r--doc/src/known-issues.qdoc143
-rw-r--r--doc/src/layout.qdoc385
-rw-r--r--doc/src/legal/3rdparty.qdoc (renamed from doc/src/3rdparty.qdoc)0
-rw-r--r--doc/src/legal/commercialeditions.qdoc138
-rw-r--r--doc/src/legal/editions.qdoc64
-rw-r--r--doc/src/legal/gpl.qdoc (renamed from doc/src/gpl.qdoc)0
-rw-r--r--doc/src/legal/licenses.qdoc495
-rw-r--r--doc/src/legal/opensourceedition.qdoc (renamed from doc/src/opensourceedition.qdoc)0
-rw-r--r--doc/src/legal/trademarks.qdoc (renamed from doc/src/trademarks.qdoc)0
-rw-r--r--doc/src/licenses.qdoc483
-rw-r--r--doc/src/linguist-manual.qdoc1513
-rw-r--r--doc/src/mac-differences.qdoc339
-rw-r--r--doc/src/mainclasses.qdoc51
-rw-r--r--doc/src/metaobjects.qdoc149
-rw-r--r--doc/src/moc.qdoc336
-rw-r--r--doc/src/model-view-programming.qdoc2447
-rw-r--r--doc/src/modules.qdoc961
-rw-r--r--doc/src/network-programming/qtnetwork.qdoc330
-rw-r--r--doc/src/network-programming/ssl.qdoc93
-rw-r--r--doc/src/object.qdoc132
-rw-r--r--doc/src/objectmodel/metaobjects.qdoc148
-rw-r--r--doc/src/objectmodel/object.qdoc139
-rw-r--r--doc/src/objectmodel/objecttrees.qdoc115
-rw-r--r--doc/src/objectmodel/properties.qdoc278
-rw-r--r--doc/src/objectmodel/signalsandslots.qdoc421
-rw-r--r--doc/src/objecttrees.qdoc117
-rw-r--r--doc/src/overviews.qdoc25
-rw-r--r--doc/src/painting-and-printing/coordsys.qdoc477
-rw-r--r--doc/src/painting-and-printing/paintsystem.qdoc570
-rw-r--r--doc/src/painting-and-printing/printing.qdoc191
-rw-r--r--doc/src/paintsystem.qdoc485
-rw-r--r--doc/src/phonon-api.qdoc4998
-rw-r--r--doc/src/phonon.qdoc643
-rw-r--r--doc/src/platform-notes.qdoc738
-rw-r--r--doc/src/platforms/atomic-operations.qdoc90
-rw-r--r--doc/src/platforms/compiler-notes.qdoc278
-rw-r--r--doc/src/platforms/emb-accel.qdoc (renamed from doc/src/emb-accel.qdoc)0
-rw-r--r--doc/src/platforms/emb-architecture.qdoc (renamed from doc/src/qtopiacore-architecture.qdoc)0
-rw-r--r--doc/src/platforms/emb-charinput.qdoc164
-rw-r--r--doc/src/platforms/emb-crosscompiling.qdoc185
-rw-r--r--doc/src/platforms/emb-deployment.qdoc111
-rw-r--r--doc/src/platforms/emb-differences.qdoc (renamed from doc/src/emb-differences.qdoc)0
-rw-r--r--doc/src/platforms/emb-displaymanagement.qdoc205
-rw-r--r--doc/src/platforms/emb-envvars.qdoc (renamed from doc/src/emb-envvars.qdoc)0
-rw-r--r--doc/src/platforms/emb-features.qdoc (renamed from doc/src/emb-features.qdoc)0
-rw-r--r--doc/src/platforms/emb-fonts.qdoc (renamed from doc/src/emb-fonts.qdoc)0
-rw-r--r--doc/src/platforms/emb-framebuffer-howto.qdoc (renamed from doc/src/emb-framebuffer-howto.qdoc)0
-rw-r--r--doc/src/platforms/emb-install.qdoc197
-rw-r--r--doc/src/platforms/emb-kmap2qmap.qdoc84
-rw-r--r--doc/src/platforms/emb-makeqpf.qdoc (renamed from doc/src/emb-makeqpf.qdoc)0
-rw-r--r--doc/src/platforms/emb-opengl.qdoc (renamed from doc/src/qtopiacore-opengl.qdoc)0
-rw-r--r--doc/src/platforms/emb-performance.qdoc (renamed from doc/src/emb-performance.qdoc)0
-rw-r--r--doc/src/platforms/emb-pointer.qdoc209
-rw-r--r--doc/src/platforms/emb-porting.qdoc (renamed from doc/src/emb-porting.qdoc)0
-rw-r--r--doc/src/platforms/emb-qvfb.qdoc (renamed from doc/src/emb-qvfb.qdoc)0
-rw-r--r--doc/src/platforms/emb-running.qdoc210
-rw-r--r--doc/src/platforms/emb-vnc.qdoc (renamed from doc/src/emb-vnc.qdoc)0
-rw-r--r--doc/src/platforms/mac-differences.qdoc339
-rw-r--r--doc/src/platforms/platform-notes-rtos.qdoc220
-rw-r--r--doc/src/platforms/platform-notes.qdoc425
-rw-r--r--doc/src/platforms/qt-embedded-linux.qdoc126
-rw-r--r--doc/src/platforms/qt-embedded.qdoc76
-rw-r--r--doc/src/platforms/qtmac-as-native.qdoc159
-rw-r--r--doc/src/platforms/supported-platforms.qdoc141
-rw-r--r--doc/src/platforms/wince-customization.qdoc (renamed from doc/src/wince-customization.qdoc)0
-rw-r--r--doc/src/platforms/wince-introduction.qdoc145
-rw-r--r--doc/src/platforms/wince-opengl.qdoc (renamed from doc/src/wince-opengl.qdoc)0
-rw-r--r--doc/src/platforms/winsystem.qdoc98
-rw-r--r--doc/src/platforms/x11overlays.qdoc98
-rw-r--r--doc/src/plugins-howto.qdoc471
-rw-r--r--doc/src/porting/porting-qsa.qdoc (renamed from doc/src/porting-qsa.qdoc)0
-rw-r--r--doc/src/porting/porting4-canvas.qdoc702
-rw-r--r--doc/src/porting/porting4-designer.qdoc349
-rw-r--r--doc/src/porting/porting4-dnd.qdoc152
-rw-r--r--doc/src/porting/porting4-modifiedvirtual.qdocinc (renamed from doc/src/porting4-modifiedvirtual.qdocinc)0
-rw-r--r--doc/src/porting/porting4-obsoletedmechanism.qdocinc3
-rw-r--r--doc/src/porting/porting4-overview.qdoc373
-rw-r--r--doc/src/porting/porting4-removedenumvalues.qdocinc (renamed from doc/src/porting4-removedenumvalues.qdocinc)0
-rw-r--r--doc/src/porting/porting4-removedtypes.qdocinc (renamed from doc/src/porting4-removedtypes.qdocinc)0
-rw-r--r--doc/src/porting/porting4-removedvariantfunctions.qdocinc (renamed from doc/src/porting4-removedvariantfunctions.qdocinc)0
-rw-r--r--doc/src/porting/porting4-removedvirtual.qdocinc (renamed from doc/src/porting4-removedvirtual.qdocinc)0
-rw-r--r--doc/src/porting/porting4-renamedclasses.qdocinc (renamed from doc/src/porting4-renamedclasses.qdocinc)0
-rw-r--r--doc/src/porting/porting4-renamedenumvalues.qdocinc (renamed from doc/src/porting4-renamedenumvalues.qdocinc)0
-rw-r--r--doc/src/porting/porting4-renamedfunctions.qdocinc (renamed from doc/src/porting4-renamedfunctions.qdocinc)0
-rw-r--r--doc/src/porting/porting4-renamedstatic.qdocinc (renamed from doc/src/porting4-renamedstatic.qdocinc)0
-rw-r--r--doc/src/porting/porting4-renamedtypes.qdocinc (renamed from doc/src/porting4-renamedtypes.qdocinc)0
-rw-r--r--doc/src/porting/porting4.qdoc4244
-rw-r--r--doc/src/porting/qt3to4.qdoc179
-rw-r--r--doc/src/porting/qt4-accessibility.qdoc162
-rw-r--r--doc/src/porting/qt4-arthur.qdoc (renamed from doc/src/qt4-arthur.qdoc)0
-rw-r--r--doc/src/porting/qt4-designer.qdoc (renamed from doc/src/qt4-designer.qdoc)0
-rw-r--r--doc/src/porting/qt4-interview.qdoc (renamed from doc/src/qt4-interview.qdoc)0
-rw-r--r--doc/src/porting/qt4-mainwindow.qdoc (renamed from doc/src/qt4-mainwindow.qdoc)0
-rw-r--r--doc/src/porting/qt4-network.qdoc243
-rw-r--r--doc/src/porting/qt4-scribe.qdoc (renamed from doc/src/qt4-scribe.qdoc)0
-rw-r--r--doc/src/porting/qt4-sql.qdoc (renamed from doc/src/qt4-sql.qdoc)0
-rw-r--r--doc/src/porting/qt4-styles.qdoc (renamed from doc/src/qt4-styles.qdoc)0
-rw-r--r--doc/src/porting/qt4-threads.qdoc (renamed from doc/src/qt4-threads.qdoc)0
-rw-r--r--doc/src/porting/qt4-tulip.qdoc (renamed from doc/src/qt4-tulip.qdoc)0
-rw-r--r--doc/src/porting4-canvas.qdoc703
-rw-r--r--doc/src/porting4-designer.qdoc349
-rw-r--r--doc/src/porting4-obsoletedmechanism.qdocinc3
-rw-r--r--doc/src/porting4-overview.qdoc373
-rw-r--r--doc/src/porting4.qdoc4216
-rw-r--r--doc/src/printing.qdoc175
-rw-r--r--doc/src/properties.qdoc268
-rw-r--r--doc/src/q3popupmenu.qdoc76
-rw-r--r--doc/src/qalgorithms.qdoc651
-rw-r--r--doc/src/qaxcontainer.qdoc260
-rw-r--r--doc/src/qaxserver.qdoc898
-rw-r--r--doc/src/qcache.qdoc244
-rw-r--r--doc/src/qcolormap.qdoc152
-rw-r--r--doc/src/qdbusadaptors.qdoc478
-rw-r--r--doc/src/qdesktopwidget.qdoc247
-rw-r--r--doc/src/qmake-manual.qdoc4209
-rw-r--r--doc/src/qmsdev.qdoc166
-rw-r--r--doc/src/qnamespace.qdoc2663
-rw-r--r--doc/src/qpagesetupdialog.qdoc84
-rw-r--r--doc/src/qpaintdevice.qdoc289
-rw-r--r--doc/src/qprinterinfo.qdoc137
-rw-r--r--doc/src/qset.qdoc943
-rw-r--r--doc/src/qsizepolicy.qdoc522
-rw-r--r--doc/src/qsql.qdoc138
-rw-r--r--doc/src/qsqldatatype-table.qdoc584
-rw-r--r--doc/src/qt-conf.qdoc136
-rw-r--r--doc/src/qt-embedded.qdoc76
-rw-r--r--doc/src/qt-webpages.qdoc245
-rw-r--r--doc/src/qt3support.qdoc81
-rw-r--r--doc/src/qt3to4.qdoc179
-rw-r--r--doc/src/qt4-accessibility.qdoc163
-rw-r--r--doc/src/qt4-intro.qdoc177
-rw-r--r--doc/src/qt4-network.qdoc243
-rw-r--r--doc/src/qtassistant.qdoc54
-rw-r--r--doc/src/qtcore.qdoc60
-rw-r--r--doc/src/qtdbus.qdoc84
-rw-r--r--doc/src/qtdesigner.qdoc1541
-rw-r--r--doc/src/qtendian.qdoc168
-rw-r--r--doc/src/qtestlib.qdoc779
-rw-r--r--doc/src/qtgui.qdoc59
-rw-r--r--doc/src/qthelp.qdoc408
-rw-r--r--doc/src/qtmac-as-native.qdoc159
-rw-r--r--doc/src/qtmain.qdoc93
-rw-r--r--doc/src/qtnetwork.qdoc358
-rw-r--r--doc/src/qtopengl.qdoc163
-rw-r--r--doc/src/qtopiacore-displaymanagement.qdoc205
-rw-r--r--doc/src/qtopiacore.qdoc114
-rw-r--r--doc/src/qtscript.qdoc1934
-rw-r--r--doc/src/qtscriptdebugger-manual.qdoc437
-rw-r--r--doc/src/qtscriptextensions.qdoc126
-rw-r--r--doc/src/qtscripttools.qdoc72
-rw-r--r--doc/src/qtsql.qdoc571
-rw-r--r--doc/src/qtsvg.qdoc135
-rw-r--r--doc/src/qttest.qdoc70
-rw-r--r--doc/src/qtuiloader.qdoc82
-rw-r--r--doc/src/qtxml.qdoc615
-rw-r--r--doc/src/qtxmlpatterns.qdoc893
-rw-r--r--doc/src/qundo.qdoc113
-rw-r--r--doc/src/qwaitcondition.qdoc188
-rw-r--r--doc/src/rcc.qdoc96
-rw-r--r--doc/src/resources.qdoc192
-rw-r--r--doc/src/richtext.qdoc1073
-rw-r--r--doc/src/s60-introduction.qdoc149
-rw-r--r--doc/src/scripting/ecmascript.qdoc312
-rw-r--r--doc/src/scripting/qtscriptdebugger-manual.qdoc436
-rw-r--r--doc/src/scripting/qtscriptextensions.qdoc115
-rw-r--r--doc/src/scripting/scripting.qdoc1891
-rw-r--r--doc/src/session.qdoc177
-rw-r--r--doc/src/sharedlibrary.qdoc186
-rw-r--r--doc/src/signalsandslots.qdoc418
-rw-r--r--doc/src/snippets/animation/sequential/icons.qrc6
-rw-r--r--doc/src/snippets/animation/sequential/icons/left.pngbin0 -> 413 bytes-rw-r--r--doc/src/snippets/animation/sequential/icons/right.pngbin0 -> 414 bytes-rw-r--r--doc/src/snippets/animation/sequential/main.cpp91
-rw-r--r--doc/src/snippets/animation/sequential/sequential.pro4
-rw-r--r--doc/src/snippets/animation/sequential/tracer.cpp66
-rw-r--r--doc/src/snippets/animation/sequential/tracer.h64
-rw-r--r--doc/src/snippets/code/doc_src_appicon.qdoc4
-rw-r--r--doc/src/snippets/code/doc_src_emb-charinput.qdoc2
-rw-r--r--doc/src/snippets/code/doc_src_installation.qdoc38
-rw-r--r--doc/src/snippets/code/doc_src_introtodbus.qdoc5
-rw-r--r--doc/src/snippets/code/doc_src_linguist-manual.qdoc6
-rw-r--r--doc/src/snippets/code/doc_src_properties.qdoc4
-rw-r--r--doc/src/snippets/code/doc_src_qalgorithms.qdoc2
-rw-r--r--doc/src/snippets/code/doc_src_qmake-manual.qdoc121
-rw-r--r--doc/src/snippets/code/doc_src_qthelp.qdoc6
-rw-r--r--doc/src/snippets/code/doc_src_qtmultimedia.qdoc8
-rw-r--r--doc/src/snippets/code/doc_src_s60-introduction.qdoc28
-rw-r--r--doc/src/snippets/code/doc_src_sql-driver.qdoc2
-rw-r--r--doc/src/snippets/code/doc_src_styles.qdoc2
-rw-r--r--doc/src/snippets/code/doc_src_stylesheet.qdoc100
-rw-r--r--doc/src/snippets/code/src_corelib_global_qglobal.cpp24
-rw-r--r--doc/src/snippets/code/src_corelib_io_qdatastream.cpp2
-rw-r--r--doc/src/snippets/code/src_corelib_io_qfileinfo.cpp6
-rw-r--r--doc/src/snippets/code/src_corelib_io_qsettings.cpp2
-rw-r--r--doc/src/snippets/code/src_corelib_kernel_qobject.cpp15
-rw-r--r--doc/src/snippets/code/src_corelib_thread_qreadwritelock.cpp8
-rw-r--r--doc/src/snippets/code/src_corelib_tools_qeasingcurve.cpp45
-rw-r--r--doc/src/snippets/code/src_corelib_tools_qlistdata.cpp6
-rw-r--r--doc/src/snippets/code/src_corelib_tools_qregexp.cpp2
-rw-r--r--doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp144
-rw-r--r--doc/src/snippets/code/src_gui_effects_qgraphicseffect.cpp84
-rw-r--r--doc/src/snippets/code/src_gui_image_qicon.cpp9
-rw-r--r--doc/src/snippets/code/src_gui_image_qpixmap.cpp6
-rw-r--r--doc/src/snippets/code/src_gui_image_qpixmapcache.cpp2
-rw-r--r--doc/src/snippets/code/src_gui_qproxystyle.cpp86
-rw-r--r--doc/src/snippets/code/src_gui_widgets_qmainwindow.cpp60
-rw-r--r--doc/src/snippets/code/src_network_access_qnetworkdiskcache.cpp65
-rw-r--r--doc/src/snippets/code/src_network_access_qnetworkreply.cpp51
-rw-r--r--doc/src/snippets/code/src_network_ssl_qsslsocket.cpp11
-rw-r--r--doc/src/snippets/code/src_qt3support_network_q3ftp.cpp2
-rw-r--r--doc/src/snippets/gestures/imageviewer/imagewidget.cpp364
-rw-r--r--doc/src/snippets/gestures/imageviewer/imagewidget.h137
-rw-r--r--doc/src/snippets/gestures/imageviewer/tapandholdgesture.cpp159
-rw-r--r--doc/src/snippets/gestures/imageviewer/tapandholdgesture.h74
-rw-r--r--doc/src/snippets/gestures/qgesture.cpp283
-rw-r--r--doc/src/snippets/gestures/qgesture.h101
-rw-r--r--doc/src/snippets/gestures/qstandardgestures.cpp483
-rw-r--r--doc/src/snippets/gestures/qstandardgestures.h126
-rw-r--r--doc/src/snippets/qmake/spaces.pro9
-rw-r--r--doc/src/snippets/qprocess-environment/main.cpp13
-rw-r--r--doc/src/snippets/qstring/main.cpp2
-rw-r--r--doc/src/snippets/qstring/stringbuilder.cpp68
-rw-r--r--doc/src/snippets/qxmlschema/main.cpp118
-rw-r--r--doc/src/snippets/qxmlschema/qxmlschema.pro3
-rw-r--r--doc/src/snippets/qxmlschemavalidator/main.cpp160
-rw-r--r--doc/src/snippets/qxmlschemavalidator/qxmlschemavalidator.pro3
-rw-r--r--doc/src/snippets/snippets.pro2
-rw-r--r--doc/src/snippets/statemachine/eventtest.cpp74
-rw-r--r--doc/src/snippets/statemachine/main.cpp88
-rw-r--r--doc/src/snippets/statemachine/main2.cpp91
-rw-r--r--doc/src/snippets/statemachine/main3.cpp61
-rw-r--r--doc/src/snippets/statemachine/main4.cpp111
-rw-r--r--doc/src/snippets/statemachine/main5.cpp143
-rw-r--r--doc/src/snippets/stringlistmodel/model.cpp32
-rw-r--r--doc/src/snippets/textdocument-blocks/xmlwriter.cpp2
-rw-r--r--doc/src/snippets/textdocument-frames/xmlwriter.cpp2
-rw-r--r--doc/src/snippets/textdocument-tables/xmlwriter.cpp2
-rw-r--r--doc/src/snippets/widgets-tutorial/template.cpp55
-rw-r--r--doc/src/sql-driver.qdoc762
-rw-r--r--doc/src/sql-programming/qsqldatatype-table.qdoc583
-rw-r--r--doc/src/sql-programming/sql-driver.qdoc762
-rw-r--r--doc/src/sql-programming/sql-programming.qdoc614
-rw-r--r--doc/src/styles.qdoc2059
-rw-r--r--doc/src/stylesheet.qdoc3960
-rw-r--r--doc/src/symbian-exceptionsafety.qdoc241
-rw-r--r--doc/src/tech-preview/images/mainwindow-docks-example.pngbin14427 -> 0 bytes-rw-r--r--doc/src/tech-preview/images/mainwindow-docks.pngbin10168 -> 0 bytes-rw-r--r--doc/src/tech-preview/images/plaintext-layout.pngbin40981 -> 0 bytes-rw-r--r--doc/src/tech-preview/known-issues.html110
-rw-r--r--doc/src/templates.qdoc230
-rw-r--r--doc/src/threads.qdoc609
-rw-r--r--doc/src/timers.qdoc136
-rw-r--r--doc/src/tools-list.qdoc85
-rw-r--r--doc/src/topics.qdoc302
-rw-r--r--doc/src/trolltech-webpages.qdoc245
-rw-r--r--doc/src/tutorials/addressbook-fr.qdoc12
-rw-r--r--doc/src/tutorials/addressbook.qdoc87
-rw-r--r--doc/src/tutorials/widgets-tutorial.qdoc135
-rw-r--r--doc/src/uic.qdoc89
-rw-r--r--doc/src/unicode.qdoc165
-rw-r--r--doc/src/unix-signal-handlers.qdoc103
-rw-r--r--doc/src/widgets-and-layouts/focus.qdoc200
-rw-r--r--doc/src/widgets-and-layouts/gallery-cde.qdoc (renamed from doc/src/gallery-cde.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc (renamed from doc/src/gallery-cleanlooks.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery-gtk.qdoc (renamed from doc/src/gallery-gtk.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery-macintosh.qdoc (renamed from doc/src/gallery-macintosh.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery-motif.qdoc (renamed from doc/src/gallery-motif.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery-plastique.qdoc (renamed from doc/src/gallery-plastique.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery-windows.qdoc (renamed from doc/src/gallery-windows.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery-windowsvista.qdoc (renamed from doc/src/gallery-windowsvista.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery-windowsxp.qdoc (renamed from doc/src/gallery-windowsxp.qdoc)0
-rw-r--r--doc/src/widgets-and-layouts/gallery.qdoc150
-rw-r--r--doc/src/widgets-and-layouts/layout.qdoc396
-rw-r--r--doc/src/widgets-and-layouts/styles.qdoc2123
-rw-r--r--doc/src/widgets-and-layouts/stylesheet.qdoc3978
-rw-r--r--doc/src/widgets-and-layouts/widgets.qdoc187
-rw-r--r--doc/src/wince-introduction.qdoc113
-rw-r--r--doc/src/windows-and-dialogs/dialogs.qdoc76
-rw-r--r--doc/src/windows-and-dialogs/mainwindow.qdoc279
-rw-r--r--doc/src/winsystem.qdoc99
-rw-r--r--doc/src/xml-processing/xml-patterns.qdoc904
-rw-r--r--doc/src/xml-processing/xml-processing.qdoc631
-rw-r--r--doc/src/xml-processing/xquery-introduction.qdoc1023
-rw-r--r--doc/src/xquery-introduction.qdoc1024
-rw-r--r--examples/activeqt/activeqt.pro2
-rw-r--r--examples/activeqt/comapp/comapp.pro2
-rw-r--r--examples/activeqt/dotnet/wrapper/lib/tools.cpp2
-rw-r--r--examples/activeqt/hierarchy/hierarchy.pro2
-rw-r--r--examples/activeqt/menus/menus.pro2
-rw-r--r--examples/activeqt/multiple/multiple.pro2
-rw-r--r--examples/activeqt/opengl/opengl.pro2
-rw-r--r--examples/activeqt/qutlook/qutlook.pro2
-rw-r--r--examples/activeqt/simple/simple.pro2
-rw-r--r--examples/activeqt/webbrowser/main.cpp4
-rw-r--r--examples/activeqt/webbrowser/mainwindow_windowsmobile.ui (renamed from examples/activeqt/webbrowser/wincemainwindow.ui)0
-rw-r--r--examples/activeqt/webbrowser/webbrowser.pro4
-rw-r--r--examples/activeqt/wrapper/wrapper.pro2
-rw-r--r--examples/animation/README38
-rw-r--r--examples/animation/animatedtiles/animatedtiles.pro8
-rw-r--r--examples/animation/animatedtiles/animatedtiles.qrc11
-rw-r--r--examples/animation/animatedtiles/images/Time-For-Lunch-2.jpgbin0 -> 32471 bytes-rw-r--r--examples/animation/animatedtiles/images/centered.pngbin0 -> 892 bytes-rw-r--r--examples/animation/animatedtiles/images/ellipse.pngbin0 -> 10767 bytes-rw-r--r--examples/animation/animatedtiles/images/figure8.pngbin0 -> 14050 bytes-rw-r--r--examples/animation/animatedtiles/images/kinetic.pngbin0 -> 6776 bytes-rw-r--r--examples/animation/animatedtiles/images/random.pngbin0 -> 14969 bytes-rw-r--r--examples/animation/animatedtiles/images/tile.pngbin0 -> 16337 bytes-rw-r--r--examples/animation/animatedtiles/main.cpp280
-rw-r--r--examples/animation/animation.pro15
-rw-r--r--examples/animation/appchooser/accessories-dictionary.pngbin0 -> 5396 bytes-rw-r--r--examples/animation/appchooser/akregator.pngbin0 -> 4873 bytes-rw-r--r--examples/animation/appchooser/appchooser.pro8
-rw-r--r--examples/animation/appchooser/appchooser.qrc8
-rw-r--r--examples/animation/appchooser/digikam.pngbin0 -> 3334 bytes-rw-r--r--examples/animation/appchooser/k3b.pngbin0 -> 8220 bytes-rw-r--r--examples/animation/appchooser/main.cpp158
-rw-r--r--examples/animation/easing/animation.h101
-rw-r--r--examples/animation/easing/easing.pro14
-rw-r--r--examples/animation/easing/easing.qrc5
-rw-r--r--examples/animation/easing/form.ui201
-rw-r--r--examples/animation/easing/images/qt-logo.pngbin0 -> 5149 bytes-rw-r--r--examples/animation/easing/main.cpp53
-rw-r--r--examples/animation/easing/window.cpp177
-rw-r--r--examples/animation/easing/window.h79
-rw-r--r--examples/animation/moveblocks/main.cpp321
-rw-r--r--examples/animation/moveblocks/moveblocks.pro7
-rw-r--r--examples/animation/states/accessories-dictionary.pngbin0 -> 5396 bytes-rw-r--r--examples/animation/states/akregator.pngbin0 -> 4873 bytes-rw-r--r--examples/animation/states/digikam.pngbin0 -> 3334 bytes-rw-r--r--examples/animation/states/help-browser.pngbin0 -> 6984 bytes-rw-r--r--examples/animation/states/k3b.pngbin0 -> 8220 bytes-rw-r--r--examples/animation/states/kchart.pngbin0 -> 4887 bytes-rw-r--r--examples/animation/states/main.cpp283
-rw-r--r--examples/animation/states/states.pro8
-rw-r--r--examples/animation/states/states.qrc10
-rw-r--r--examples/animation/stickman/animation.cpp193
-rw-r--r--examples/animation/stickman/animation.h83
-rw-r--r--examples/animation/stickman/animations/chillingbin0 -> 6508 bytes-rw-r--r--examples/animation/stickman/animations/dancingbin0 -> 2348 bytes-rw-r--r--examples/animation/stickman/animations/deadbin0 -> 268 bytes-rw-r--r--examples/animation/stickman/animations/jumpingbin0 -> 1308 bytes-rw-r--r--examples/animation/stickman/graphicsview.cpp58
-rw-r--r--examples/animation/stickman/graphicsview.h64
-rw-r--r--examples/animation/stickman/lifecycle.cpp214
-rw-r--r--examples/animation/stickman/lifecycle.h80
-rw-r--r--examples/animation/stickman/main.cpp102
-rw-r--r--examples/animation/stickman/node.cpp93
-rw-r--r--examples/animation/stickman/node.h72
-rw-r--r--examples/animation/stickman/stickman.cpp343
-rw-r--r--examples/animation/stickman/stickman.h103
-rw-r--r--examples/animation/stickman/stickman.pro19
-rw-r--r--examples/animation/stickman/stickman.qrc8
-rw-r--r--examples/assistant/assistant.pro2
-rw-r--r--examples/assistant/simpletextviewer/mainwindow.cpp6
-rw-r--r--examples/assistant/simpletextviewer/simpletextviewer.pro2
-rw-r--r--examples/dbus/complexpingpong/complexping.pro2
-rw-r--r--examples/dbus/complexpingpong/complexpong.pro2
-rw-r--r--examples/dbus/dbus-chat/dbus-chat.pro2
-rw-r--r--examples/dbus/dbus.pro2
-rw-r--r--examples/dbus/listnames/listnames.pro2
-rw-r--r--examples/dbus/pingpong/ping.pro2
-rw-r--r--examples/dbus/pingpong/pong.pro2
-rw-r--r--examples/dbus/remotecontrolledcar/car/car.pro2
-rw-r--r--examples/dbus/remotecontrolledcar/controller/controller.pro2
-rw-r--r--examples/dbus/remotecontrolledcar/remotecontrolledcar.pro2
-rw-r--r--examples/designer/calculatorbuilder/calculatorbuilder.pro2
-rw-r--r--examples/designer/calculatorform/calculatorform.pro2
-rw-r--r--examples/designer/containerextension/containerextension.pro2
-rw-r--r--examples/designer/customwidgetplugin/customwidgetplugin.pro2
-rw-r--r--examples/designer/designer.pro2
-rw-r--r--examples/designer/taskmenuextension/taskmenuextension.pro2
-rw-r--r--examples/designer/taskmenuextension/tictactoeplugin.cpp8
-rw-r--r--examples/designer/worldtimeclockbuilder/worldtimeclockbuilder.pro2
-rw-r--r--examples/designer/worldtimeclockplugin/worldtimeclockplugin.pro2
-rw-r--r--examples/desktop/desktop.pro4
-rw-r--r--examples/desktop/screenshot/screenshot.pro2
-rw-r--r--examples/desktop/systray/systray.pro2
-rw-r--r--examples/dialogs/classwizard/classwizard.pro2
-rw-r--r--examples/dialogs/configdialog/configdialog.pro2
-rw-r--r--examples/dialogs/dialogs.pro4
-rw-r--r--examples/dialogs/extension/extension.pro2
-rw-r--r--examples/dialogs/findfiles/findfiles.pro2
-rw-r--r--examples/dialogs/licensewizard/licensewizard.pro2
-rw-r--r--examples/dialogs/sipdialog/sipdialog.pro2
-rw-r--r--examples/dialogs/standarddialogs/standarddialogs.pro2
-rw-r--r--examples/dialogs/tabdialog/tabdialog.pro2
-rw-r--r--examples/dialogs/trivialwizard/trivialwizard.pro2
-rw-r--r--examples/draganddrop/delayedencoding/delayedencoding.pro2
-rw-r--r--examples/draganddrop/draganddrop.pro2
-rw-r--r--examples/draganddrop/draggableicons/draggableicons.pro5
-rw-r--r--examples/draganddrop/draggabletext/draggabletext.pro5
-rw-r--r--examples/draganddrop/dropsite/dropsite.pro1
-rw-r--r--examples/draganddrop/dropsite/dropsitewindow.cpp6
-rw-r--r--examples/draganddrop/fridgemagnets/dragwidget.cpp3
-rw-r--r--examples/draganddrop/fridgemagnets/fridgemagnets.pro7
-rw-r--r--examples/draganddrop/fridgemagnets/main.cpp9
-rw-r--r--examples/draganddrop/puzzle/mainwindow.cpp4
-rw-r--r--examples/draganddrop/puzzle/puzzle.pro7
-rw-r--r--examples/effects/blurpicker/blureffect.cpp69
-rw-r--r--examples/effects/blurpicker/blureffect.h67
-rw-r--r--examples/effects/blurpicker/blurpicker.cpp132
-rw-r--r--examples/effects/blurpicker/blurpicker.h74
-rw-r--r--examples/effects/blurpicker/blurpicker.pro9
-rw-r--r--examples/effects/blurpicker/blurpicker.qrc14
-rw-r--r--examples/effects/blurpicker/images/README.txt5
-rw-r--r--examples/effects/blurpicker/images/accessories-calculator.pngbin0 -> 3760 bytes-rw-r--r--examples/effects/blurpicker/images/accessories-text-editor.pngbin0 -> 4746 bytes-rw-r--r--examples/effects/blurpicker/images/background.jpgbin0 -> 16259 bytes-rw-r--r--examples/effects/blurpicker/images/help-browser.pngbin0 -> 5392 bytes-rw-r--r--examples/effects/blurpicker/images/internet-group-chat.pngbin0 -> 2809 bytes-rw-r--r--examples/effects/blurpicker/images/internet-mail.pngbin0 -> 3899 bytes-rw-r--r--examples/effects/blurpicker/images/internet-web-browser.pngbin0 -> 6376 bytes-rw-r--r--examples/effects/blurpicker/images/office-calendar.pngbin0 -> 4010 bytes-rw-r--r--examples/effects/blurpicker/images/system-users.pngbin0 -> 5353 bytes-rw-r--r--examples/effects/blurpicker/main.cpp55
-rw-r--r--examples/effects/customshader/blureffect.cpp69
-rw-r--r--examples/effects/customshader/blureffect.h67
-rw-r--r--examples/effects/customshader/blurpicker.cpp137
-rw-r--r--examples/effects/customshader/blurpicker.h74
-rw-r--r--examples/effects/customshader/blurpicker.qrc14
-rw-r--r--examples/effects/customshader/customshader.pro10
-rw-r--r--examples/effects/customshader/customshadereffect.cpp70
-rw-r--r--examples/effects/customshader/customshadereffect.h64
-rw-r--r--examples/effects/customshader/images/README.txt5
-rw-r--r--examples/effects/customshader/images/accessories-calculator.pngbin0 -> 3760 bytes-rw-r--r--examples/effects/customshader/images/accessories-text-editor.pngbin0 -> 4746 bytes-rw-r--r--examples/effects/customshader/images/background.jpgbin0 -> 16259 bytes-rw-r--r--examples/effects/customshader/images/help-browser.pngbin0 -> 5392 bytes-rw-r--r--examples/effects/customshader/images/internet-group-chat.pngbin0 -> 2809 bytes-rw-r--r--examples/effects/customshader/images/internet-mail.pngbin0 -> 3899 bytes-rw-r--r--examples/effects/customshader/images/internet-web-browser.pngbin0 -> 6376 bytes-rw-r--r--examples/effects/customshader/images/office-calendar.pngbin0 -> 4010 bytes-rw-r--r--examples/effects/customshader/images/system-users.pngbin0 -> 5353 bytes-rw-r--r--examples/effects/customshader/main.cpp55
-rw-r--r--examples/effects/effects.pro14
-rw-r--r--examples/effects/lighting/lighting.cpp135
-rw-r--r--examples/effects/lighting/lighting.h68
-rw-r--r--examples/effects/lighting/lighting.pro8
-rw-r--r--examples/effects/lighting/main.cpp55
-rw-r--r--examples/examples.pro30
-rw-r--r--examples/gestures/gestures.pro10
-rw-r--r--examples/gestures/imageviewer/imageviewer.pro11
-rw-r--r--examples/gestures/imageviewer/imagewidget.cpp249
-rw-r--r--examples/gestures/imageviewer/imagewidget.h89
-rw-r--r--examples/gestures/imageviewer/main.cpp90
-rw-r--r--examples/gestures/imageviewer/tapandholdgesture.cpp155
-rw-r--r--examples/gestures/imageviewer/tapandholdgesture.h74
-rw-r--r--examples/graphicsview/anchorlayout/anchorlayout.pro14
-rw-r--r--examples/graphicsview/anchorlayout/main.cpp149
-rw-r--r--examples/graphicsview/basicgraphicslayouts/basicgraphicslayouts.pro5
-rw-r--r--examples/graphicsview/basicgraphicslayouts/layoutitem.cpp50
-rw-r--r--examples/graphicsview/basicgraphicslayouts/layoutitem.h12
-rw-r--r--examples/graphicsview/collidingmice/collidingmice.pro5
-rw-r--r--examples/graphicsview/collidingmice/mouse.cpp4
-rw-r--r--examples/graphicsview/diagramscene/diagramscene.pro2
-rw-r--r--examples/graphicsview/diagramscene/mainwindow.cpp3
-rw-r--r--examples/graphicsview/dragdroprobot/dragdroprobot.pro2
-rw-r--r--examples/graphicsview/elasticnodes/elasticnodes.pro7
-rw-r--r--examples/graphicsview/elasticnodes/node.cpp1
-rw-r--r--examples/graphicsview/flowlayout/flowlayout.cpp210
-rw-r--r--examples/graphicsview/flowlayout/flowlayout.h77
-rw-r--r--examples/graphicsview/flowlayout/flowlayout.pro12
-rw-r--r--examples/graphicsview/flowlayout/main.cpp55
-rw-r--r--examples/graphicsview/flowlayout/window.cpp63
-rw-r--r--examples/graphicsview/flowlayout/window.h48
-rw-r--r--examples/graphicsview/graphicsview.pro14
-rw-r--r--examples/graphicsview/padnavigator/padnavigator.pro7
-rw-r--r--examples/graphicsview/padnavigator/panel.h2
-rw-r--r--examples/graphicsview/padnavigator/roundrectitem.h2
-rw-r--r--examples/graphicsview/portedasteroids/portedasteroids.pro2
-rw-r--r--examples/graphicsview/portedcanvas/portedcanvas.pro2
-rw-r--r--examples/help/contextsensitivehelp/contextsensitivehelp.pro2
-rw-r--r--examples/help/help.pro2
-rw-r--r--examples/help/remotecontrol/remotecontrol.pro2
-rw-r--r--examples/help/simpletextviewer/mainwindow.cpp6
-rw-r--r--examples/help/simpletextviewer/simpletextviewer.pro2
-rw-r--r--examples/ipc/ipc.pro5
-rw-r--r--examples/ipc/localfortuneclient/localfortuneclient.pro2
-rw-r--r--examples/ipc/localfortuneserver/localfortuneserver.pro2
-rw-r--r--examples/ipc/sharedmemory/sharedmemory.pro2
-rw-r--r--examples/itemviews/addressbook/addressbook.pro5
-rw-r--r--examples/itemviews/basicsortfiltermodel/basicsortfiltermodel.pro2
-rw-r--r--examples/itemviews/chart/chart.pro9
-rw-r--r--examples/itemviews/chart/mainwindow.cpp6
-rw-r--r--examples/itemviews/coloreditorfactory/coloreditorfactory.pro2
-rw-r--r--examples/itemviews/customsortfiltermodel/customsortfiltermodel.pro2
-rw-r--r--examples/itemviews/dirview/dirview.pro2
-rw-r--r--examples/itemviews/editabletreemodel/editabletreemodel.pro2
-rw-r--r--examples/itemviews/itemviews.pro6
-rw-r--r--examples/itemviews/pixelator/mainwindow.cpp6
-rw-r--r--examples/itemviews/pixelator/pixelator.pro2
-rw-r--r--examples/itemviews/puzzle/mainwindow.cpp4
-rw-r--r--examples/itemviews/puzzle/puzzle.pro2
-rw-r--r--examples/itemviews/simpledommodel/mainwindow.cpp4
-rw-r--r--examples/itemviews/simpledommodel/simpledommodel.pro2
-rw-r--r--examples/itemviews/simpletreemodel/simpletreemodel.pro2
-rw-r--r--examples/itemviews/simplewidgetmapper/simplewidgetmapper.pro2
-rw-r--r--examples/itemviews/spinboxdelegate/spinboxdelegate.pro2
-rw-r--r--examples/itemviews/stardelegate/stardelegate.pro2
-rw-r--r--examples/layouts/basiclayouts/basiclayouts.pro2
-rw-r--r--examples/layouts/borderlayout/borderlayout.pro2
-rw-r--r--examples/layouts/dynamiclayouts/dynamiclayouts.pro2
-rw-r--r--examples/layouts/flowlayout/flowlayout.pro2
-rw-r--r--examples/layouts/layouts.pro2
-rw-r--r--examples/linguist/arrowpad/arrowpad.pro2
-rw-r--r--examples/linguist/arrowpad/mainwindow.cpp2
-rw-r--r--examples/linguist/hellotr/hellotr.pro2
-rw-r--r--examples/linguist/linguist.pro2
-rw-r--r--examples/linguist/trollprint/trollprint.pro2
-rw-r--r--examples/mainwindows/application/application.pro2
-rw-r--r--examples/mainwindows/application/main.cpp2
-rw-r--r--examples/mainwindows/application/mainwindow.cpp17
-rw-r--r--examples/mainwindows/dockwidgets/dockwidgets.pro2
-rw-r--r--examples/mainwindows/dockwidgets/mainwindow.cpp2
-rw-r--r--examples/mainwindows/mainwindows.pro6
-rw-r--r--examples/mainwindows/mdi/mainwindow.cpp3
-rw-r--r--examples/mainwindows/mdi/mdi.pro2
-rw-r--r--examples/mainwindows/menus/mainwindow.cpp8
-rw-r--r--examples/mainwindows/menus/menus.pro5
-rw-r--r--examples/mainwindows/recentfiles/main.cpp2
-rw-r--r--examples/mainwindows/recentfiles/mainwindow.cpp14
-rw-r--r--examples/mainwindows/recentfiles/recentfiles.pro2
-rw-r--r--examples/mainwindows/sdi/main.cpp2
-rw-r--r--examples/mainwindows/sdi/mainwindow.cpp10
-rw-r--r--examples/mainwindows/sdi/sdi.pro2
-rw-r--r--examples/multimedia/README34
-rw-r--r--examples/multimedia/audio/audio.pro10
-rw-r--r--examples/multimedia/audio/audiodevices/audiodevices.cpp272
-rw-r--r--examples/multimedia/audio/audiodevices/audiodevices.h79
-rw-r--r--examples/multimedia/audio/audiodevices/audiodevices.pro12
-rw-r--r--examples/multimedia/audio/audiodevices/audiodevicesbase.ui255
-rw-r--r--examples/multimedia/audio/audiodevices/main.cpp55
-rw-r--r--examples/multimedia/audio/audioinput/audioinput.cpp376
-rw-r--r--examples/multimedia/audio/audioinput/audioinput.h144
-rw-r--r--examples/multimedia/audio/audioinput/audioinput.pro12
-rw-r--r--examples/multimedia/audio/audioinput/main.cpp55
-rw-r--r--examples/multimedia/audio/audiooutput/audiooutput.cpp280
-rw-r--r--examples/multimedia/audio/audiooutput/audiooutput.h112
-rw-r--r--examples/multimedia/audio/audiooutput/audiooutput.pro11
-rw-r--r--examples/multimedia/audio/audiooutput/main.cpp56
-rw-r--r--examples/multimedia/multimedia.pro8
-rw-r--r--examples/multitouch/dials/dials.pro2
-rw-r--r--examples/multitouch/dials/dials.ui77
-rw-r--r--examples/multitouch/dials/main.cpp59
-rw-r--r--examples/multitouch/fingerpaint/fingerpaint.pro11
-rw-r--r--examples/multitouch/fingerpaint/main.cpp52
-rw-r--r--examples/multitouch/fingerpaint/mainwindow.cpp218
-rw-r--r--examples/multitouch/fingerpaint/mainwindow.h89
-rw-r--r--examples/multitouch/fingerpaint/scribblearea.cpp212
-rw-r--r--examples/multitouch/fingerpaint/scribblearea.h81
-rw-r--r--examples/multitouch/knobs/knob.cpp89
-rw-r--r--examples/multitouch/knobs/knob.h55
-rw-r--r--examples/multitouch/knobs/knobs.pro2
-rw-r--r--examples/multitouch/knobs/main.cpp65
-rw-r--r--examples/multitouch/multitouch.pro2
-rw-r--r--examples/multitouch/pinchzoom/graphicsview.cpp76
-rw-r--r--examples/multitouch/pinchzoom/graphicsview.h53
-rw-r--r--examples/multitouch/pinchzoom/images/cheese.jpgbin0 -> 3029 bytes-rw-r--r--examples/multitouch/pinchzoom/main.cpp87
-rw-r--r--examples/multitouch/pinchzoom/mice.qrc5
-rw-r--r--examples/multitouch/pinchzoom/mouse.cpp200
-rw-r--r--examples/multitouch/pinchzoom/mouse.h72
-rw-r--r--examples/multitouch/pinchzoom/pinchzoom.pro16
-rw-r--r--examples/network/blockingfortuneclient/blockingfortuneclient.pro2
-rw-r--r--examples/network/broadcastreceiver/broadcastreceiver.pro2
-rw-r--r--examples/network/broadcastsender/broadcastsender.pro2
-rw-r--r--examples/network/download/download.pro2
-rw-r--r--examples/network/downloadmanager/downloadmanager.pro2
-rw-r--r--examples/network/fortuneclient/client.cpp29
-rw-r--r--examples/network/fortuneclient/client.h3
-rw-r--r--examples/network/fortuneclient/fortuneclient.pro8
-rw-r--r--examples/network/fortuneclient/main.cpp6
-rw-r--r--examples/network/fortuneserver/fortuneserver.pro9
-rw-r--r--examples/network/fortuneserver/main.cpp11
-rw-r--r--examples/network/fortuneserver/server.cpp16
-rw-r--r--examples/network/ftp/ftp.pro9
-rw-r--r--examples/network/ftp/ftpwindow.cpp36
-rw-r--r--examples/network/ftp/ftpwindow.h4
-rw-r--r--examples/network/ftp/main.cpp17
-rw-r--r--examples/network/ftp/sym_iap_util.h510
-rw-r--r--examples/network/googlesuggest/googlesuggest.cpp7
-rw-r--r--examples/network/http/http.pro2
-rw-r--r--examples/network/http/main.cpp1
-rw-r--r--examples/network/loopback/loopback.pro2
-rw-r--r--examples/network/network-chat/chatdialog.cpp4
-rw-r--r--examples/network/network-chat/main.cpp11
-rw-r--r--examples/network/network-chat/network-chat.pro8
-rw-r--r--examples/network/network-chat/peermanager.cpp7
-rw-r--r--examples/network/network.pro16
-rw-r--r--examples/network/securesocketclient/securesocketclient.pro5
-rw-r--r--examples/network/securesocketclient/sslclient.cpp2
-rw-r--r--examples/network/threadedfortuneserver/threadedfortuneserver.pro2
-rw-r--r--examples/network/torrent/main.cpp1
-rw-r--r--examples/network/torrent/torrent.pro2
-rw-r--r--examples/opengl/2dpainting/2dpainting.pro2
-rw-r--r--examples/opengl/framebufferobject/bubbles.svg28
-rw-r--r--examples/opengl/framebufferobject/framebufferobject.pro2
-rw-r--r--examples/opengl/framebufferobject/glwidget.cpp29
-rw-r--r--examples/opengl/framebufferobject/glwidget.h3
-rw-r--r--examples/opengl/framebufferobject2/framebufferobject2.pro2
-rw-r--r--examples/opengl/framebufferobject2/glwidget.cpp2
-rw-r--r--examples/opengl/grabber/grabber.pro2
-rw-r--r--examples/opengl/grabber/mainwindow.cpp2
-rw-r--r--examples/opengl/hellogl/hellogl.pro2
-rw-r--r--examples/opengl/hellogl_es2/glwidget.cpp396
-rw-r--r--examples/opengl/hellogl_es2/glwidget.h31
-rw-r--r--examples/opengl/opengl.pro2
-rw-r--r--examples/opengl/overpainting/glwidget.cpp5
-rw-r--r--examples/opengl/overpainting/overpainting.pro2
-rw-r--r--examples/opengl/pbuffers/glwidget.cpp2
-rw-r--r--examples/opengl/pbuffers/pbuffers.pro2
-rw-r--r--examples/opengl/pbuffers2/bubbles.svg28
-rw-r--r--examples/opengl/pbuffers2/pbuffers2.pro2
-rw-r--r--examples/opengl/samplebuffers/samplebuffers.pro2
-rw-r--r--examples/opengl/textures/textures.pro2
-rw-r--r--examples/openvg/README40
-rw-r--r--examples/openvg/openvg.pro8
-rw-r--r--examples/openvg/star/main.cpp54
-rw-r--r--examples/openvg/star/star.pro6
-rw-r--r--examples/openvg/star/starwidget.cpp115
-rw-r--r--examples/openvg/star/starwidget.h66
-rw-r--r--examples/painting/basicdrawing/basicdrawing.pro5
-rw-r--r--examples/painting/concentriccircles/concentriccircles.pro5
-rw-r--r--examples/painting/fontsampler/fontsampler.pro2
-rw-r--r--examples/painting/imagecomposition/imagecomposition.pro4
-rw-r--r--examples/painting/painterpaths/painterpaths.pro7
-rw-r--r--examples/painting/painting.pro4
-rw-r--r--examples/painting/svggenerator/displaywidget.cpp2
-rw-r--r--examples/painting/svggenerator/svggenerator.pro2
-rw-r--r--examples/painting/svgviewer/files/bubbles.svg28
-rw-r--r--examples/painting/svgviewer/mainwindow.cpp2
-rw-r--r--examples/painting/svgviewer/svgviewer.pro8
-rw-r--r--examples/painting/transformations/transformations.pro5
-rw-r--r--examples/phonon/capabilities/capabilities.pro1
-rw-r--r--examples/phonon/musicplayer/mainwindow.cpp4
-rw-r--r--examples/phonon/musicplayer/musicplayer.pro1
-rw-r--r--examples/phonon/phonon.pro2
-rw-r--r--examples/qtconcurrent/imagescaling/imagescaling.pro2
-rw-r--r--examples/qtconcurrent/map/map.pro2
-rw-r--r--examples/qtconcurrent/progressdialog/progressdialog.pro2
-rw-r--r--examples/qtconcurrent/qtconcurrent.pro2
-rw-r--r--examples/qtconcurrent/runfunction/runfunction.pro2
-rw-r--r--examples/qtconcurrent/wordcount/wordcount.pro2
-rw-r--r--examples/qtestlib/qtestlib.pro2
-rw-r--r--examples/qtestlib/tutorial1/tutorial1.pro5
-rw-r--r--examples/qtestlib/tutorial2/tutorial2.pro5
-rw-r--r--examples/qtestlib/tutorial3/tutorial3.pro5
-rw-r--r--examples/qtestlib/tutorial4/tutorial4.pro5
-rw-r--r--examples/qtestlib/tutorial5/tutorial5.pro5
-rw-r--r--examples/qws/ahigl/ahigl.pro2
-rw-r--r--examples/qws/dbscreen/dbscreen.pro2
-rw-r--r--examples/qws/framebuffer/framebuffer.pro2
-rw-r--r--examples/qws/mousecalibration/mousecalibration.pro2
-rw-r--r--examples/qws/qws.pro6
-rw-r--r--examples/qws/svgalib/svgalib.pro2
-rw-r--r--examples/richtext/calendar/calendar.pro2
-rw-r--r--examples/richtext/orderform/mainwindow.cpp6
-rw-r--r--examples/richtext/orderform/orderform.pro2
-rw-r--r--examples/richtext/richtext.pro2
-rw-r--r--examples/richtext/syntaxhighlighter/mainwindow.cpp11
-rw-r--r--examples/richtext/syntaxhighlighter/syntaxhighlighter.pro2
-rw-r--r--examples/script/calculator/calculator.js107
-rw-r--r--examples/script/calculator/calculator.pro2
-rw-r--r--examples/script/calculator/main.cpp4
-rw-r--r--examples/script/context2d/context2d.pro9
-rw-r--r--examples/script/context2d/qcontext2dcanvas.cpp5
-rw-r--r--examples/script/context2d/window.cpp27
-rw-r--r--examples/script/customclass/bytearrayclass.cpp11
-rw-r--r--examples/script/customclass/customclass.pro2
-rw-r--r--examples/script/customclass/main.cpp4
-rw-r--r--examples/script/defaultprototypes/defaultprototypes.pro2
-rw-r--r--examples/script/helloscript/helloscript.pro2
-rw-r--r--examples/script/marshal/marshal.pro2
-rw-r--r--examples/script/qscript/qscript.pro2
-rw-r--r--examples/script/qsdbg/qsdbg.pro2
-rw-r--r--examples/script/qstetrix/main.cpp4
-rw-r--r--examples/script/script.pro4
-rw-r--r--examples/sql/cachedtable/cachedtable.pro2
-rw-r--r--examples/sql/drilldown/drilldown.pro7
-rw-r--r--examples/sql/drilldown/informationwindow.cpp2
-rw-r--r--examples/sql/drilldown/main.cpp4
-rw-r--r--examples/sql/drilldown/view.cpp15
-rw-r--r--examples/sql/masterdetail/mainwindow.cpp2
-rw-r--r--examples/sql/masterdetail/masterdetail.pro2
-rw-r--r--examples/sql/querymodel/querymodel.pro2
-rw-r--r--examples/sql/relationaltablemodel/relationaltablemodel.pro2
-rw-r--r--examples/sql/sql.pro16
-rw-r--r--examples/sql/tablemodel/tablemodel.pro2
-rw-r--r--examples/statemachine/README36
-rw-r--r--examples/statemachine/eventtransitions/eventtransitions.pro7
-rw-r--r--examples/statemachine/eventtransitions/main.cpp111
-rw-r--r--examples/statemachine/factorial/factorial.pro11
-rw-r--r--examples/statemachine/factorial/main.cpp176
-rw-r--r--examples/statemachine/pingpong/main.cpp140
-rw-r--r--examples/statemachine/pingpong/pingpong.pro11
-rw-r--r--examples/statemachine/rogue/main.cpp55
-rw-r--r--examples/statemachine/rogue/movementtransition.h108
-rw-r--r--examples/statemachine/rogue/rogue.pro11
-rw-r--r--examples/statemachine/rogue/window.cpp201
-rw-r--r--examples/statemachine/rogue/window.h91
-rw-r--r--examples/statemachine/statemachine.pro14
-rw-r--r--examples/statemachine/trafficlight/main.cpp185
-rw-r--r--examples/statemachine/trafficlight/trafficlight.pro7
-rw-r--r--examples/statemachine/twowaybutton/main.cpp82
-rw-r--r--examples/statemachine/twowaybutton/twowaybutton.pro7
-rw-r--r--examples/symbianpkgrules.pri13
-rw-r--r--examples/threads/mandelbrot/mandelbrot.pro4
-rw-r--r--examples/threads/semaphores/semaphores.pro2
-rw-r--r--examples/threads/threads.pro2
-rw-r--r--examples/threads/waitconditions/waitconditions.pro6
-rw-r--r--examples/tools/codecs/codecs.pro2
-rw-r--r--examples/tools/codecs/encodedfiles/.gitattributes2
-rw-r--r--examples/tools/codecs/encodedfiles/iso-8859-1.txt12
-rw-r--r--examples/tools/codecs/encodedfiles/iso-8859-15.txt16
-rw-r--r--examples/tools/codecs/mainwindow.cpp4
-rw-r--r--examples/tools/completer/completer.pro2
-rw-r--r--examples/tools/completer/mainwindow.cpp24
-rw-r--r--examples/tools/completer/mainwindow.h3
-rw-r--r--examples/tools/completer/resources/wordlist.txt1
-rw-r--r--examples/tools/contiguouscache/contiguouscache.pro9
-rw-r--r--examples/tools/contiguouscache/main.cpp56
-rw-r--r--examples/tools/contiguouscache/randomlistmodel.cpp97
-rw-r--r--examples/tools/contiguouscache/randomlistmodel.h66
-rw-r--r--examples/tools/customcompleter/customcompleter.pro2
-rw-r--r--examples/tools/echoplugin/echoplugin.pro2
-rw-r--r--examples/tools/echoplugin/echowindow/echowindow.pro2
-rw-r--r--examples/tools/echoplugin/plugin/plugin.pro4
-rw-r--r--examples/tools/i18n/i18n.pro2
-rw-r--r--examples/tools/inputpanel/inputpanel.pro17
-rw-r--r--examples/tools/inputpanel/main.cpp62
-rw-r--r--examples/tools/inputpanel/mainform.ui76
-rw-r--r--examples/tools/inputpanel/myinputpanel.cpp134
-rw-r--r--examples/tools/inputpanel/myinputpanel.h77
-rw-r--r--examples/tools/inputpanel/myinputpanelcontext.cpp132
-rw-r--r--examples/tools/inputpanel/myinputpanelcontext.h82
-rw-r--r--examples/tools/inputpanel/myinputpanelform.ui398
-rw-r--r--examples/tools/plugandpaint/mainwindow.cpp6
-rw-r--r--examples/tools/plugandpaint/plugandpaint.pro8
-rw-r--r--examples/tools/plugandpaintplugins/basictools/basictools.pro2
-rw-r--r--examples/tools/plugandpaintplugins/extrafilters/extrafilters.pro4
-rw-r--r--examples/tools/plugandpaintplugins/plugandpaintplugins.pro2
-rw-r--r--examples/tools/regexp/regexp.pro2
-rw-r--r--examples/tools/regexp/regexpdialog.cpp1
-rw-r--r--examples/tools/settingseditor/mainwindow.cpp4
-rw-r--r--examples/tools/settingseditor/settingseditor.pro2
-rw-r--r--examples/tools/styleplugin/plugin/plugin.pro4
-rw-r--r--examples/tools/styleplugin/styleplugin.pro2
-rw-r--r--examples/tools/styleplugin/stylewindow/stylewindow.pro2
-rw-r--r--examples/tools/tools.pro4
-rw-r--r--examples/tools/treemodelcompleter/treemodelcompleter.pro2
-rw-r--r--examples/tools/undoframework/mainwindow.cpp8
-rw-r--r--examples/tools/undoframework/undoframework.pro2
-rw-r--r--examples/tutorials/addressbook-fr/part1/main.cpp4
-rw-r--r--examples/tutorials/addressbook-fr/part2/main.cpp4
-rw-r--r--examples/tutorials/addressbook-fr/part3/addressbook.cpp4
-rw-r--r--examples/tutorials/addressbook-fr/part3/main.cpp4
-rw-r--r--examples/tutorials/addressbook-fr/part4/addressbook.cpp3
-rw-r--r--examples/tutorials/addressbook-fr/part4/main.cpp4
-rw-r--r--examples/tutorials/addressbook-fr/part5/addressbook.cpp3
-rw-r--r--examples/tutorials/addressbook-fr/part5/main.cpp4
-rw-r--r--examples/tutorials/addressbook-fr/part6/addressbook.cpp3
-rw-r--r--examples/tutorials/addressbook-fr/part6/main.cpp4
-rw-r--r--examples/tutorials/addressbook-fr/part7/addressbook.cpp3
-rw-r--r--examples/tutorials/addressbook-fr/part7/main.cpp4
-rw-r--r--examples/tutorials/addressbook/addressbook.pro2
-rw-r--r--examples/tutorials/addressbook/part1/main.cpp4
-rw-r--r--examples/tutorials/addressbook/part1/part1.pro2
-rw-r--r--examples/tutorials/addressbook/part2/main.cpp4
-rw-r--r--examples/tutorials/addressbook/part2/part2.pro2
-rw-r--r--examples/tutorials/addressbook/part3/main.cpp4
-rw-r--r--examples/tutorials/addressbook/part3/part3.pro2
-rw-r--r--examples/tutorials/addressbook/part4/main.cpp4
-rw-r--r--examples/tutorials/addressbook/part4/part4.pro2
-rw-r--r--examples/tutorials/addressbook/part5/main.cpp4
-rw-r--r--examples/tutorials/addressbook/part5/part5.pro2
-rw-r--r--examples/tutorials/addressbook/part6/main.cpp4
-rw-r--r--examples/tutorials/addressbook/part6/part6.pro2
-rw-r--r--examples/tutorials/addressbook/part7/main.cpp4
-rw-r--r--examples/tutorials/addressbook/part7/part7.pro2
-rw-r--r--examples/tutorials/tutorials.pro2
-rw-r--r--examples/tutorials/widgets/childwidget/childwidget.pro7
-rw-r--r--examples/tutorials/widgets/childwidget/main.cpp61
-rw-r--r--examples/tutorials/widgets/nestedlayouts/main.cpp104
-rw-r--r--examples/tutorials/widgets/nestedlayouts/nestedlayouts.pro7
-rw-r--r--examples/tutorials/widgets/toplevel/main.cpp57
-rw-r--r--examples/tutorials/widgets/toplevel/toplevel.pro7
-rw-r--r--examples/tutorials/widgets/widgets.pro8
-rw-r--r--examples/tutorials/widgets/windowlayout/main.cpp63
-rw-r--r--examples/tutorials/widgets/windowlayout/windowlayout.pro7
-rw-r--r--examples/uitools/multipleinheritance/multipleinheritance.pro2
-rw-r--r--examples/uitools/textfinder/forms/input.txt2
-rw-r--r--examples/uitools/textfinder/textfinder.pro2
-rw-r--r--examples/uitools/uitools.pro4
-rw-r--r--examples/video/video.pro6
-rw-r--r--examples/video/videographicsitem/main.cpp55
-rw-r--r--examples/video/videographicsitem/videographicsitem.pro16
-rw-r--r--examples/video/videographicsitem/videoitem.cpp144
-rw-r--r--examples/video/videographicsitem/videoitem.h78
-rw-r--r--examples/video/videographicsitem/videoplayer.cpp210
-rw-r--r--examples/video/videographicsitem/videoplayer.h86
-rw-r--r--examples/video/videowidget/main.cpp54
-rw-r--r--examples/video/videowidget/videoplayer.cpp183
-rw-r--r--examples/video/videowidget/videoplayer.h79
-rw-r--r--examples/video/videowidget/videowidget.cpp114
-rw-r--r--examples/video/videowidget/videowidget.h76
-rw-r--r--examples/video/videowidget/videowidget.pro14
-rw-r--r--examples/video/videowidget/videowidgetsurface.cpp175
-rw-r--r--examples/video/videowidget/videowidgetsurface.h81
-rw-r--r--examples/webkit/fancybrowser/fancybrowser.pro4
-rw-r--r--examples/webkit/fancybrowser/mainwindow.cpp3
-rw-r--r--examples/webkit/fancybrowser/mainwindow.h2
-rwxr-xr-xexamples/webkit/formextractor/form.html24
-rw-r--r--examples/webkit/formextractor/formextractor.cpp29
-rw-r--r--examples/webkit/formextractor/formextractor.h4
-rw-r--r--examples/webkit/formextractor/formextractor.pro7
-rw-r--r--examples/webkit/formextractor/mainwindow.cpp3
-rw-r--r--examples/webkit/framecapture/framecapture.cpp121
-rw-r--r--examples/webkit/framecapture/framecapture.h70
-rw-r--r--examples/webkit/framecapture/framecapture.pro11
-rw-r--r--examples/webkit/framecapture/main.cpp76
-rw-r--r--examples/webkit/googlechat/googlechat.pro4
-rw-r--r--examples/webkit/googlechat/main.cpp4
-rw-r--r--examples/webkit/previewer/mainwindow.cpp6
-rw-r--r--examples/webkit/previewer/previewer.pro7
-rw-r--r--examples/webkit/webkit.pro2
-rw-r--r--examples/widgets/analogclock/analogclock.pro5
-rw-r--r--examples/widgets/calculator/calculator.pro5
-rw-r--r--examples/widgets/calendarwidget/calendarwidget.pro5
-rw-r--r--examples/widgets/calendarwidget/window.cpp28
-rw-r--r--examples/widgets/charactermap/charactermap.pro2
-rw-r--r--examples/widgets/digitalclock/digitalclock.pro2
-rw-r--r--examples/widgets/groupbox/groupbox.pro2
-rw-r--r--examples/widgets/icons/icons.pro2
-rw-r--r--examples/widgets/icons/mainwindow.cpp2
-rw-r--r--examples/widgets/imageviewer/imageviewer.pro2
-rw-r--r--examples/widgets/lineedits/lineedits.pro5
-rw-r--r--examples/widgets/movie/movie.pro2
-rw-r--r--examples/widgets/scribble/mainwindow.cpp4
-rw-r--r--examples/widgets/scribble/scribble.pro2
-rw-r--r--examples/widgets/shapedclock/shapedclock.pro5
-rw-r--r--examples/widgets/sliders/sliders.pro2
-rw-r--r--examples/widgets/softkeys/main.cpp51
-rw-r--r--examples/widgets/softkeys/softkeys.cpp161
-rw-r--r--examples/widgets/softkeys/softkeys.h86
-rw-r--r--examples/widgets/softkeys/softkeys.pro15
-rw-r--r--examples/widgets/spinboxes/spinboxes.pro2
-rw-r--r--examples/widgets/styles/styles.pro2
-rw-r--r--examples/widgets/stylesheet/stylesheet.pro2
-rw-r--r--examples/widgets/tablet/mainwindow.cpp6
-rw-r--r--examples/widgets/tablet/tablet.pro2
-rw-r--r--examples/widgets/tablet/tabletcanvas.cpp37
-rw-r--r--examples/widgets/tetrix/tetrix.pro5
-rw-r--r--examples/widgets/tooltips/tooltips.pro2
-rw-r--r--examples/widgets/validators/validators.pro2
-rw-r--r--examples/widgets/widgets.pro12
-rw-r--r--examples/widgets/wiggly/dialog.cpp11
-rw-r--r--examples/widgets/wiggly/dialog.h2
-rw-r--r--examples/widgets/wiggly/main.cpp14
-rw-r--r--examples/widgets/wiggly/wiggly.pro5
-rw-r--r--examples/widgets/windowflags/windowflags.pro2
-rw-r--r--examples/xml/dombookmarks/dombookmarks.pro2
-rw-r--r--examples/xml/dombookmarks/mainwindow.cpp6
-rw-r--r--examples/xml/htmlinfo/apache_org.html281
-rw-r--r--examples/xml/htmlinfo/htmlinfo.pro19
-rw-r--r--examples/xml/htmlinfo/main.cpp119
-rw-r--r--examples/xml/htmlinfo/nokia_com.html215
-rw-r--r--examples/xml/htmlinfo/simpleexample.html11
-rw-r--r--examples/xml/htmlinfo/trolltech_com.html955
-rw-r--r--examples/xml/htmlinfo/w3c_org.html507
-rw-r--r--examples/xml/htmlinfo/youtube_com.html1585
-rw-r--r--examples/xml/rsslisting/main.cpp1
-rw-r--r--examples/xml/rsslisting/rsslisting.pro2
-rw-r--r--examples/xml/saxbookmarks/jennifer.xbel2
-rw-r--r--examples/xml/saxbookmarks/main.cpp4
-rw-r--r--examples/xml/saxbookmarks/mainwindow.cpp9
-rw-r--r--examples/xml/saxbookmarks/saxbookmarks.pro8
-rw-r--r--examples/xml/streambookmarks/mainwindow.cpp10
-rw-r--r--examples/xml/streambookmarks/streambookmarks.pro2
-rw-r--r--examples/xml/streambookmarks/xbelreader.cpp129
-rw-r--r--examples/xml/streambookmarks/xbelreader.h6
-rw-r--r--examples/xml/streambookmarks/xbelwriter.cpp32
-rw-r--r--examples/xml/streambookmarks/xbelwriter.h3
-rw-r--r--examples/xml/xml.pro5
-rw-r--r--examples/xml/xmlstreamlint/xmlstreamlint.pro2
-rw-r--r--examples/xmlpatterns/filetree/filetree.pro2
-rw-r--r--examples/xmlpatterns/recipes/recipes.pro2
-rw-r--r--examples/xmlpatterns/schema/files/contact.xsd25
-rw-r--r--examples/xmlpatterns/schema/files/invalid_contact.xml11
-rw-r--r--examples/xmlpatterns/schema/files/invalid_order.xml13
-rw-r--r--examples/xmlpatterns/schema/files/invalid_recipe.xml14
-rw-r--r--examples/xmlpatterns/schema/files/order.xsd23
-rw-r--r--examples/xmlpatterns/schema/files/recipe.xsd40
-rw-r--r--examples/xmlpatterns/schema/files/valid_contact.xml11
-rw-r--r--examples/xmlpatterns/schema/files/valid_order.xml18
-rw-r--r--examples/xmlpatterns/schema/files/valid_recipe.xml13
-rw-r--r--examples/xmlpatterns/schema/main.cpp54
-rw-r--r--examples/xmlpatterns/schema/mainwindow.cpp218
-rw-r--r--examples/xmlpatterns/schema/mainwindow.h68
-rw-r--r--examples/xmlpatterns/schema/schema.pro11
-rw-r--r--examples/xmlpatterns/schema/schema.qrc13
-rw-r--r--examples/xmlpatterns/schema/schema.ui71
-rw-r--r--examples/xmlpatterns/trafficinfo/mainwindow.cpp5
-rw-r--r--examples/xmlpatterns/trafficinfo/stationdialog.cpp4
-rw-r--r--examples/xmlpatterns/xmlpatterns.pro5
-rw-r--r--examples/xmlpatterns/xquery/globalVariables/globalVariables.pro2
-rw-r--r--examples/xmlpatterns/xquery/xquery.pro2
-rw-r--r--mkspecs/common/linux.conf6
-rw-r--r--mkspecs/common/mac-g++.conf2
-rw-r--r--mkspecs/common/mac.conf5
-rw-r--r--mkspecs/common/symbian/qplatformdefs.h166
-rw-r--r--mkspecs/common/symbian/stl-off/new5
-rw-r--r--mkspecs/common/symbian/symbian.conf141
-rw-r--r--mkspecs/features/debug_and_release.prf2
-rw-r--r--mkspecs/features/designer.prf3
-rw-r--r--mkspecs/features/egl.prf3
-rw-r--r--mkspecs/features/mac/default_post.prf15
-rw-r--r--mkspecs/features/mac/objective_c.prf3
-rw-r--r--mkspecs/features/moc.prf4
-rw-r--r--mkspecs/features/qt.prf13
-rw-r--r--mkspecs/features/qt_config.prf2
-rw-r--r--mkspecs/features/qttest_p4.prf80
-rw-r--r--mkspecs/features/symbian/application_icon.prf39
-rw-r--r--mkspecs/features/symbian/armcc_warnings.prf10
-rw-r--r--mkspecs/features/symbian/data_caging_paths.prf80
-rw-r--r--mkspecs/features/symbian/default_post.prf31
-rw-r--r--mkspecs/features/symbian/default_pre.prf2
-rw-r--r--mkspecs/features/symbian/epocallowdlldata.prf1
-rw-r--r--mkspecs/features/symbian/moc.prf16
-rw-r--r--mkspecs/features/symbian/platform_paths.prf480
-rw-r--r--mkspecs/features/symbian/qt.prf19
-rw-r--r--mkspecs/features/symbian/stl.prf36
-rw-r--r--mkspecs/features/symbian/stl_off.prf2
-rw-r--r--mkspecs/features/uic.prf8
-rw-r--r--mkspecs/features/unix/dylib.prf2
-rw-r--r--mkspecs/features/unix/opengl.prf2
-rw-r--r--mkspecs/features/unix/openvg.prf15
-rw-r--r--mkspecs/features/unix/x11lib.prf2
-rw-r--r--mkspecs/features/unix/x11sm.prf2
-rw-r--r--mkspecs/features/vxworks.prf63
-rw-r--r--mkspecs/features/win32/openvg.prf7
-rw-r--r--mkspecs/features/win32/rtti_off.prf1
-rw-r--r--mkspecs/linux-g++-gles2-experimental/qmake.conf22
-rw-r--r--mkspecs/linux-g++-gles2-experimental/qplatformdefs.h164
-rw-r--r--mkspecs/symbian-abld/qmake.conf9
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm39
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_extra_pre_targetdep.flm35
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_generate_temp_dirs.flm22
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_post_link.flm34
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm39
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qt.xml46
-rw-r--r--mkspecs/symbian-sbsv2/qmake.conf9
-rw-r--r--mkspecs/unsupported/qnx-g++/qmake.conf59
-rw-r--r--mkspecs/unsupported/qnx-g++/qplatformdefs.h172
-rw-r--r--mkspecs/unsupported/qws/qnx-generic-g++/qmake.conf102
-rw-r--r--mkspecs/unsupported/qws/qnx-generic-g++/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/qws/qnx-i386-g++/qmake.conf97
-rw-r--r--mkspecs/unsupported/qws/qnx-i386-g++/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/qws/qnx-ppc-g++/qmake.conf97
-rw-r--r--mkspecs/unsupported/qws/qnx-ppc-g++/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/vxworks-ppc-dcc/qmake.conf111
-rw-r--r--mkspecs/unsupported/vxworks-ppc-dcc/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/vxworks-ppc-g++/qmake.conf37
-rw-r--r--mkspecs/unsupported/vxworks-ppc-g++/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/vxworks-simpentium-dcc/qmake.conf110
-rw-r--r--mkspecs/unsupported/vxworks-simpentium-dcc/qplatformdefs.h42
-rw-r--r--mkspecs/unsupported/vxworks-simpentium-g++/qmake.conf37
-rw-r--r--mkspecs/unsupported/vxworks-simpentium-g++/qplatformdefs.h128
-rw-r--r--mkspecs/win32-g++/qplatformdefs.h2
-rw-r--r--mkspecs/win32-icc/qmake.conf2
-rw-r--r--mkspecs/win32-mwc/qmake.conf110
-rw-r--r--mkspecs/win32-mwc/qplatformdefs.h164
-rw-r--r--mkspecs/wincewm65professional-msvc2005/default_post.prf1
-rw-r--r--mkspecs/wincewm65professional-msvc2005/qmake.conf5
-rw-r--r--mkspecs/wincewm65professional-msvc2005/qplatformdefs.h42
-rw-r--r--mkspecs/wincewm65professional-msvc2008/default_post.prf1
-rw-r--r--mkspecs/wincewm65professional-msvc2008/qmake.conf3
-rw-r--r--mkspecs/wincewm65professional-msvc2008/qplatformdefs.h43
-rw-r--r--projects.pro27
-rw-r--r--qmake/Makefile.unix192
-rw-r--r--qmake/Makefile.win32262
-rw-r--r--qmake/Makefile.win32-g++198
-rw-r--r--qmake/Makefile.win32-g++-sh196
-rw-r--r--qmake/generators/mac/pbuilder_pbx.cpp2
-rw-r--r--qmake/generators/makefile.cpp231
-rw-r--r--qmake/generators/makefile.h3
-rw-r--r--qmake/generators/makefiledeps.cpp14
-rw-r--r--qmake/generators/metamakefile.cpp289
-rw-r--r--qmake/generators/symbian/epocroot.h51
-rw-r--r--qmake/generators/symbian/initprojectdeploy_symbian.cpp380
-rw-r--r--qmake/generators/symbian/initprojectdeploy_symbian.h75
-rw-r--r--qmake/generators/symbian/symmake.cpp1725
-rw-r--r--qmake/generators/symbian/symmake.h155
-rw-r--r--qmake/generators/symbian/symmake_abld.cpp452
-rw-r--r--qmake/generators/symbian/symmake_abld.h68
-rw-r--r--qmake/generators/symbian/symmake_sbsv2.cpp416
-rw-r--r--qmake/generators/symbian/symmake_sbsv2.h71
-rw-r--r--qmake/generators/unix/unixmake.cpp7
-rw-r--r--qmake/generators/unix/unixmake2.cpp19
-rw-r--r--qmake/generators/win32/mingw_make.cpp11
-rw-r--r--qmake/generators/win32/mingw_make.h1
-rw-r--r--qmake/generators/win32/msvc_dsp.cpp2
-rw-r--r--qmake/generators/win32/msvc_nmake.cpp1
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp22
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp60
-rw-r--r--qmake/generators/win32/winmakefile.cpp2
-rw-r--r--qmake/generators/win32/winmakefile.h2
-rw-r--r--qmake/main.cpp11
-rw-r--r--qmake/option.cpp20
-rw-r--r--qmake/option.h3
-rw-r--r--qmake/project.cpp294
-rw-r--r--qmake/project.h15
-rw-r--r--qmake/qmake.pri34
-rw-r--r--qmake/qmake.pro10
-rw-r--r--selfsigned.cer19
-rw-r--r--selfsigned.key12
-rw-r--r--src/3rdparty/clucene/src/CLucene/StdHeader.cpp2
-rw-r--r--src/3rdparty/clucene/src/CLucene/StdHeader.h10
-rw-r--r--src/3rdparty/clucene/src/CLucene/config/define_std.h3
-rw-r--r--src/3rdparty/clucene/src/CLucene/config/repl_tchar.h20
-rw-r--r--src/3rdparty/clucene/src/CLucene/store/FSDirectory.cpp2
-rw-r--r--src/3rdparty/clucene/src/CLucene/util/Misc.cpp19
-rw-r--r--src/3rdparty/clucene/src/CLucene/util/fileinputstream.cpp5
-rw-r--r--src/3rdparty/easing/easing.cpp670
-rw-r--r--src/3rdparty/easing/legal.qdoc35
-rw-r--r--src/3rdparty/freetype/ChangeLog1620
-rw-r--r--src/3rdparty/freetype/ChangeLog.218
-rw-r--r--src/3rdparty/freetype/ChangeLog.222
-rw-r--r--src/3rdparty/freetype/Jamfile4
-rw-r--r--src/3rdparty/freetype/README10
-rw-r--r--src/3rdparty/freetype/README.CVS16
-rw-r--r--src/3rdparty/freetype/autogen.sh121
-rw-r--r--src/3rdparty/freetype/builds/amiga/include/freetype/config/ftmodule.h40
-rw-r--r--src/3rdparty/freetype/builds/amiga/makefile20
-rw-r--r--src/3rdparty/freetype/builds/amiga/makefile.os420
-rw-r--r--src/3rdparty/freetype/builds/amiga/smakefile14
-rw-r--r--src/3rdparty/freetype/builds/freetype.mk6
-rw-r--r--src/3rdparty/freetype/builds/mac/FreeType.m68k_cfm.make.txt20
-rw-r--r--src/3rdparty/freetype/builds/mac/FreeType.m68k_far.make.txt20
-rw-r--r--src/3rdparty/freetype/builds/mac/FreeType.ppc_carbon.make.txt19
-rw-r--r--src/3rdparty/freetype/builds/mac/FreeType.ppc_classic.make.txt19
-rw-r--r--src/3rdparty/freetype/builds/mac/README6
-rw-r--r--src/3rdparty/freetype/builds/mac/ftmac.c185
-rw-r--r--src/3rdparty/freetype/builds/symbian/bld.inf5
-rw-r--r--src/3rdparty/freetype/builds/symbian/freetype.mmp8
-rw-r--r--src/3rdparty/freetype/builds/toplevel.mk16
-rw-r--r--src/3rdparty/freetype/builds/unix/aclocal.m4160
-rwxr-xr-xsrc/3rdparty/freetype/builds/unix/config.guess35
-rwxr-xr-xsrc/3rdparty/freetype/builds/unix/config.sub32
-rwxr-xr-xsrc/3rdparty/freetype/builds/unix/configure951
-rw-r--r--src/3rdparty/freetype/builds/unix/configure.ac159
-rw-r--r--src/3rdparty/freetype/builds/unix/configure.raw157
-rw-r--r--src/3rdparty/freetype/builds/unix/freetype-config.in27
-rw-r--r--src/3rdparty/freetype/builds/unix/freetype2.in3
-rw-r--r--src/3rdparty/freetype/builds/unix/ftconfig.in151
-rw-r--r--src/3rdparty/freetype/builds/unix/ftsystem.c18
-rwxr-xr-xsrc/3rdparty/freetype/builds/unix/ltmain.sh782
-rw-r--r--src/3rdparty/freetype/builds/unix/unix-def.in6
-rw-r--r--src/3rdparty/freetype/builds/vms/ftconfig.h10
-rw-r--r--src/3rdparty/freetype/builds/win32/vc2005/freetype.sln31
-rw-r--r--src/3rdparty/freetype/builds/win32/vc2005/freetype.vcproj636
-rw-r--r--src/3rdparty/freetype/builds/win32/vc2005/index.html37
-rw-r--r--src/3rdparty/freetype/builds/win32/vc2008/freetype.sln31
-rw-r--r--src/3rdparty/freetype/builds/win32/vc2008/freetype.vcproj2160
-rw-r--r--src/3rdparty/freetype/builds/win32/vc2008/index.html37
-rw-r--r--src/3rdparty/freetype/builds/win32/visualc/freetype.dsp24
-rw-r--r--src/3rdparty/freetype/builds/win32/visualc/freetype.sln31
-rw-r--r--src/3rdparty/freetype/builds/win32/visualc/freetype.vcproj2155
-rw-r--r--src/3rdparty/freetype/builds/win32/visualc/index.html10
-rw-r--r--src/3rdparty/freetype/builds/win32/visualce/freetype.dsp396
-rw-r--r--src/3rdparty/freetype/builds/win32/visualce/freetype.dsw29
-rw-r--r--src/3rdparty/freetype/builds/win32/visualce/freetype.vcproj13861
-rw-r--r--src/3rdparty/freetype/builds/win32/visualce/index.html47
-rw-r--r--src/3rdparty/freetype/builds/wince/ftdebug.c248
-rw-r--r--src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.sln158
-rw-r--r--src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.vcproj3825
-rw-r--r--src/3rdparty/freetype/builds/wince/vc2005-ce/index.html47
-rw-r--r--src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.sln158
-rw-r--r--src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.vcproj13467
-rw-r--r--src/3rdparty/freetype/builds/wince/vc2008-ce/index.html47
-rwxr-xr-xsrc/3rdparty/freetype/configure14
-rw-r--r--src/3rdparty/freetype/devel/ftoption.h34
-rw-r--r--src/3rdparty/freetype/docs/CHANGES171
-rw-r--r--src/3rdparty/freetype/docs/INSTALL4
-rw-r--r--src/3rdparty/freetype/docs/INSTALL.ANY18
-rw-r--r--src/3rdparty/freetype/docs/INSTALL.CROSS4
-rw-r--r--src/3rdparty/freetype/docs/INSTALL.GNU4
-rw-r--r--src/3rdparty/freetype/docs/INSTALL.UNIX2
-rw-r--r--src/3rdparty/freetype/docs/VERSION.DLL5
-rw-r--r--src/3rdparty/freetype/docs/formats.txt28
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-base_interface.html508
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-basic_types.html266
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-bdf_fonts.html36
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-bitmap_handling.html60
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-cache_subsystem.html151
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-cid_fonts.html112
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-computations.html56
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-font_formats.html10
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-gasp_table.html10
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-glyph_management.html101
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-glyph_stroker.html64
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-glyph_variants.html24
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-gx_validation.html24
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-gzip.html10
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-header_file_macros.html294
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-incremental.html48
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-index.html493
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-lcd_filtering.html12
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-list_processing.html38
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-lzw.html10
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-mac_specific.html24
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-module_management.html40
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-multiple_masters.html32
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-ot_validation.html10
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-outline_processing.html104
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-pfr_fonts.html20
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-quick_advance.html177
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-raster.html42
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-sfnt_names.html16
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-sizes_management.html16
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-system_interface.html32
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-toc.html32
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-truetype_engine.html10
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-truetype_tables.html50
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-type1_tables.html88
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-user_allocation.html10
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-version.html14
-rw-r--r--src/3rdparty/freetype/docs/reference/ft2-winfnt_fonts.html22
-rw-r--r--src/3rdparty/freetype/docs/release16
-rw-r--r--src/3rdparty/freetype/include/freetype/config/ftconfig.h103
-rw-r--r--src/3rdparty/freetype/include/freetype/config/ftheader.h82
-rw-r--r--src/3rdparty/freetype/include/freetype/config/ftmodule.h36
-rw-r--r--src/3rdparty/freetype/include/freetype/config/ftoption.h48
-rw-r--r--src/3rdparty/freetype/include/freetype/config/ftstdlib.h10
-rw-r--r--src/3rdparty/freetype/include/freetype/freetype.h684
-rw-r--r--src/3rdparty/freetype/include/freetype/ftadvanc.h179
-rw-r--r--src/3rdparty/freetype/include/freetype/ftbbox.h4
-rw-r--r--src/3rdparty/freetype/include/freetype/ftbdf.h89
-rw-r--r--src/3rdparty/freetype/include/freetype/ftbitmap.h41
-rw-r--r--src/3rdparty/freetype/include/freetype/ftcache.h76
-rw-r--r--src/3rdparty/freetype/include/freetype/ftchapters.h1
-rw-r--r--src/3rdparty/freetype/include/freetype/ftcid.h76
-rw-r--r--src/3rdparty/freetype/include/freetype/ftgasp.h11
-rw-r--r--src/3rdparty/freetype/include/freetype/ftglyph.h82
-rw-r--r--src/3rdparty/freetype/include/freetype/ftgxval.h10
-rw-r--r--src/3rdparty/freetype/include/freetype/ftgzip.h2
-rw-r--r--src/3rdparty/freetype/include/freetype/ftimage.h190
-rw-r--r--src/3rdparty/freetype/include/freetype/ftincrem.h8
-rw-r--r--src/3rdparty/freetype/include/freetype/ftlcdfil.h12
-rw-r--r--src/3rdparty/freetype/include/freetype/ftlist.h14
-rw-r--r--src/3rdparty/freetype/include/freetype/ftlzw.h2
-rw-r--r--src/3rdparty/freetype/include/freetype/ftmac.h16
-rw-r--r--src/3rdparty/freetype/include/freetype/ftmm.h28
-rw-r--r--src/3rdparty/freetype/include/freetype/ftmodapi.h26
-rw-r--r--src/3rdparty/freetype/include/freetype/ftotval.h2
-rw-r--r--src/3rdparty/freetype/include/freetype/ftoutln.h70
-rw-r--r--src/3rdparty/freetype/include/freetype/ftpfr.h16
-rw-r--r--src/3rdparty/freetype/include/freetype/ftrender.h8
-rw-r--r--src/3rdparty/freetype/include/freetype/ftsizes.h12
-rw-r--r--src/3rdparty/freetype/include/freetype/ftsnames.h8
-rw-r--r--src/3rdparty/freetype/include/freetype/ftstroke.h58
-rw-r--r--src/3rdparty/freetype/include/freetype/ftsynth.h27
-rw-r--r--src/3rdparty/freetype/include/freetype/ftsystem.h8
-rw-r--r--src/3rdparty/freetype/include/freetype/fttypes.h18
-rw-r--r--src/3rdparty/freetype/include/freetype/ftwinfnt.h6
-rw-r--r--src/3rdparty/freetype/include/freetype/ftxf86.h4
-rw-r--r--src/3rdparty/freetype/include/freetype/internal/ftdebug.h8
-rw-r--r--src/3rdparty/freetype/include/freetype/internal/ftdriver.h11
-rw-r--r--src/3rdparty/freetype/include/freetype/internal/ftgloadr.h8
-rw-r--r--src/3rdparty/freetype/include/freetype/internal/psaux.h9
-rw-r--r--src/3rdparty/freetype/include/freetype/internal/services/svcid.h11
-rw-r--r--src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h7
-rw-r--r--src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h9
-rw-r--r--src/3rdparty/freetype/include/freetype/internal/t1types.h24
-rw-r--r--src/3rdparty/freetype/include/freetype/t1tables.h36
-rw-r--r--src/3rdparty/freetype/include/freetype/ttnameid.h273
-rw-r--r--src/3rdparty/freetype/include/freetype/tttables.h36
-rw-r--r--src/3rdparty/freetype/include/freetype/tttags.h9
-rw-r--r--src/3rdparty/freetype/modules.cfg57
-rw-r--r--src/3rdparty/freetype/src/autofit/afcjk.c59
-rw-r--r--src/3rdparty/freetype/src/autofit/afhints.c8
-rw-r--r--src/3rdparty/freetype/src/autofit/aflatin.c55
-rw-r--r--src/3rdparty/freetype/src/autofit/aflatin2.c10
-rw-r--r--src/3rdparty/freetype/src/autofit/aftypes.h7
-rw-r--r--src/3rdparty/freetype/src/autofit/module.mk2
-rw-r--r--src/3rdparty/freetype/src/base/Jamfile25
-rw-r--r--src/3rdparty/freetype/src/base/ftadvanc.c163
-rw-r--r--src/3rdparty/freetype/src/base/ftbase.c5
-rw-r--r--src/3rdparty/freetype/src/base/ftbase.h57
-rw-r--r--src/3rdparty/freetype/src/base/ftbitmap.c35
-rw-r--r--src/3rdparty/freetype/src/base/ftcalc.c134
-rw-r--r--src/3rdparty/freetype/src/base/ftcid.c56
-rw-r--r--src/3rdparty/freetype/src/base/ftdbgmem.c7
-rw-r--r--src/3rdparty/freetype/src/base/ftdebug.c2
-rw-r--r--src/3rdparty/freetype/src/base/ftfstype.c62
-rw-r--r--src/3rdparty/freetype/src/base/ftglyph.c64
-rw-r--r--src/3rdparty/freetype/src/base/ftinit.c6
-rw-r--r--src/3rdparty/freetype/src/base/ftlcdfil.c12
-rw-r--r--src/3rdparty/freetype/src/base/ftmac.c205
-rw-r--r--src/3rdparty/freetype/src/base/ftmm.c4
-rw-r--r--src/3rdparty/freetype/src/base/ftobjs.c304
-rw-r--r--src/3rdparty/freetype/src/base/ftotval.c3
-rw-r--r--src/3rdparty/freetype/src/base/ftoutln.c62
-rw-r--r--src/3rdparty/freetype/src/base/ftpatent.c4
-rw-r--r--src/3rdparty/freetype/src/base/ftpfr.c33
-rw-r--r--src/3rdparty/freetype/src/base/ftrfork.c18
-rw-r--r--src/3rdparty/freetype/src/base/ftstream.c7
-rw-r--r--src/3rdparty/freetype/src/base/ftstroke.c137
-rw-r--r--src/3rdparty/freetype/src/base/ftsynth.c30
-rw-r--r--src/3rdparty/freetype/src/base/ftsystem.c4
-rw-r--r--src/3rdparty/freetype/src/base/rules.mk18
-rw-r--r--src/3rdparty/freetype/src/bdf/bdfdrivr.c13
-rw-r--r--src/3rdparty/freetype/src/bdf/bdflib.c9
-rw-r--r--src/3rdparty/freetype/src/bdf/module.mk2
-rw-r--r--src/3rdparty/freetype/src/bdf/rules.mk7
-rw-r--r--src/3rdparty/freetype/src/cache/ftccmap.c20
-rw-r--r--src/3rdparty/freetype/src/cache/ftcmanag.c9
-rw-r--r--src/3rdparty/freetype/src/cache/rules.mk10
-rw-r--r--src/3rdparty/freetype/src/cff/cffdrivr.c105
-rw-r--r--src/3rdparty/freetype/src/cff/cffgload.c491
-rw-r--r--src/3rdparty/freetype/src/cff/cffgload.h1
-rw-r--r--src/3rdparty/freetype/src/cff/cffload.c13
-rw-r--r--src/3rdparty/freetype/src/cff/cffload.h5
-rw-r--r--src/3rdparty/freetype/src/cff/cffobjs.c243
-rw-r--r--src/3rdparty/freetype/src/cff/cffparse.c17
-rw-r--r--src/3rdparty/freetype/src/cff/module.mk2
-rw-r--r--src/3rdparty/freetype/src/cid/cidload.c34
-rw-r--r--src/3rdparty/freetype/src/cid/cidobjs.c81
-rw-r--r--src/3rdparty/freetype/src/cid/cidriver.c49
-rw-r--r--src/3rdparty/freetype/src/cid/cidtoken.h13
-rw-r--r--src/3rdparty/freetype/src/cid/module.mk2
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvcommn.c12
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvcommn.h8
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmort.c2
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmorx.c5
-rw-r--r--src/3rdparty/freetype/src/gxvalid/module.mk2
-rw-r--r--src/3rdparty/freetype/src/gzip/ftgzip.c6
-rw-r--r--src/3rdparty/freetype/src/gzip/inftrees.c3
-rw-r--r--src/3rdparty/freetype/src/gzip/zconf.h7
-rw-r--r--src/3rdparty/freetype/src/gzip/zlib.h7
-rw-r--r--src/3rdparty/freetype/src/lzw/ftlzw.c5
-rw-r--r--src/3rdparty/freetype/src/otvalid/Jamfile2
-rw-r--r--src/3rdparty/freetype/src/otvalid/module.mk2
-rw-r--r--src/3rdparty/freetype/src/otvalid/otvalid.h1
-rw-r--r--src/3rdparty/freetype/src/otvalid/otvcommn.h10
-rw-r--r--src/3rdparty/freetype/src/otvalid/otvgdef.c5
-rw-r--r--src/3rdparty/freetype/src/otvalid/otvgpos.c9
-rw-r--r--src/3rdparty/freetype/src/otvalid/otvmath.c4
-rw-r--r--src/3rdparty/freetype/src/otvalid/otvmod.c4
-rw-r--r--src/3rdparty/freetype/src/pcf/module.mk2
-rw-r--r--src/3rdparty/freetype/src/pcf/pcfdrivr.c17
-rw-r--r--src/3rdparty/freetype/src/pcf/pcfread.c14
-rw-r--r--src/3rdparty/freetype/src/pcf/rules.mk11
-rw-r--r--src/3rdparty/freetype/src/pfr/module.mk2
-rw-r--r--src/3rdparty/freetype/src/pfr/pfrdrivr.c11
-rw-r--r--src/3rdparty/freetype/src/pfr/pfrobjs.c11
-rw-r--r--src/3rdparty/freetype/src/psaux/afmparse.c9
-rw-r--r--src/3rdparty/freetype/src/psaux/module.mk2
-rw-r--r--src/3rdparty/freetype/src/psaux/psobjs.c46
-rw-r--r--src/3rdparty/freetype/src/psaux/t1decode.c17
-rw-r--r--src/3rdparty/freetype/src/pshinter/module.mk2
-rw-r--r--src/3rdparty/freetype/src/pshinter/pshalgo.c4
-rw-r--r--src/3rdparty/freetype/src/psnames/module.mk2
-rw-r--r--src/3rdparty/freetype/src/psnames/psmodule.c95
-rw-r--r--src/3rdparty/freetype/src/psnames/pstables.h9
-rw-r--r--src/3rdparty/freetype/src/raster/ftmisc.h5
-rw-r--r--src/3rdparty/freetype/src/raster/ftraster.c447
-rw-r--r--src/3rdparty/freetype/src/raster/module.mk2
-rw-r--r--src/3rdparty/freetype/src/raster/rules.mk3
-rw-r--r--src/3rdparty/freetype/src/sfnt/Jamfile2
-rw-r--r--src/3rdparty/freetype/src/sfnt/module.mk2
-rw-r--r--src/3rdparty/freetype/src/sfnt/rules.mk9
-rw-r--r--src/3rdparty/freetype/src/sfnt/sfdriver.c29
-rw-r--r--src/3rdparty/freetype/src/sfnt/sfobjs.c278
-rw-r--r--src/3rdparty/freetype/src/sfnt/ttcmap.c160
-rw-r--r--src/3rdparty/freetype/src/sfnt/ttkern.c29
-rw-r--r--src/3rdparty/freetype/src/sfnt/ttload.c181
-rw-r--r--src/3rdparty/freetype/src/sfnt/ttmtx.c14
-rw-r--r--src/3rdparty/freetype/src/sfnt/ttpost.c15
-rw-r--r--src/3rdparty/freetype/src/sfnt/ttsbit.c23
-rw-r--r--src/3rdparty/freetype/src/sfnt/ttsbit.h4
-rw-r--r--src/3rdparty/freetype/src/sfnt/ttsbit0.c129
-rw-r--r--src/3rdparty/freetype/src/smooth/ftgrays.c285
-rw-r--r--src/3rdparty/freetype/src/smooth/ftsmooth.c8
-rw-r--r--src/3rdparty/freetype/src/smooth/module.mk6
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/content.py14
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/sources.py10
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/tohtml.py106
-rw-r--r--src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c10
-rw-r--r--src/3rdparty/freetype/src/tools/glnames.py13
-rw-r--r--src/3rdparty/freetype/src/truetype/module.mk2
-rw-r--r--src/3rdparty/freetype/src/truetype/ttdriver.c68
-rw-r--r--src/3rdparty/freetype/src/truetype/ttgload.c120
-rw-r--r--src/3rdparty/freetype/src/truetype/ttgload.h16
-rw-r--r--src/3rdparty/freetype/src/truetype/ttgxvar.c14
-rw-r--r--src/3rdparty/freetype/src/truetype/ttinterp.c37
-rw-r--r--src/3rdparty/freetype/src/truetype/ttobjs.c94
-rw-r--r--src/3rdparty/freetype/src/truetype/ttobjs.h6
-rw-r--r--src/3rdparty/freetype/src/truetype/ttpload.c65
-rw-r--r--src/3rdparty/freetype/src/type1/module.mk2
-rw-r--r--src/3rdparty/freetype/src/type1/t1afm.c9
-rw-r--r--src/3rdparty/freetype/src/type1/t1driver.c58
-rw-r--r--src/3rdparty/freetype/src/type1/t1gload.c77
-rw-r--r--src/3rdparty/freetype/src/type1/t1gload.h9
-rw-r--r--src/3rdparty/freetype/src/type1/t1load.c70
-rw-r--r--src/3rdparty/freetype/src/type1/t1objs.c134
-rw-r--r--src/3rdparty/freetype/src/type1/t1tokens.h13
-rw-r--r--src/3rdparty/freetype/src/type42/module.mk2
-rw-r--r--src/3rdparty/freetype/src/type42/rules.mk5
-rw-r--r--src/3rdparty/freetype/src/type42/t42drivr.c56
-rw-r--r--src/3rdparty/freetype/src/type42/t42objs.c76
-rw-r--r--src/3rdparty/freetype/src/type42/t42parse.c10
-rw-r--r--src/3rdparty/freetype/src/type42/t42types.h6
-rw-r--r--src/3rdparty/freetype/src/winfonts/module.mk2
-rw-r--r--src/3rdparty/freetype/src/winfonts/winfnt.c35
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-gpos.c2
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-impl.c4
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp28
-rw-r--r--src/3rdparty/harfbuzz/src/harfbuzz-stream.c2
-rw-r--r--src/3rdparty/libjpeg/jmorecfg.h5
-rw-r--r--src/3rdparty/libpng/pngconf.h6
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.h4
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_unix.c2
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffio.h2
-rw-r--r--src/3rdparty/patches/freetype-2.3.6-vxworks.patch35
-rw-r--r--src/3rdparty/patches/libjpeg-6b-vxworks.patch23
-rw-r--r--src/3rdparty/patches/libpng-1.2.20-vxworks.patch13
-rw-r--r--src/3rdparty/patches/libtiff-3.8.2-vxworks.patch11
-rw-r--r--src/3rdparty/patches/sqlite-3.5.6-vxworks.patch68
-rw-r--r--src/3rdparty/phonon/ds9/abstractvideorenderer.cpp4
-rw-r--r--src/3rdparty/phonon/ds9/backend.cpp17
-rw-r--r--src/3rdparty/phonon/ds9/backend.h4
-rw-r--r--src/3rdparty/phonon/ds9/effect.cpp7
-rw-r--r--src/3rdparty/phonon/ds9/fakesource.cpp34
-rw-r--r--src/3rdparty/phonon/ds9/iodevicereader.cpp91
-rw-r--r--src/3rdparty/phonon/ds9/iodevicereader.h1
-rw-r--r--src/3rdparty/phonon/ds9/mediagraph.cpp22
-rw-r--r--src/3rdparty/phonon/ds9/mediaobject.cpp162
-rw-r--r--src/3rdparty/phonon/ds9/mediaobject.h6
-rw-r--r--src/3rdparty/phonon/ds9/qasyncreader.cpp72
-rw-r--r--src/3rdparty/phonon/ds9/qasyncreader.h6
-rw-r--r--src/3rdparty/phonon/ds9/qaudiocdreader.cpp54
-rw-r--r--src/3rdparty/phonon/ds9/qbasefilter.cpp33
-rw-r--r--src/3rdparty/phonon/ds9/qbasefilter.h4
-rw-r--r--src/3rdparty/phonon/ds9/qmeminputpin.cpp115
-rw-r--r--src/3rdparty/phonon/ds9/qmeminputpin.h9
-rw-r--r--src/3rdparty/phonon/ds9/qpin.cpp69
-rw-r--r--src/3rdparty/phonon/ds9/qpin.h7
-rw-r--r--src/3rdparty/phonon/ds9/videorenderer_soft.cpp40
-rw-r--r--src/3rdparty/phonon/ds9/videowidget.cpp19
-rw-r--r--src/3rdparty/phonon/ds9/volumeeffect.cpp17
-rw-r--r--src/3rdparty/phonon/gstreamer/backend.cpp2
-rw-r--r--src/3rdparty/phonon/phonon/abstractmediastream.cpp1
-rw-r--r--src/3rdparty/phonon/phonon/abstractmediastream.h2
-rw-r--r--src/3rdparty/phonon/phonon/abstractmediastream_p.h2
-rw-r--r--src/3rdparty/phonon/phonon/audiooutput.cpp14
-rw-r--r--src/3rdparty/phonon/phonon/backendcapabilities.cpp14
-rw-r--r--src/3rdparty/phonon/phonon/backendcapabilities.h13
-rw-r--r--src/3rdparty/phonon/phonon/effect.cpp6
-rw-r--r--src/3rdparty/phonon/phonon/effectwidget.cpp21
-rw-r--r--src/3rdparty/phonon/phonon/factory.cpp43
-rw-r--r--src/3rdparty/phonon/phonon/medianode.cpp4
-rw-r--r--src/3rdparty/phonon/phonon/mediaobject.cpp12
-rw-r--r--src/3rdparty/phonon/phonon/mediaobject.h22
-rw-r--r--src/3rdparty/phonon/phonon/objectdescriptionmodel.cpp4
-rw-r--r--src/3rdparty/phonon/phonon/objectdescriptionmodel.h8
-rw-r--r--src/3rdparty/phonon/phonon/path.cpp24
-rw-r--r--src/3rdparty/phonon/phonon/phonon_export.h6
-rw-r--r--src/3rdparty/phonon/phonon/volumeslider.cpp2
-rw-r--r--src/3rdparty/phonon/qt7/backend.mm2
-rw-r--r--src/3rdparty/phonon/qt7/mediaobject.h22
-rw-r--r--src/3rdparty/phonon/qt7/mediaobject.mm163
-rw-r--r--src/3rdparty/phonon/qt7/quicktimevideoplayer.h8
-rw-r--r--src/3rdparty/phonon/qt7/quicktimevideoplayer.mm101
-rw-r--r--src/3rdparty/phonon/qt7/videoframe.mm24
-rw-r--r--src/3rdparty/sqlite/sqlite3.c25
-rw-r--r--src/3rdparty/webkit/ChangeLog924
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/APICast.h34
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSBase.cpp12
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSBase.h18
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSBasePrivate.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackConstructor.cpp15
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackConstructor.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackFunction.cpp18
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackFunction.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackObject.h22
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackObjectFunctions.h166
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSClassRef.cpp2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSClassRef.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSContextRef.cpp8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSContextRef.h10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSObjectRef.cpp100
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSObjectRef.h11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSStringRef.cpp3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSStringRefCF.cpp9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSValueRef.cpp176
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/WebKitAvailability.h85
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/ChangeLog27097
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/ChangeLog-2007-10-148
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/ChangeLog-2009-06-1639978
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/DerivedSources.make7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/Info.plist2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.gypi452
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.order3425
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri107
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro13
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCorePrefix.h9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/ARMAssembler.cpp353
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/ARMAssembler.h706
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/ARMv7Assembler.h1759
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/AbstractMacroAssembler.h541
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/AssemblerBuffer.h19
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h305
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/CodeLocation.h186
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/LinkBuffer.h195
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssembler.h1820
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerARM.h797
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerARMv7.h1082
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerCodeRef.h188
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerX86.h191
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerX86Common.h780
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerX86_64.h480
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/RepatchBuffer.h136
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/X86Assembler.h393
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp235
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.h199
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/EvalCodeCache.h13
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/Instruction.h40
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/JumpTable.h13
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/Opcode.h15
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/SamplingTool.cpp224
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/SamplingTool.h230
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/StructureStubInfo.h16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp383
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.h83
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecompiler/RegisterID.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecompiler/SegmentedVector.h170
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/config.h12
-rwxr-xr-xsrc/3rdparty/webkit/JavaScriptCore/create_hash_table6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/debugger/Debugger.cpp16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/debugger/Debugger.h59
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerActivation.cpp103
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerActivation.h63
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerCallFrame.cpp15
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerCallFrame.h13
-rwxr-xr-xsrc/3rdparty/webkit/JavaScriptCore/docs/make-bytecode-docs.pl4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/ArrayPrototype.lut.h11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/DatePrototype.lut.h13
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/Grammar.cpp1121
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/Grammar.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/JSONObject.lut.h15
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/Lexer.lut.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/MathObject.lut.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/NumberConstructor.lut.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/RegExpConstructor.lut.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/RegExpObject.lut.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/StringPrototype.lut.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/CachedCall.h70
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/CallFrame.cpp18
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/CallFrame.h47
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/CallFrameClosure.h60
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp3894
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.h279
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/Register.h120
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/RegisterFile.cpp13
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/RegisterFile.h187
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocator.h100
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp447
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocatorPosix.cpp30
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocatorWin.cpp4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JIT.cpp2179
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JIT.h568
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITArithmetic.cpp1485
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITCall.cpp252
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITCode.h122
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITInlineMethods.h267
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITOpcodes.cpp1181
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITPropertyAccess.cpp799
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITStubCall.h170
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.cpp2764
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.h345
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jsc.cpp244
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jsc.pro31
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Grammar.y471
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Lexer.cpp1505
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h148
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/NodeConstructors.h917
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/NodeInfo.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp1704
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h1982
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Parser.cpp26
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Parser.h43
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/ParserArena.cpp60
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/ParserArena.h64
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/ResultType.h77
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/SourceCode.h8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.cpp109
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/SourcePoolQt.h93
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/SourceProvider.h10
-rwxr-xr-xsrc/3rdparty/webkit/JavaScriptCore/pcre/dftables2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/pcre/pcre_compile.cpp23
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/pcre/pcre_exec.cpp9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/pcre/pcre_internal.h36
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/CallIdentifier.h37
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/HeavyProfile.cpp115
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/HeavyProfile.h63
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/Profile.cpp3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/Profile.h11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/ProfileGenerator.cpp4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/ProfileGenerator.h1
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/ProfileNode.cpp10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/ProfileNode.h10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/Profiler.cpp24
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/Profiler.h10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/ProfilerServer.mm11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/TreeProfile.cpp51
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/profiler/TreeProfile.h51
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ArgList.cpp17
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ArgList.h95
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Arguments.cpp86
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Arguments.h56
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ArrayConstructor.cpp11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ArrayPrototype.cpp633
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/BatchedTransitionOptimizer.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/BooleanConstructor.cpp8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/BooleanConstructor.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/BooleanObject.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/BooleanPrototype.cpp19
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ByteArray.cpp38
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ByteArray.h70
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/CallData.cpp25
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/CallData.h36
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Collector.cpp243
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Collector.h16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/CommonIdentifiers.cpp5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/CommonIdentifiers.h12
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Completion.cpp25
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Completion.h10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ConstructData.cpp29
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ConstructData.h39
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateConstructor.cpp100
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateConversion.cpp101
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateConversion.h60
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.cpp8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.h18
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateMath.cpp1067
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateMath.h191
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DatePrototype.cpp463
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DatePrototype.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Error.cpp7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Error.h8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ErrorConstructor.cpp6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ErrorPrototype.cpp19
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.cpp51
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.h14
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/FunctionConstructor.cpp27
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/FunctionConstructor.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/FunctionPrototype.cpp104
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/FunctionPrototype.h6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/GetterSetter.cpp8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/GetterSetter.h8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Identifier.cpp18
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/InitializeThreading.cpp6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/InternalFunction.cpp20
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/InternalFunction.h10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSActivation.cpp20
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSActivation.h16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.cpp228
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h44
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.cpp16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.h38
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.cpp29
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.h53
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSFunction.cpp77
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSFunction.h69
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.cpp156
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalData.h106
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.cpp144
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.h83
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp77
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObjectFunctions.h28
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSImmediate.cpp41
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSImmediate.h613
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSLock.cpp94
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSLock.h28
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSNotAnObject.cpp13
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSNotAnObject.h12
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSNumberCell.cpp33
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSNumberCell.h396
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSONObject.cpp766
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSONObject.h58
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.cpp172
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.h347
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.cpp6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.h22
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSStaticScopeObject.cpp9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSStaticScopeObject.h9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSString.cpp25
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSString.h16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.cpp25
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.h373
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSVariableObject.cpp10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSVariableObject.h14
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSWrapperObject.cpp4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSWrapperObject.h11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/LiteralParser.cpp449
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/LiteralParser.h110
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Lookup.cpp26
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Lookup.h47
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/MathObject.cpp112
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/MathObject.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NativeErrorConstructor.cpp10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NativeErrorPrototype.cpp4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NativeErrorPrototype.h11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NativeFunctionWrapper.h39
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NumberConstructor.cpp34
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NumberConstructor.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NumberObject.cpp11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NumberObject.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NumberPrototype.cpp108
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ObjectConstructor.cpp9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ObjectPrototype.cpp89
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ObjectPrototype.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Operations.cpp84
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Operations.h411
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/PropertyMapHashTable.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.cpp2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.h10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/PropertySlot.cpp2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/PropertySlot.h50
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Protect.h76
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/PutPropertySlot.h12
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExp.cpp204
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExp.h17
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.cpp151
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.h16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpMatchesArray.h16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.cpp37
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.h12
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpPrototype.cpp59
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ScopeChain.h19
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/SmallStrings.cpp68
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/SmallStrings.h14
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StringConstructor.cpp17
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StringObject.cpp21
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StringObject.h15
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StringObjectThatMasqueradesAsUndefined.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StringPrototype.cpp538
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Structure.cpp281
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Structure.h68
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.cpp39
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.h8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StructureTransitionTable.h13
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/TimeoutChecker.cpp159
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/TimeoutChecker.h76
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/TypeInfo.h15
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/UString.cpp541
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/UString.h273
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wrec/WREC.cpp7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wrec/WRECGenerator.cpp98
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wrec/WRECGenerator.h22
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wrec/WRECParser.cpp36
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ASCIICType.h16
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/AVLTree.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/AlwaysInline.h12
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Assertions.cpp31
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Assertions.h28
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ByteArray.cpp38
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ByteArray.h80
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/CONTRIBUTORS.pthreads-win32137
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/CrossThreadRefCounted.h169
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/CurrentTime.cpp232
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/CurrentTime.h47
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/DateMath.cpp917
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/DateMath.h192
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Deque.h123
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/FastAllocBase.h403
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.cpp451
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.h96
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/GOwnPtr.cpp6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/GOwnPtr.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/HashCountedSet.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/HashMap.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/HashSet.h19
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/HashTraits.h43
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Locker.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/MainThread.cpp73
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/MainThread.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/MessageQueue.h69
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Noncopyable.h11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/NotFound.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/OwnArrayPtr.h6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/OwnFastMallocPtr.h52
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/OwnPtr.h95
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/OwnPtrCommon.h61
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/OwnPtrWin.cpp7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/PassOwnPtr.h177
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/PassRefPtr.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h377
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/PtrAndFlags.h64
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/RandomNumber.cpp57
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/RandomNumber.h8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/RandomNumberSeed.h27
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/RefCounted.h48
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/RefPtr.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/RetainPtr.h11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/SegmentedVector.h252
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/StdLibExtras.h25
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/StringExtras.h8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/TCPageMap.h33
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/TCSystemAlloc.cpp56
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/TCSystemAlloc.h8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ThreadSpecific.h61
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ThreadSpecificWin.cpp17
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Threading.cpp26
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Threading.h116
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ThreadingGtk.cpp244
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ThreadingNone.cpp9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ThreadingPthreads.cpp194
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ThreadingQt.cpp257
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ThreadingWin.cpp375
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/TypeTraits.cpp120
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/TypeTraits.h339
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/VMTags.h55
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Vector.h71
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/VectorTraits.h19
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/dtoa.cpp960
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/dtoa.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/qt/MainThreadQt.cpp7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/qt/ThreadingQt.cpp271
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/unicode/Collator.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/unicode/Unicode.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/unicode/glib/UnicodeGLib.cpp214
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/unicode/glib/UnicodeGLib.h238
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/unicode/glib/UnicodeMacrosFromICU.h69
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/unicode/icu/CollatorICU.cpp10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/unicode/icu/UnicodeIcu.h11
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/unicode/qt4/UnicodeQt4.h19
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/wince/FastMallocWince.h177
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/wince/MemoryManager.cpp171
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/wince/MemoryManager.h80
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/wince/mt19937ar.c170
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexCompiler.cpp728
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexCompiler.h45
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexInterpreter.cpp1638
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexInterpreter.h337
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.cpp1418
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.h91
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexParser.h854
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexPattern.h356
-rw-r--r--src/3rdparty/webkit/VERSION4
-rw-r--r--src/3rdparty/webkit/WebCore/ChangeLog52244
-rw-r--r--src/3rdparty/webkit/WebCore/ChangeLog-2006-12-3122
-rw-r--r--src/3rdparty/webkit/WebCore/ChangeLog-2007-10-1418
-rw-r--r--src/3rdparty/webkit/WebCore/ChangeLog-2008-08-1020
-rw-r--r--src/3rdparty/webkit/WebCore/ChangeLog-2009-06-1697559
-rw-r--r--src/3rdparty/webkit/WebCore/DerivedSources.cpp27
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/debugger/Debugger.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/debugger/DebuggerActivation.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/debugger/DebuggerCallFrame.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/interpreter/CallFrame.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/interpreter/Interpreter.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/jit/JITCode.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/masm/X86Assembler.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/parser/Parser.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/parser/SourceCode.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/parser/SourceProvider.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/pcre/pcre.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/profiler/Profile.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/profiler/ProfileNode.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/profiler/Profiler.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ArgList.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ArrayPrototype.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/BooleanObject.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ByteArray.h1
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/CallData.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/Collector.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/CollectorHeapIterator.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/Completion.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ConstructData.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/DateInstance.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/Error.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/FunctionConstructor.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/FunctionPrototype.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/Identifier.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/InitializeThreading.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/InternalFunction.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSArray.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSByteArray.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSFunction.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSGlobalData.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSGlobalObject.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSLock.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSNumberCell.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSObject.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSString.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSValue.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/Lookup.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ObjectPrototype.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/Operations.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/PropertyMap.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/PropertyNameArray.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/Protect.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/PrototypeFunction.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/StringObject.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/StringObjectThatMasqueradesAsUndefined.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/StringPrototype.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/Structure.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/SymbolTable.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/UString.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wrec/WREC.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/ASCIICType.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/AlwaysInline.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/Assertions.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/ByteArray.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/CrossThreadRefCounted.h1
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/CurrentTime.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/DateMath.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/Deque.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/DisallowCType.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/FastAllocBase.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/FastMalloc.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/Forward.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/GetPtr.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/HashCountedSet.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/HashFunctions.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/HashMap.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/HashSet.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/HashTable.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/HashTraits.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/ListHashSet.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/ListRefPtr.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/Locker.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/MainThread.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/MathExtras.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/MessageQueue.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/Noncopyable.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/NotFound.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/OwnArrayPtr.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/OwnFastMallocPtr.h1
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/OwnPtr.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/OwnPtrCommon.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/PassOwnPtr.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/PassRefPtr.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/Platform.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/PtrAndFlags.h5
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/RandomNumber.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/RefCounted.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/RefCountedLeakCounter.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/RefPtr.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/RetainPtr.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/StdLibExtras.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/StringExtras.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/ThreadSpecific.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/Threading.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/TypeTraits.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/UnusedParam.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/VMTags.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/Vector.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/VectorTraits.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/dtoa.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/unicode/Collator.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/unicode/UTF8.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/unicode/Unicode.h3
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/wtf/unicode/icu/UnicodeIcu.h3
-rw-r--r--src/3rdparty/webkit/WebCore/Info.plist2
-rw-r--r--src/3rdparty/webkit/WebCore/Resources/panIcon.pngbin0 -> 175 bytes-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.LP64.exp12
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.NPAPI.exp7
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.VideoProxy.exp4
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.gypi3396
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.order34328
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.pro1760
-rw-r--r--src/3rdparty/webkit/WebCore/WebCorePrefix.h26
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AXObjectCache.cpp341
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AXObjectCache.h130
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityARIAGrid.cpp154
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityARIAGrid.h60
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityARIAGridCell.cpp96
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityARIAGridCell.h55
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityARIAGridRow.cpp75
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityARIAGridRow.h50
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityImageMapLink.cpp138
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityImageMapLink.h73
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityList.cpp94
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityList.h62
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityListBox.cpp181
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityListBox.h (renamed from src/3rdparty/webkit/WebCore/page/AccessibilityListBox.h)0
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityListBoxOption.cpp207
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityListBoxOption.h (renamed from src/3rdparty/webkit/WebCore/page/AccessibilityListBoxOption.h)0
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityObject.cpp689
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityObject.h442
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityRenderObject.cpp2611
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityRenderObject.h248
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTable.cpp489
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTable.h93
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTableCell.cpp168
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTableCell.h65
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTableColumn.cpp185
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTableColumn.h (renamed from src/3rdparty/webkit/WebCore/page/AccessibilityTableColumn.h)0
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTableHeaderContainer.cpp (renamed from src/3rdparty/webkit/WebCore/page/AccessibilityTableHeaderContainer.cpp)0
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTableHeaderContainer.h (renamed from src/3rdparty/webkit/WebCore/page/AccessibilityTableHeaderContainer.h)0
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTableRow.cpp118
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityTableRow.h65
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/qt/AccessibilityObjectQt.cpp (renamed from src/3rdparty/webkit/WebCore/page/qt/AccessibilityObjectQt.cpp)0
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/CachedScriptSourceProvider.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/DOMObjectWithSVGContext.h57
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/DOMTimer.cpp177
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/DOMTimer.h68
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/GCController.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/GCController.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSAbstractWorkerCustom.cpp87
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSAttrCustom.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSAudioConstructor.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSAudioConstructor.h10
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCDATASectionCustom.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCSSRuleCustom.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCSSValueCustom.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp227
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSClipboardCustom.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSConsoleCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCoordinatesCustom.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp31
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h5
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomXPathNSResolver.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomXPathNSResolver.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMApplicationCacheCustom.cpp66
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.cpp177
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.h167
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.cpp82
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.h48
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMStringListCustom.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.cpp704
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.h43
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp660
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.h123
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowShell.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowShell.h18
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDataGridColumnListCustom.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDataGridDataSource.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDataGridDataSource.h76
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDatabaseCustom.cpp33
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDedicatedWorkerContextCustom.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDocumentCustom.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSElementCustom.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventCustom.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventListener.cpp307
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventListener.h99
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventTarget.cpp92
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventTarget.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventTargetBase.h92
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventTargetNodeCustom.cpp71
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSGeolocationCustom.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLAllCollection.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLAppletElementCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLCollectionCustom.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLDataGridElementCustom.cpp60
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLDocumentCustom.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLElementCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLEmbedElementCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLFormElementCustom.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLFrameElementCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLFrameSetElementCustom.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLIFrameElementCustom.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLInputElementCustom.cpp82
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLObjectElementCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLOptionsCollectionCustom.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLSelectElementCustom.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLSelectElementCustom.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHistoryCustom.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSImageConstructor.cpp33
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSImageConstructor.h9
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSImageDataCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSInspectedObjectWrapper.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSInspectedObjectWrapper.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSInspectorBackendCustom.cpp283
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSInspectorCallbackWrapper.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSInspectorCallbackWrapper.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSJavaScriptCallFrameCustom.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSLazyEventListener.cpp133
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSLazyEventListener.h56
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSLocationCustom.cpp161
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSMessageChannelConstructor.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSMessageChannelConstructor.h12
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSMessageChannelCustom.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSMimeTypeArrayCustom.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNamedNodeMapCustom.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNamedNodesCollection.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNamedNodesCollection.h10
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNavigatorCustom.cpp86
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNodeCustom.cpp113
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNodeFilterCondition.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNodeFilterCondition.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNodeFilterCustom.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNodeIteratorCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNodeListCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSOptionConstructor.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSOptionConstructor.h9
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSPluginArrayCustom.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSPluginCustom.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSPluginElementFunctions.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSPluginElementFunctions.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSQuarantinedObjectWrapper.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSQuarantinedObjectWrapper.h22
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSRGBColor.cpp85
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSRGBColor.h59
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSQLResultSetRowListCustom.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSQLTransactionCustom.cpp34
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGElementInstanceCustom.cpp40
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGLengthCustom.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGMatrixCustom.cpp84
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGPODTypeWrapper.h1
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGPathSegCustom.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGPathSegListCustom.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGPointListCustom.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGTransformListCustom.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSharedWorkerConstructor.cpp83
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSharedWorkerConstructor.h56
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSharedWorkerCustom.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSStorageCustom.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSStyleSheetCustom.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSStyleSheetListCustom.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSTextCustom.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSTreeWalkerCustom.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWebKitCSSMatrixConstructor.cpp64
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWebKitCSSMatrixConstructor.h46
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWebKitPointConstructor.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWebKitPointConstructor.h46
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWorkerConstructor.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWorkerConstructor.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWorkerContextBase.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWorkerContextBase.h13
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWorkerContextCustom.cpp108
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWorkerCustom.cpp45
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestConstructor.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestConstructor.h10
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp87
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestUploadCustom.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXSLTProcessorConstructor.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXSLTProcessorConstructor.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXSLTProcessorCustom.cpp46
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.cpp126
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.h29
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptArray.cpp107
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptArray.h59
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedFrameData.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedFrameData.h57
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedPageData.cpp93
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedPageData.h56
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptCallFrame.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptCallFrame.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptCallStack.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptController.cpp161
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptController.h25
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptControllerHaiku.cpp46
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptControllerMac.mm16
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptEventListener.cpp102
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptEventListener.h49
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptFunctionCall.cpp176
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptFunctionCall.h77
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.cpp155
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.h72
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptObjectQuarantine.cpp125
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptObjectQuarantine.h59
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptSourceCode.h12
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptSourceProvider.h48
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptState.cpp60
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptState.h9
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptString.h5
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptValue.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptValue.h12
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/StringSourceProvider.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/WorkerScriptController.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/WorkerScriptController.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGenerator.pm45
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorCOM.pm37
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorJS.pm676
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorObjC.pm507
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorV8.pm2194
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/IDLParser.pm4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/InFilesParser.pm14
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/IdentifierRep.cpp111
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/IdentifierRep.h74
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/NP_jsobject.cpp129
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_class.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_class.h1
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_instance.cpp94
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_instance.h36
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_runtime.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_runtime.h9
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_utility.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_utility.h22
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_class.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_class.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_instance.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_instance.h14
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_jsobject.h7
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_jsobject.mm64
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_objc.mm6
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_runtime.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_runtime.h24
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_utility.cpp62
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/jni/jni_utility.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/npapi.h55
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/npruntime.cpp96
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/qt/qt_class.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/qt/qt_class.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/qt/qt_instance.cpp102
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/qt/qt_instance.h23
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/qt/qt_runtime.cpp153
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/qt/qt_runtime.h25
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime.cpp36
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime.h58
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_array.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_array.h14
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_method.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_method.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_object.cpp61
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_object.h21
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_root.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_root.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/testbindings.mm2
-rw-r--r--src/3rdparty/webkit/WebCore/config.h32
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSCanvasValue.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSCanvasValue.h5
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSCharsetRule.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSComputedStyleDeclaration.cpp469
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSComputedStyleDeclaration.h7
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSCursorImageValue.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSFontFaceSource.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSFontSelector.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSFunctionValue.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSGrammar.y34
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSHelper.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSHelper.h15
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSMutableStyleDeclaration.cpp245
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSMutableStyleDeclaration.h4
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSParser.cpp618
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSParser.h14
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSParserValues.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSParserValues.h2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPrimitiveValue.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPrimitiveValue.h34
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPrimitiveValue.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPrimitiveValueMappings.h62
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPropertyLonghand.cpp213
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPropertyLonghand.h53
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPropertyNames.in19
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSRule.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSSelector.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSSelector.h11
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSSelectorList.cpp31
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSSelectorList.h2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSStyleDeclaration.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSStyleDeclaration.h5
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSStyleDeclaration.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSStyleSelector.cpp972
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSStyleSelector.h31
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSStyleSheet.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSValue.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSValueKeywords.in26
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSValueList.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSValueList.h2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSVariablesDeclaration.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSVariablesDeclaration.h2
-rw-r--r--src/3rdparty/webkit/WebCore/css/MediaFeatureNames.h4
-rw-r--r--src/3rdparty/webkit/WebCore/css/MediaList.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/css/MediaQuery.h3
-rw-r--r--src/3rdparty/webkit/WebCore/css/MediaQueryEvaluator.cpp94
-rw-r--r--src/3rdparty/webkit/WebCore/css/MediaQueryEvaluator.h3
-rw-r--r--src/3rdparty/webkit/WebCore/css/MediaQueryExp.h12
-rw-r--r--src/3rdparty/webkit/WebCore/css/RGBColor.cpp62
-rw-r--r--src/3rdparty/webkit/WebCore/css/RGBColor.h58
-rw-r--r--src/3rdparty/webkit/WebCore/css/RGBColor.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/css/SVGCSSComputedStyleDeclaration.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/css/SVGCSSParser.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/css/SVGCSSStyleSelector.cpp121
-rw-r--r--src/3rdparty/webkit/WebCore/css/ShadowValue.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/css/ShadowValue.h10
-rw-r--r--src/3rdparty/webkit/WebCore/css/StyleSheet.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/css/WebKitCSSMatrix.cpp186
-rw-r--r--src/3rdparty/webkit/WebCore/css/WebKitCSSMatrix.h159
-rw-r--r--src/3rdparty/webkit/WebCore/css/WebKitCSSMatrix.idl86
-rw-r--r--src/3rdparty/webkit/WebCore/css/WebKitCSSTransformValue.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/css/WebKitCSSTransformValue.h12
-rw-r--r--src/3rdparty/webkit/WebCore/css/WebKitCSSTransformValue.idl10
-rw-r--r--src/3rdparty/webkit/WebCore/css/html.css615
-rw-r--r--src/3rdparty/webkit/WebCore/css/html4.css596
-rw-r--r--src/3rdparty/webkit/WebCore/css/makeprop.pl6
-rw-r--r--src/3rdparty/webkit/WebCore/css/maketokenizer7
-rw-r--r--src/3rdparty/webkit/WebCore/css/makevalues.pl6
-rw-r--r--src/3rdparty/webkit/WebCore/css/mediaControls.css74
-rw-r--r--src/3rdparty/webkit/WebCore/css/mediaControlsChromium.css165
-rw-r--r--src/3rdparty/webkit/WebCore/css/mediaControlsQT.css177
-rw-r--r--src/3rdparty/webkit/WebCore/css/themeChromiumLinux.css36
-rw-r--r--src/3rdparty/webkit/WebCore/css/themeWin.css40
-rw-r--r--src/3rdparty/webkit/WebCore/css/themeWinQuirks.css2
-rw-r--r--src/3rdparty/webkit/WebCore/css/tokenizer.flex1
-rw-r--r--src/3rdparty/webkit/WebCore/css/view-source.css4
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Attr.h2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Attr.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Attribute.h4
-rw-r--r--src/3rdparty/webkit/WebCore/dom/CharacterData.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/dom/CharacterData.h8
-rw-r--r--src/3rdparty/webkit/WebCore/dom/CharacterData.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/CheckedRadioButtons.cpp86
-rw-r--r--src/3rdparty/webkit/WebCore/dom/CheckedRadioButtons.h47
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ClassNames.h4
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ClientRect.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ClientRect.h59
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ClientRect.idl40
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ClientRectList.cpp66
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ClientRectList.h57
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ClientRectList.idl38
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Clipboard.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Clipboard.h7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Clipboard.idl1
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Comment.h3
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ContainerNode.cpp223
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ContainerNode.h17
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DOMCoreException.idl9
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DOMImplementation.cpp34
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DOMImplementation.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DOMStringList.cpp35
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DOMStringList.h46
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DOMStringList.idl41
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Document.cpp978
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Document.h225
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Document.idl119
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DocumentFragment.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DocumentFragment.h3
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DocumentFragment.idl7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DocumentMarker.h6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DynamicNodeList.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/dom/DynamicNodeList.h9
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EditingText.h3
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Element.cpp355
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Element.h68
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Element.idl91
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ElementRareData.h13
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ErrorEvent.cpp76
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ErrorEvent.h74
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ErrorEvent.idl46
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Event.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Event.h7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Event.idl11
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventException.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventListener.h24
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventListener.idl1
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventNames.h9
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventTarget.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventTarget.h18
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventTarget.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventTargetNode.cpp1166
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventTargetNode.h206
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventTargetNode.idl84
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ExceptionCode.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ExceptionCode.h8
-rw-r--r--src/3rdparty/webkit/WebCore/dom/FormControlElement.h39
-rw-r--r--src/3rdparty/webkit/WebCore/dom/HTMLAllCollection.idl40
-rw-r--r--src/3rdparty/webkit/WebCore/dom/InputElement.cpp306
-rw-r--r--src/3rdparty/webkit/WebCore/dom/InputElement.h123
-rw-r--r--src/3rdparty/webkit/WebCore/dom/KeyboardEvent.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessageChannel.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePort.cpp250
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePort.h57
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePort.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePortChannel.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePortChannel.h107
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MouseEvent.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MouseEvent.h11
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MouseEvent.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MouseRelatedEvent.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MouseRelatedEvent.h11
-rw-r--r--src/3rdparty/webkit/WebCore/dom/NamedAttrMap.cpp64
-rw-r--r--src/3rdparty/webkit/WebCore/dom/NamedAttrMap.h74
-rw-r--r--src/3rdparty/webkit/WebCore/dom/NamedMappedAttrMap.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/NamedMappedAttrMap.h24
-rw-r--r--src/3rdparty/webkit/WebCore/dom/NamedNodeMap.h65
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Node.cpp1373
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Node.h209
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Node.idl34
-rw-r--r--src/3rdparty/webkit/WebCore/dom/NodeFilter.h1
-rw-r--r--src/3rdparty/webkit/WebCore/dom/NodeIterator.h1
-rw-r--r--src/3rdparty/webkit/WebCore/dom/NodeRareData.h23
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Notation.h3
-rw-r--r--src/3rdparty/webkit/WebCore/dom/OptionElement.cpp150
-rw-r--r--src/3rdparty/webkit/WebCore/dom/OptionElement.h78
-rw-r--r--src/3rdparty/webkit/WebCore/dom/OptionGroupElement.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/dom/OptionGroupElement.h41
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Position.cpp352
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Position.h121
-rw-r--r--src/3rdparty/webkit/WebCore/dom/PositionIterator.cpp110
-rw-r--r--src/3rdparty/webkit/WebCore/dom/PositionIterator.h22
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ProcessingInstruction.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ProcessingInstruction.h3
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ProcessingInstruction.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/QualifiedName.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/dom/QualifiedName.h34
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Range.cpp131
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Range.h14
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Range.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/RangeBoundaryPoint.h121
-rw-r--r--src/3rdparty/webkit/WebCore/dom/RangeException.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/RegisteredEventListener.h22
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ScriptElement.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ScriptElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ScriptExecutionContext.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ScriptExecutionContext.h21
-rw-r--r--src/3rdparty/webkit/WebCore/dom/SelectElement.cpp991
-rw-r--r--src/3rdparty/webkit/WebCore/dom/SelectElement.h182
-rw-r--r--src/3rdparty/webkit/WebCore/dom/StaticStringList.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/dom/StaticStringList.h61
-rw-r--r--src/3rdparty/webkit/WebCore/dom/StyleElement.cpp27
-rw-r--r--src/3rdparty/webkit/WebCore/dom/StyledElement.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/dom/StyledElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Text.cpp77
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Text.h5
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Tokenizer.h10
-rw-r--r--src/3rdparty/webkit/WebCore/dom/TreeWalker.h1
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WheelEvent.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WheelEvent.h6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WheelEvent.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Worker.cpp202
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Worker.h113
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Worker.idl48
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerContext.cpp195
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerContext.h122
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerContext.idl61
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerLocation.cpp85
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerMessagingProxy.cpp311
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerMessagingProxy.h93
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerTask.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerTask.h48
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerThread.cpp154
-rw-r--r--src/3rdparty/webkit/WebCore/dom/WorkerThread.h79
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp80
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizer.h15
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp256
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizerQt.cpp127
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizerScope.cpp68
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizerScope.h62
-rw-r--r--src/3rdparty/webkit/WebCore/dom/default/PlatformMessagePortChannel.cpp243
-rw-r--r--src/3rdparty/webkit/WebCore/dom/default/PlatformMessagePortChannel.h129
-rwxr-xr-xsrc/3rdparty/webkit/WebCore/dom/make_names.pl273
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.cpp472
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.h11
-rw-r--r--src/3rdparty/webkit/WebCore/editing/BreakBlockquoteCommand.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/editing/CompositeEditCommand.cpp167
-rw-r--r--src/3rdparty/webkit/WebCore/editing/CompositeEditCommand.h6
-rw-r--r--src/3rdparty/webkit/WebCore/editing/CreateLinkCommand.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/editing/DeleteButtonController.cpp112
-rw-r--r--src/3rdparty/webkit/WebCore/editing/DeleteButtonController.h4
-rw-r--r--src/3rdparty/webkit/WebCore/editing/DeleteSelectionCommand.cpp117
-rw-r--r--src/3rdparty/webkit/WebCore/editing/DeleteSelectionCommand.h8
-rw-r--r--src/3rdparty/webkit/WebCore/editing/EditCommand.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/editing/EditCommand.h14
-rw-r--r--src/3rdparty/webkit/WebCore/editing/Editor.cpp895
-rw-r--r--src/3rdparty/webkit/WebCore/editing/Editor.h39
-rw-r--r--src/3rdparty/webkit/WebCore/editing/EditorCommand.cpp180
-rw-r--r--src/3rdparty/webkit/WebCore/editing/FormatBlockCommand.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.cpp268
-rw-r--r--src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.h8
-rw-r--r--src/3rdparty/webkit/WebCore/editing/InsertLineBreakCommand.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/editing/InsertListCommand.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/editing/InsertListCommand.h7
-rw-r--r--src/3rdparty/webkit/WebCore/editing/InsertParagraphSeparatorCommand.cpp134
-rw-r--r--src/3rdparty/webkit/WebCore/editing/InsertTextCommand.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ModifySelectionListLevel.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/editing/MoveSelectionCommand.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/editing/RemoveCSSPropertyCommand.h1
-rw-r--r--src/3rdparty/webkit/WebCore/editing/RemoveFormatCommand.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/editing/RemoveNodeAttributeCommand.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/editing/RemoveNodeAttributeCommand.h1
-rw-r--r--src/3rdparty/webkit/WebCore/editing/RemoveNodePreservingChildrenCommand.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ReplaceNodeWithSpanCommand.cpp87
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ReplaceNodeWithSpanCommand.h62
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ReplaceSelectionCommand.cpp204
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ReplaceSelectionCommand.h11
-rw-r--r--src/3rdparty/webkit/WebCore/editing/Selection.cpp605
-rw-r--r--src/3rdparty/webkit/WebCore/editing/Selection.h136
-rw-r--r--src/3rdparty/webkit/WebCore/editing/SelectionController.cpp279
-rw-r--r--src/3rdparty/webkit/WebCore/editing/SelectionController.h30
-rw-r--r--src/3rdparty/webkit/WebCore/editing/SmartReplaceCF.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/editing/SmartReplaceICU.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/editing/SplitElementCommand.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/editing/TextAffinity.h14
-rw-r--r--src/3rdparty/webkit/WebCore/editing/TextIterator.cpp470
-rw-r--r--src/3rdparty/webkit/WebCore/editing/TextIterator.h73
-rw-r--r--src/3rdparty/webkit/WebCore/editing/TypingCommand.cpp213
-rw-r--r--src/3rdparty/webkit/WebCore/editing/TypingCommand.h10
-rw-r--r--src/3rdparty/webkit/WebCore/editing/VisiblePosition.cpp82
-rw-r--r--src/3rdparty/webkit/WebCore/editing/VisiblePosition.h8
-rw-r--r--src/3rdparty/webkit/WebCore/editing/VisibleSelection.cpp657
-rw-r--r--src/3rdparty/webkit/WebCore/editing/VisibleSelection.h149
-rw-r--r--src/3rdparty/webkit/WebCore/editing/android/EditorAndroid.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/editing/chromium/EditorChromium.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/editing/gtk/SelectionControllerGtk.cpp45
-rw-r--r--src/3rdparty/webkit/WebCore/editing/htmlediting.cpp282
-rw-r--r--src/3rdparty/webkit/WebCore/editing/htmlediting.h27
-rw-r--r--src/3rdparty/webkit/WebCore/editing/markup.cpp274
-rw-r--r--src/3rdparty/webkit/WebCore/editing/qt/EditorQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/editing/visible_units.cpp466
-rw-r--r--src/3rdparty/webkit/WebCore/editing/visible_units.h3
-rw-r--r--src/3rdparty/webkit/WebCore/generated/ArrayPrototype.lut.h11
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSGrammar.cpp1663
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSGrammar.h57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp1316
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.h539
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c2698
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.h573
-rw-r--r--src/3rdparty/webkit/WebCore/generated/DatePrototype.lut.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/Grammar.cpp1121
-rw-r--r--src/3rdparty/webkit/WebCore/generated/Grammar.h4
-rw-r--r--src/3rdparty/webkit/WebCore/generated/HTMLElementFactory.cpp602
-rw-r--r--src/3rdparty/webkit/WebCore/generated/HTMLElementFactory.h56
-rw-r--r--src/3rdparty/webkit/WebCore/generated/HTMLNames.cpp184
-rw-r--r--src/3rdparty/webkit/WebCore/generated/HTMLNames.h54
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.cpp227
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.h96
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSAttr.cpp83
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSAttr.h34
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSBarInfo.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSBarInfo.h16
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCDATASection.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCDATASection.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.cpp45
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.h11
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.cpp150
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.h79
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSRule.cpp93
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSRule.h52
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.cpp153
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.h54
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.cpp100
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSValue.cpp65
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSValue.h36
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSValueList.cpp61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSValueList.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.cpp115
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.h42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.cpp53
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasGradient.cpp31
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasGradient.h16
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasPattern.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasPattern.h12
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.cpp581
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.h200
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCharacterData.cpp103
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCharacterData.h35
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClientRect.cpp204
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClientRect.h79
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClientRectList.cpp221
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClientRectList.h85
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClipboard.cpp110
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClipboard.h51
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSComment.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSComment.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSConsole.cpp119
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSConsole.h52
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCoordinates.cpp178
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCoordinates.h92
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCounter.cpp64
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCounter.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMApplicationCache.cpp253
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMApplicationCache.h83
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.cpp145
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.h67
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.cpp103
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.h30
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMParser.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMParser.h22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMSelection.cpp275
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMSelection.h68
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMStringList.cpp212
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMStringList.h87
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMWindow.cpp3923
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMWindow.h1102
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMWindowBase.lut.h31
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.cpp301
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.h103
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.cpp310
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.h98
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDatabase.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDatabase.h30
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDedicatedWorkerContext.cpp158
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDedicatedWorkerContext.h83
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocument.cpp1516
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocument.h256
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.h21
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocumentType.cpp82
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocumentType.h26
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSElement.cpp1303
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSElement.h206
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEntity.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEntity.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEntityReference.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEntityReference.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSErrorEvent.cpp203
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSErrorEvent.h78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEvent.cpp181
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEvent.h94
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEventException.cpp88
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEventException.h30
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEventTargetNode.cpp944
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEventTargetNode.h162
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSFile.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSFile.h22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSFileList.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSFileList.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSGeolocation.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSGeolocation.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSGeoposition.cpp97
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSGeoposition.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.cpp227
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.h75
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.cpp176
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.h61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.cpp164
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.h53
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.cpp52
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.cpp64
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.cpp73
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.h23
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.cpp52
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.cpp281
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.h55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.cpp121
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.h42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.cpp76
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.cpp80
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.h40
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.cpp223
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.h78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.cpp223
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.h78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.cpp213
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.h81
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.cpp190
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.h74
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.cpp193
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.h87
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLElement.cpp243
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLElement.h76
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLElementWrapperFactory.cpp306
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLElementWrapperFactory.h3
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.cpp98
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.h45
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.cpp64
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.h14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.h23
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.cpp145
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.h58
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.cpp146
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.h63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.cpp226
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.h35
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.cpp73
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.h27
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.cpp141
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.h61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.cpp215
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.h73
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.cpp342
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.h125
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.cpp56
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.h21
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.h21
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.cpp121
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.h49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.cpp416
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.h114
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.cpp71
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.h27
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.cpp66
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.h23
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.cpp198
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.h89
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.cpp110
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.h44
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptionsCollection.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptionsCollection.h38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.cpp71
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.h27
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.cpp97
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.h39
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.cpp201
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.h72
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.cpp69
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.cpp73
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.cpp51
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.h20
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.cpp162
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.h69
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.cpp88
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.h35
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.cpp209
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.h81
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.cpp114
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.h43
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.cpp99
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.h40
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.cpp204
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.h70
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.cpp78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHistory.cpp60
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHistory.h35
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSImageData.cpp53
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSImageData.h22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.cpp773
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.h138
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSJavaScriptCallFrame.cpp73
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSJavaScriptCallFrame.h44
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.cpp105
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.h27
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSLocation.cpp128
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSLocation.h95
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMediaError.cpp76
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMediaError.h30
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMediaList.cpp92
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMediaList.h38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessageChannel.cpp40
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessageChannel.h18
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessageEvent.cpp92
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessageEvent.h23
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessagePort.cpp151
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessagePort.h47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMimeType.cpp72
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMimeType.h26
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.cpp79
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.h32
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMouseEvent.cpp182
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMouseEvent.h47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMutationEvent.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMutationEvent.h29
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.cpp132
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.h42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNavigator.cpp120
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNavigator.h49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNode.cpp364
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNode.h149
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeFilter.cpp79
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeFilter.h56
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeIterator.cpp102
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeIterator.h42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeList.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeList.h32
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNotation.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNotation.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSONObject.lut.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.cpp71
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPlugin.cpp97
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPlugin.h38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPluginArray.cpp86
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPluginArray.h34
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPositionError.cpp65
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPositionError.h32
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.cpp61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSProgressEvent.cpp71
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSProgressEvent.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRGBColor.cpp178
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRGBColor.h76
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRGBColor.lut.h21
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRange.cpp282
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRange.h94
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRangeException.cpp74
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRangeException.h32
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRect.cpp78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRect.h26
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLError.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLError.h22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLResultSet.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLResultSet.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLResultSetRowList.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLResultSetRowList.h26
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLTransaction.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLTransaction.h22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAElement.cpp174
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAElement.h53
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAltGlyphElement.cpp46
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAltGlyphElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAngle.cpp109
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAngle.h56
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateColorElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateColorElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateTransformElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateTransformElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedAngle.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedAngle.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedBoolean.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedBoolean.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedEnumeration.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedEnumeration.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedInteger.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedInteger.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLength.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLength.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLengthList.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLengthList.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumber.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumber.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumberList.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumberList.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedPreserveAspectRatio.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedPreserveAspectRatio.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedRect.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedRect.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedString.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedString.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedTransformList.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedTransformList.h24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimationElement.cpp118
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimationElement.h35
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGCircleElement.cpp182
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGCircleElement.h55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGClipPathElement.cpp166
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGClipPathElement.h51
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGColor.cpp87
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGColor.h31
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.cpp110
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.h43
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGCursorElement.cpp81
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGCursorElement.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDefinitionSrcElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDefinitionSrcElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDefsElement.cpp158
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDefsElement.h49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDescElement.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDescElement.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDocument.cpp33
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDocument.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElement.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElement.h23
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElementInstance.cpp790
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElementInstance.h208
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElementInstanceList.cpp40
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElementInstanceList.h22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElementWrapperFactory.cpp384
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElementWrapperFactory.h3
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGEllipseElement.cpp190
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGEllipseElement.h57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGException.cpp78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGException.h40
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.cpp143
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.h51
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.cpp141
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.h49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEComponentTransferElement.cpp93
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEComponentTransferElement.h31
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.cpp177
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.h61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDiffuseLightingElement.cpp125
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDiffuseLightingElement.h39
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.cpp157
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.h53
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDistantLightElement.cpp36
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDistantLightElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.cpp148
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.h32
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncAElement.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncAElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncBElement.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncBElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncGElement.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncGElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncRElement.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncRElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEGaussianBlurElement.cpp118
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEGaussianBlurElement.h37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEImageElement.cpp123
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEImageElement.h43
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeElement.cpp85
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeElement.h29
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeNodeElement.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeNodeElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEOffsetElement.cpp109
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEOffsetElement.h35
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEPointLightElement.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEPointLightElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFESpecularLightingElement.cpp117
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFESpecularLightingElement.h37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFESpotLightElement.cpp84
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFESpotLightElement.h27
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFETileElement.cpp93
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFETileElement.h31
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.cpp167
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.h57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFilterElement.cpp156
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFilterElement.h51
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceFormatElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceFormatElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceNameElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceNameElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceSrcElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceSrcElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceUriElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceUriElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGForeignObjectElement.cpp190
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGForeignObjectElement.h57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGElement.cpp158
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGElement.h49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGlyphElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGlyphElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.cpp111
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.h37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGHKernElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGHKernElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGImageElement.cpp206
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGImageElement.h61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLength.cpp118
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLength.h76
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLengthList.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLengthList.h38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLineElement.cpp190
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLineElement.h57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLinearGradientElement.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLinearGradientElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.cpp189
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.h65
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMaskElement.cpp152
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMaskElement.h47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMatrix.cpp216
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMatrix.h87
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMetadataElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMetadataElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMissingGlyphElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMissingGlyphElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGNumber.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGNumber.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGNumberList.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGNumberList.h38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPaint.cpp89
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPaint.h41
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathElement.cpp472
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathElement.h103
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.h70
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcAbs.cpp88
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcAbs.h37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcRel.cpp88
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcRel.h37
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegClosePath.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegClosePath.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicAbs.cpp78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicAbs.h33
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicRel.cpp78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicRel.h33
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothAbs.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothAbs.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothRel.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothRel.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticAbs.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticAbs.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticRel.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticRel.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothAbs.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothAbs.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothRel.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothRel.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoAbs.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoAbs.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalAbs.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalAbs.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalRel.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalRel.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoRel.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoRel.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalAbs.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalAbs.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalRel.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalRel.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegList.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegList.h52
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoAbs.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoAbs.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoRel.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoRel.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPatternElement.cpp184
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPatternElement.h55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPoint.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPoint.h38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPointList.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPointList.h52
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPolygonElement.cpp174
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPolygonElement.h53
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPolylineElement.cpp174
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPolylineElement.h53
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.cpp97
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.h64
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRadialGradientElement.cpp56
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRadialGradientElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRect.cpp68
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRect.h42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRectElement.cpp206
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRectElement.h61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.cpp60
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.h38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSVGElement.cpp458
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSVGElement.h141
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGScriptElement.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGScriptElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSetElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSetElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStopElement.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStopElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStringList.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStringList.h38
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStyleElement.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStyleElement.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSwitchElement.cpp158
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSwitchElement.h49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSymbolElement.cpp87
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSymbolElement.h31
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTRefElement.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTRefElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTSpanElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTSpanElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.cpp259
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.h67
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextElement.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextElement.h23
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.cpp82
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.h33
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextPositioningElement.cpp56
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextPositioningElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTitleElement.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTitleElement.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTransform.cpp131
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTransform.h62
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTransformList.cpp83
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTransformList.h56
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.h32
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGUseElement.cpp214
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGUseElement.h63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGViewElement.cpp66
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGViewElement.h29
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGZoomEvent.cpp52
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGZoomEvent.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSScreen.cpp72
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSScreen.h30
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStorage.cpp104
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStorage.h47
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStorageEvent.cpp113
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStorageEvent.h28
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStyleSheet.cpp96
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStyleSheet.h36
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.h30
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSText.cpp61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSText.h18
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTextEvent.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTextEvent.h15
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTextMetrics.cpp51
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTextMetrics.h20
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTimeRanges.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTimeRanges.h22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTreeWalker.cpp120
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTreeWalker.h62
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSUIEvent.cpp107
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSUIEvent.h31
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSValidityState.cpp181
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSValidityState.h80
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSVoidCallback.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSVoidCallback.h16
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.cpp88
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.h29
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSMatrix.cpp575
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSMatrix.h131
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.cpp142
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.h45
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitPoint.cpp136
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitPoint.h76
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWheelEvent.cpp126
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWheelEvent.h39
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorker.cpp147
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorker.h49
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerContext.cpp220
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerContext.h62
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerContextBase.lut.h18
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.cpp101
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.h39
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerNavigator.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerNavigator.h25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequest.cpp274
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequest.h102
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.cpp90
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.h32
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.cpp62
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.cpp170
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.h52
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.cpp61
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.h22
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.cpp93
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.h27
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathException.cpp74
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathException.h33
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathExpression.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathExpression.h23
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathNSResolver.cpp31
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathNSResolver.h17
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathResult.cpp128
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathResult.h59
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXSLTProcessor.cpp177
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXSLTProcessor.h89
-rw-r--r--src/3rdparty/webkit/WebCore/generated/Lexer.lut.h7
-rw-r--r--src/3rdparty/webkit/WebCore/generated/MathObject.lut.h7
-rw-r--r--src/3rdparty/webkit/WebCore/generated/NumberConstructor.lut.h7
-rw-r--r--src/3rdparty/webkit/WebCore/generated/RegExpConstructor.lut.h7
-rw-r--r--src/3rdparty/webkit/WebCore/generated/RegExpObject.lut.h7
-rw-r--r--src/3rdparty/webkit/WebCore/generated/SVGElementFactory.cpp484
-rw-r--r--src/3rdparty/webkit/WebCore/generated/SVGElementFactory.h3
-rw-r--r--src/3rdparty/webkit/WebCore/generated/SVGNames.cpp94
-rw-r--r--src/3rdparty/webkit/WebCore/generated/SVGNames.h55
-rw-r--r--src/3rdparty/webkit/WebCore/generated/StringPrototype.lut.h7
-rw-r--r--src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheets.h6
-rw-r--r--src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheetsData.cpp1122
-rw-r--r--src/3rdparty/webkit/WebCore/generated/XLinkNames.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/XMLNames.h5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/XPathGrammar.cpp126
-rw-r--r--src/3rdparty/webkit/WebCore/generated/XPathGrammar.h4
-rw-r--r--src/3rdparty/webkit/WebCore/generated/tokenizer.cpp2919
-rw-r--r--src/3rdparty/webkit/WebCore/history/BackForwardList.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/history/BackForwardList.h34
-rw-r--r--src/3rdparty/webkit/WebCore/history/BackForwardListChromium.cpp143
-rw-r--r--src/3rdparty/webkit/WebCore/history/CachedFrame.cpp167
-rw-r--r--src/3rdparty/webkit/WebCore/history/CachedFrame.h82
-rw-r--r--src/3rdparty/webkit/WebCore/history/CachedFramePlatformData.h45
-rw-r--r--src/3rdparty/webkit/WebCore/history/CachedPage.cpp117
-rw-r--r--src/3rdparty/webkit/WebCore/history/CachedPage.h44
-rw-r--r--src/3rdparty/webkit/WebCore/history/CachedPagePlatformData.h45
-rw-r--r--src/3rdparty/webkit/WebCore/history/HistoryItem.cpp237
-rw-r--r--src/3rdparty/webkit/WebCore/history/HistoryItem.h72
-rw-r--r--src/3rdparty/webkit/WebCore/history/PageCache.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/history/PageCache.h6
-rw-r--r--src/3rdparty/webkit/WebCore/history/cf/HistoryPropertyList.cpp156
-rw-r--r--src/3rdparty/webkit/WebCore/history/cf/HistoryPropertyList.h69
-rw-r--r--src/3rdparty/webkit/WebCore/history/qt/HistoryItemQt.cpp114
-rw-r--r--src/3rdparty/webkit/WebCore/html/CanvasGradient.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/html/CanvasGradient.h5
-rw-r--r--src/3rdparty/webkit/WebCore/html/CanvasPixelArray.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/html/CanvasPixelArray.h64
-rw-r--r--src/3rdparty/webkit/WebCore/html/CanvasPixelArray.idl39
-rw-r--r--src/3rdparty/webkit/WebCore/html/CanvasRenderingContext2D.cpp168
-rw-r--r--src/3rdparty/webkit/WebCore/html/CanvasRenderingContext2D.h14
-rw-r--r--src/3rdparty/webkit/WebCore/html/CanvasStyle.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/html/CollectionCache.cpp88
-rw-r--r--src/3rdparty/webkit/WebCore/html/CollectionCache.h64
-rw-r--r--src/3rdparty/webkit/WebCore/html/CollectionType.h67
-rw-r--r--src/3rdparty/webkit/WebCore/html/DOMDataGridDataSource.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/html/DOMDataGridDataSource.h69
-rw-r--r--src/3rdparty/webkit/WebCore/html/DataGridColumn.cpp53
-rw-r--r--src/3rdparty/webkit/WebCore/html/DataGridColumn.h117
-rw-r--r--src/3rdparty/webkit/WebCore/html/DataGridColumn.idl49
-rw-r--r--src/3rdparty/webkit/WebCore/html/DataGridColumnList.cpp126
-rw-r--r--src/3rdparty/webkit/WebCore/html/DataGridColumnList.h63
-rw-r--r--src/3rdparty/webkit/WebCore/html/DataGridColumnList.idl46
-rw-r--r--src/3rdparty/webkit/WebCore/html/DataGridDataSource.h49
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.cpp166
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.h68
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.idl28
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAppletElement.cpp69
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAppletElement.h35
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAppletElement.idl32
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAreaElement.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAreaElement.h36
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAreaElement.idl16
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAttributeNames.in42
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAudioElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBRElement.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBRElement.h16
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBRElement.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBaseElement.cpp35
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBaseElement.h11
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBaseElement.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBaseFontElement.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBaseFontElement.h23
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBaseFontElement.idl8
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBlockquoteElement.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBlockquoteElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBlockquoteElement.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBodyElement.cpp199
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBodyElement.h73
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLBodyElement.idl39
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLButtonElement.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLButtonElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLButtonElement.idl3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLCollection.cpp74
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLCollection.h90
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLCollection.idl3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDListElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridCellElement.cpp96
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridCellElement.h62
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridCellElement.idl42
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridColElement.cpp171
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridColElement.h79
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridColElement.idl41
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridElement.cpp118
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridElement.h71
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridElement.idl41
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridRowElement.cpp83
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridRowElement.h56
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDataGridRowElement.idl38
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDirectoryElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDivElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDocument.cpp46
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDocument.h15
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDocument.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLElement.cpp160
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLElement.idl17
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLElementFactory.cpp509
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLElementFactory.h47
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLElementsAllInOne.cpp105
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLEmbedElement.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLEmbedElement.idl14
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFieldSetElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFieldSetElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFieldSetElement.idl3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFontElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormCollection.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormCollection.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.cpp69
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.h44
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormElement.cpp178
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormElement.h28
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormElement.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameElement.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameElementBase.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameElementBase.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameOwnerElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameOwnerElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameSetElement.cpp151
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameSetElement.h37
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameSetElement.idl29
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLHRElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLHeadElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLHtmlElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLHtmlElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLIFrameElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLIFrameElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLIFrameElement.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLImageElement.h4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLImageElement.idl20
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLImageLoader.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp725
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLInputElement.h100
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLInputElement.idl20
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLIsIndexElement.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLIsIndexElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLKeygenElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLKeygenElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLLIElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLLabelElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLLegendElement.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLLegendElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLLinkElement.cpp78
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLLinkElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLLinkElement.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMapElement.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMarqueeElement.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMarqueeElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMediaElement.cpp1541
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMediaElement.h225
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMediaElement.idl49
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMenuElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMetaElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMetaElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLModElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLNameCollection.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLNameCollection.h4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLNoScriptElement.cpp85
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLNoScriptElement.h46
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLOListElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLOListElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLObjectElement.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLObjectElement.idl12
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLOptGroupElement.cpp15
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLOptGroupElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLOptionElement.cpp105
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLOptionElement.h26
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLOptionElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLOptionsCollection.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLParagraphElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLParamElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLParamElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLParser.cpp462
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLParser.h39
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLParserQuirks.h49
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLPlugInElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLPreElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLQuoteElement.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLQuoteElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLScriptElement.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLScriptElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLSelectElement.cpp879
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLSelectElement.h165
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLSelectElement.idl7
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLSourceElement.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLSourceElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLStyleElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLStyleElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLStyleElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableCaptionElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableCaptionElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableCellElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableCellElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableColElement.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableColElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableElement.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTablePartElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableRowElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableRowsCollection.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTableSectionElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTagNames.in53
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp90
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTitleElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTokenizer.cpp187
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTokenizer.h14
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLUListElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLUListElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLVideoElement.cpp49
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLVideoElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLViewSourceDocument.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLViewSourceDocument.h5
-rw-r--r--src/3rdparty/webkit/WebCore/html/ImageData.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/ImageData.h8
-rw-r--r--src/3rdparty/webkit/WebCore/html/ImageData.idl7
-rw-r--r--src/3rdparty/webkit/WebCore/html/MediaError.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/MediaError.idl1
-rw-r--r--src/3rdparty/webkit/WebCore/html/PreloadScanner.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/html/PreloadScanner.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/TimeRanges.cpp56
-rw-r--r--src/3rdparty/webkit/WebCore/html/TimeRanges.h43
-rw-r--r--src/3rdparty/webkit/WebCore/html/ValidityState.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/html/ValidityState.h58
-rw-r--r--src/3rdparty/webkit/WebCore/html/ValidityState.idl36
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/ConsoleMessage.cpp123
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/ConsoleMessage.h69
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorBackend.cpp363
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorBackend.h140
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorBackend.idl101
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorClient.h2
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorController.cpp2668
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorController.h212
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp83
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.h76
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.cpp78
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.h72
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.cpp299
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.h105
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorJSONObject.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorJSONObject.h60
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorResource.cpp325
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorResource.h163
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptCallFrame.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptCallFrame.h9
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptCallFrame.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptDebugListener.h5
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptDebugServer.cpp65
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptDebugServer.h11
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptProfile.cpp125
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptProfile.h6
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptProfileNode.cpp65
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptProfileNode.h6
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/BottomUpProfileDataGridTree.js252
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Breakpoint.js23
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/BreakpointsSidebarPane.js94
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/CallStackSidebarPane.js57
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Console.js372
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/DOMStorage.js72
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/DOMStorageDataGrid.js103
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/DOMStorageItemsView.js108
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/DataGrid.js79
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/DatabaseQueryView.js8
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/DatabaseTableView.js20
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/DatabasesPanel.js199
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ElementsPanel.js2
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ElementsTreeOutline.js148
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Images/domStorage.pngbin0 -> 442 bytes-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Images/radioDot.pngbin0 -> 235 bytes-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Images/resourcesSilhouette.pngbin0 -> 42925 bytes-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Images/userInputResultIcon.pngbin0 -> 259 bytes-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/KeyboardShortcut.js108
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ObjectPropertiesSection.js56
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/PanelEnablerView.js21
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ProfileDataGridTree.js398
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ProfileView.js452
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ProfilesPanel.js22
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Resource.js10
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ResourcesPanel.js70
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Script.js13
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ScriptsPanel.js154
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/SourceFrame.js72
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/SourceView.js20
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/StylesSidebarPane.js93
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/TextPrompt.js16
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/TopDownProfileDataGridTree.js111
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/WebKit.qrc11
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/inspector.css240
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/inspector.html11
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/inspector.js200
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/utilities.js42
-rw-r--r--src/3rdparty/webkit/WebCore/loader/Cache.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/loader/Cache.h2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedCSSStyleSheet.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedCSSStyleSheet.h2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedFont.cpp15
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedFont.h5
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedImage.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedImage.h8
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedResource.cpp139
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedResource.h29
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedScript.cpp17
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedScript.h6
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedXSLStyleSheet.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedXSLStyleSheet.h2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CrossOriginAccessControl.cpp116
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CrossOriginAccessControl.h41
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CrossOriginPreflightResultCache.cpp173
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CrossOriginPreflightResultCache.h78
-rw-r--r--src/3rdparty/webkit/WebCore/loader/DocLoader.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/loader/DocLoader.h6
-rw-r--r--src/3rdparty/webkit/WebCore/loader/DocumentLoader.cpp68
-rw-r--r--src/3rdparty/webkit/WebCore/loader/DocumentLoader.h20
-rw-r--r--src/3rdparty/webkit/WebCore/loader/DocumentThreadableLoader.cpp203
-rw-r--r--src/3rdparty/webkit/WebCore/loader/DocumentThreadableLoader.h84
-rw-r--r--src/3rdparty/webkit/WebCore/loader/EmptyClients.h96
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FTPDirectoryDocument.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FTPDirectoryParser.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FormState.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FormState.h16
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp1851
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoader.h279
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoaderClient.cpp92
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoaderClient.h52
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoaderTypes.h8
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ImageDocument.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ImageLoader.cpp136
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ImageLoader.h31
-rw-r--r--src/3rdparty/webkit/WebCore/loader/MainResourceLoader.cpp66
-rw-r--r--src/3rdparty/webkit/WebCore/loader/MainResourceLoader.h21
-rw-r--r--src/3rdparty/webkit/WebCore/loader/MediaDocument.cpp89
-rw-r--r--src/3rdparty/webkit/WebCore/loader/MediaDocument.h6
-rw-r--r--src/3rdparty/webkit/WebCore/loader/NetscapePlugInStreamLoader.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/loader/PlaceholderDocument.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/loader/PlaceholderDocument.h48
-rw-r--r--src/3rdparty/webkit/WebCore/loader/PluginDocument.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ProgressTracker.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ProgressTracker.h2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ResourceLoader.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ResourceLoader.h6
-rw-r--r--src/3rdparty/webkit/WebCore/loader/SubresourceLoader.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/loader/SubresourceLoader.h2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/SubresourceLoaderClient.h4
-rw-r--r--src/3rdparty/webkit/WebCore/loader/TextDocument.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/loader/TextResourceDecoder.cpp158
-rw-r--r--src/3rdparty/webkit/WebCore/loader/TextResourceDecoder.h36
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ThreadableLoader.cpp72
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ThreadableLoader.h85
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ThreadableLoaderClient.h57
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ThreadableLoaderClientWrapper.h117
-rw-r--r--src/3rdparty/webkit/WebCore/loader/WorkerThreadableLoader.cpp253
-rw-r--r--src/3rdparty/webkit/WebCore/loader/WorkerThreadableLoader.h147
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCache.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCache.h21
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheGroup.cpp859
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheGroup.h89
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheResource.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheResource.h8
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheStorage.cpp352
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheStorage.h39
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/DOMApplicationCache.cpp91
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/DOMApplicationCache.h14
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/DOMApplicationCache.idl13
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ManifestParser.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/loader/archive/ArchiveResourceCollection.h2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/archive/cf/LegacyWebArchive.cpp152
-rw-r--r--src/3rdparty/webkit/WebCore/loader/archive/cf/LegacyWebArchive.h27
-rw-r--r--src/3rdparty/webkit/WebCore/loader/archive/cf/LegacyWebArchiveMac.mm20
-rw-r--r--src/3rdparty/webkit/WebCore/loader/cf/ResourceLoaderCFNet.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp126
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.h16
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconDatabaseNone.cpp68
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconFetcher.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconLoader.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconLoader.h2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconRecord.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/PageURLRecord.h2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/loader.cpp154
-rw-r--r--src/3rdparty/webkit/WebCore/loader/loader.h45
-rwxr-xr-xsrc/3rdparty/webkit/WebCore/make-generated-sources.sh2
-rw-r--r--src/3rdparty/webkit/WebCore/page/AXObjectCache.cpp239
-rw-r--r--src/3rdparty/webkit/WebCore/page/AXObjectCache.h113
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityImageMapLink.cpp130
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityImageMapLink.h72
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityList.cpp94
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityList.h56
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityListBox.cpp177
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityListBoxOption.cpp207
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityObject.cpp1031
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityObject.h424
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityRenderObject.cpp2387
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityRenderObject.h237
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityTable.cpp491
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityTable.h86
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityTableCell.cpp157
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityTableCell.h65
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityTableColumn.cpp167
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityTableRow.cpp110
-rw-r--r--src/3rdparty/webkit/WebCore/page/AccessibilityTableRow.h65
-rw-r--r--src/3rdparty/webkit/WebCore/page/BarInfo.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/page/BarInfo.h3
-rw-r--r--src/3rdparty/webkit/WebCore/page/Chrome.cpp164
-rw-r--r--src/3rdparty/webkit/WebCore/page/Chrome.h9
-rw-r--r--src/3rdparty/webkit/WebCore/page/ChromeClient.h60
-rw-r--r--src/3rdparty/webkit/WebCore/page/Console.cpp155
-rw-r--r--src/3rdparty/webkit/WebCore/page/Console.h30
-rw-r--r--src/3rdparty/webkit/WebCore/page/Console.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/page/ContextMenuClient.h1
-rw-r--r--src/3rdparty/webkit/WebCore/page/ContextMenuController.cpp62
-rw-r--r--src/3rdparty/webkit/WebCore/page/ContextMenuController.h2
-rw-r--r--src/3rdparty/webkit/WebCore/page/Coordinates.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/page/Coordinates.h88
-rw-r--r--src/3rdparty/webkit/WebCore/page/Coordinates.idl41
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMSelection.cpp117
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMSelection.h10
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMSelection.idl40
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMTimer.cpp170
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMTimer.h75
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMWindow.cpp1021
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMWindow.h140
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMWindow.idl216
-rw-r--r--src/3rdparty/webkit/WebCore/page/DragController.cpp477
-rw-r--r--src/3rdparty/webkit/WebCore/page/DragController.h37
-rw-r--r--src/3rdparty/webkit/WebCore/page/EditorClient.h44
-rw-r--r--src/3rdparty/webkit/WebCore/page/EventHandler.cpp823
-rw-r--r--src/3rdparty/webkit/WebCore/page/EventHandler.h93
-rw-r--r--src/3rdparty/webkit/WebCore/page/FocusController.cpp84
-rw-r--r--src/3rdparty/webkit/WebCore/page/FocusController.h4
-rw-r--r--src/3rdparty/webkit/WebCore/page/Frame.cpp955
-rw-r--r--src/3rdparty/webkit/WebCore/page/Frame.h477
-rw-r--r--src/3rdparty/webkit/WebCore/page/FrameLoadRequest.h7
-rw-r--r--src/3rdparty/webkit/WebCore/page/FramePrivate.h99
-rw-r--r--src/3rdparty/webkit/WebCore/page/FrameTree.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/page/FrameTree.h6
-rw-r--r--src/3rdparty/webkit/WebCore/page/FrameView.cpp1103
-rw-r--r--src/3rdparty/webkit/WebCore/page/FrameView.h152
-rw-r--r--src/3rdparty/webkit/WebCore/page/Geolocation.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/page/Geolocation.h41
-rw-r--r--src/3rdparty/webkit/WebCore/page/Geoposition.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/page/Geoposition.h31
-rw-r--r--src/3rdparty/webkit/WebCore/page/Geoposition.idl10
-rw-r--r--src/3rdparty/webkit/WebCore/page/History.idl13
-rw-r--r--src/3rdparty/webkit/WebCore/page/Location.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/page/Location.idl27
-rw-r--r--src/3rdparty/webkit/WebCore/page/MouseEventWithHitTestResults.h5
-rw-r--r--src/3rdparty/webkit/WebCore/page/Navigator.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/page/Navigator.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/page/NavigatorBase.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/page/Page.cpp140
-rw-r--r--src/3rdparty/webkit/WebCore/page/Page.h43
-rw-r--r--src/3rdparty/webkit/WebCore/page/PageGroup.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/page/PageGroup.h12
-rw-r--r--src/3rdparty/webkit/WebCore/page/PageGroupLoadDeferrer.cpp72
-rw-r--r--src/3rdparty/webkit/WebCore/page/PageGroupLoadDeferrer.h41
-rw-r--r--src/3rdparty/webkit/WebCore/page/PositionOptions.h8
-rw-r--r--src/3rdparty/webkit/WebCore/page/PrintContext.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/page/Screen.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/page/Screen.h2
-rw-r--r--src/3rdparty/webkit/WebCore/page/SecurityOrigin.cpp124
-rw-r--r--src/3rdparty/webkit/WebCore/page/SecurityOrigin.h13
-rw-r--r--src/3rdparty/webkit/WebCore/page/Settings.cpp104
-rw-r--r--src/3rdparty/webkit/WebCore/page/Settings.h87
-rw-r--r--src/3rdparty/webkit/WebCore/page/WebKitPoint.h63
-rw-r--r--src/3rdparty/webkit/WebCore/page/WebKitPoint.idl33
-rw-r--r--src/3rdparty/webkit/WebCore/page/XSSAuditor.cpp267
-rw-r--r--src/3rdparty/webkit/WebCore/page/XSSAuditor.h118
-rw-r--r--src/3rdparty/webkit/WebCore/page/android/DragControllerAndroid.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/page/android/EventHandlerAndroid.cpp129
-rw-r--r--src/3rdparty/webkit/WebCore/page/android/InspectorControllerAndroid.cpp106
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/AnimationBase.cpp442
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/AnimationBase.h44
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/AnimationController.cpp369
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/AnimationController.h27
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/AnimationControllerPrivate.h135
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/CompositeAnimation.cpp810
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/CompositeAnimation.h47
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/ImplicitAnimation.cpp94
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/ImplicitAnimation.h13
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/KeyframeAnimation.cpp190
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/KeyframeAnimation.h13
-rw-r--r--src/3rdparty/webkit/WebCore/page/chromium/AccessibilityObjectChromium.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/page/chromium/AccessibilityObjectWrapper.h50
-rw-r--r--src/3rdparty/webkit/WebCore/page/qt/DragControllerQt.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/page/qt/FrameQt.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/page/win/AXObjectCacheWin.cpp61
-rw-r--r--src/3rdparty/webkit/WebCore/page/win/AccessibilityObjectWin.cpp40
-rw-r--r--src/3rdparty/webkit/WebCore/page/win/AccessibilityObjectWrapperWin.h54
-rw-r--r--src/3rdparty/webkit/WebCore/page/win/DragControllerWin.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/page/win/FrameCGWin.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/page/win/FrameWin.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/page/win/FrameWin.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Arena.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/platform/AutodrainedPool.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ContentType.cpp73
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ContentType.h47
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp147
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ContextMenu.h3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ContextMenuItem.h15
-rw-r--r--src/3rdparty/webkit/WebCore/platform/CookieJar.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp62
-rw-r--r--src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.h118
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Cursor.h7
-rw-r--r--src/3rdparty/webkit/WebCore/platform/DeprecatedPtrListImpl.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/DragImage.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/EventLoop.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/FileChooser.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/FileSystem.h41
-rw-r--r--src/3rdparty/webkit/WebCore/platform/GeolocationService.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/GeolocationService.h12
-rw-r--r--src/3rdparty/webkit/WebCore/platform/HostWindow.h9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/KURL.cpp183
-rw-r--r--src/3rdparty/webkit/WebCore/platform/KURL.h40
-rw-r--r--src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp962
-rw-r--r--src/3rdparty/webkit/WebCore/platform/KURLGooglePrivate.h115
-rw-r--r--src/3rdparty/webkit/WebCore/platform/KeyboardCodes.h574
-rw-r--r--src/3rdparty/webkit/WebCore/platform/LocalizedStrings.h16
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Logging.cpp71
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Logging.h5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.cpp115
-rw-r--r--src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/NotImplemented.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Pasteboard.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/PlatformMouseEvent.h71
-rw-r--r--src/3rdparty/webkit/WebCore/platform/PlatformWheelEvent.h75
-rw-r--r--src/3rdparty/webkit/WebCore/platform/PopupMenuStyle.h10
-rw-r--r--src/3rdparty/webkit/WebCore/platform/PurgeableBuffer.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/RunLoopTimer.h79
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ScrollView.cpp282
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ScrollView.h37
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Scrollbar.cpp100
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Scrollbar.h24
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ScrollbarClient.h26
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ScrollbarTheme.h1
-rw-r--r--src/3rdparty/webkit/WebCore/platform/SharedBuffer.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/SharedTimer.h43
-rw-r--r--src/3rdparty/webkit/WebCore/platform/SuddenTermination.h43
-rw-r--r--src/3rdparty/webkit/WebCore/platform/SystemTime.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Theme.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ThemeTypes.h8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ThreadCheck.h14
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ThreadGlobalData.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ThreadGlobalData.h13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ThreadTimers.cpp158
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ThreadTimers.h69
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Timer.cpp177
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Timer.h20
-rw-r--r--src/3rdparty/webkit/WebCore/platform/TreeShared.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Widget.cpp106
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Widget.h30
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/ClipboardAndroid.cpp105
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/ClipboardAndroid.h64
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/CursorAndroid.cpp295
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/DragDataAndroid.cpp96
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/EventLoopAndroid.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/FileChooserAndroid.cpp61
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/FileSystemAndroid.cpp131
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/KeyEventAndroid.cpp273
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/KeyboardCodes.h545
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/LocalizedStringsAndroid.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/PopupMenuAndroid.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/RenderThemeAndroid.cpp334
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/RenderThemeAndroid.h109
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/ScreenAndroid.cpp109
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/ScrollViewAndroid.cpp105
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/SearchPopupMenuAndroid.cpp52
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/SystemTimeAndroid.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/TemporaryLinkStubs.cpp673
-rw-r--r--src/3rdparty/webkit/WebCore/platform/android/WidgetAndroid.cpp128
-rw-r--r--src/3rdparty/webkit/WebCore/platform/animation/Animation.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/platform/animation/Animation.h25
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.cpp35
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h26
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Color.cpp76
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Color.h9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint.h9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint3D.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint3D.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FloatQuad.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FloatQuad.h8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FloatRect.h5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Font.cpp93
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Font.h43
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontCache.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontCache.h43
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontData.h7
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontFallbackList.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontFallbackList.h16
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GeneratedImage.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GlyphBuffer.h14
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GlyphPageTreeNode.cpp66
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GlyphPageTreeNode.h78
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GlyphWidthMap.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GlyphWidthMap.h45
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Gradient.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Gradient.h11
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.cpp107
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h78
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContextPrivate.h18
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp571
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h423
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayerClient.h69
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsTypes.h8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Image.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Image.h45
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/ImageBuffer.h16
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h7
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/IntPoint.h31
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/IntRect.h8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/IntSize.h13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp338
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h137
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h117
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Path.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Path.h20
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/Pattern.h6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/SegmentedFontData.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/SegmentedFontData.h16
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.cpp98
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h56
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/WidthIterator.cpp27
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/WidthIterator.h5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.h13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEColorMatrix.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEColorMatrix.h13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComponentTransfer.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComponentTransfer.h14
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.h13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/Filter.h58
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp83
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h114
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h49
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceGraphic.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceGraphic.h50
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.cpp408
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.h58
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/FontCacheQt.cpp245
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/FontFallbackListQt.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/FontPlatformData.h34
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/FontPlatformDataQt.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt43.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/GradientQt.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp105
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/IconQt.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageSourceQt.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.cpp68
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.h43
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/PatternQt.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/TransformationMatrixQt.cpp165
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp56
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h72
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/MatrixTransformOperation.h19
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h71
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp61
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/RotateTransformOperation.h29
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/ScaleTransformOperation.h23
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformOperation.h26
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformOperations.h10
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.cpp1076
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.h304
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/transforms/TranslateTransformOperation.h25
-rw-r--r--src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h371
-rw-r--r--src/3rdparty/webkit/WebCore/platform/image-decoders/cairo/ImageDecoderCairo.cpp124
-rw-r--r--src/3rdparty/webkit/WebCore/platform/image-decoders/wx/ImageDecoderWx.cpp172
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm150
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/CookieJar.mm5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/DragDataMac.mm2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/DragImageMac.mm31
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/FoundationExtras.h3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.h75
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.mm219
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/LocalCurrentGraphicsContext.h6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/LocalizedStringsMac.mm120
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/LoggingMac.mm2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/PasteboardMac.mm23
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/PlatformMouseEventMac.mm40
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/PlatformScreenMac.mm6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/RuntimeApplicationChecks.h37
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/RuntimeApplicationChecks.mm50
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/ScrollbarThemeMac.mm28
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/SharedBufferMac.mm10
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/SharedTimerMac.mm10
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/SuddenTermination.mm45
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/SystemTimeMac.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/ThreadCheck.mm62
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WebCoreKeyGenerator.m9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WebCoreObjCExtras.mm3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WebCoreSystemInterface.h24
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WebCoreSystemInterface.mm17
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WebCoreTextRenderer.h40
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WebCoreTextRenderer.mm93
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WebFontCache.h5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WebFontCache.mm24
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WheelEventMac.mm18
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/WidgetMac.mm88
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/FormData.cpp27
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/FormData.h9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/FormDataBuilder.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp63
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.h14
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/HTTPParsers.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/HTTPParsers.h1
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp17
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.h7
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceHandle.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceHandle.h25
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceHandleClient.h8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceHandleInternal.h27
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp104
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.h46
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp289
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.h104
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/chromium/ResourceResponse.h83
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/qt/ResourceHandleQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/posix/FileSystemPOSIX.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.h17
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ContextMenuItemQt.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ContextMenuQt.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/CookieJarQt.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/CursorQt.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp27
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/DragImageQt.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/FileSystemQt.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/KURLQt.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/KeyboardCodes.h561
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/LoggingQt.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/MIMETypeRegistryQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/MenuEventProxy.h54
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/PasteboardQt.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/PlatformMouseEventQt.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/QWebPopup.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp182
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.h24
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ScreenQt.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ScrollViewQt.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ScrollbarThemeQt.cpp36
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ScrollbarThemeQt.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/SharedBufferQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/SharedTimerQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/SystemTimeQt.cpp46
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/TemporaryLinkStubs.cpp72
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.cpp17
-rw-r--r--src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/sql/SQLiteFileSystem.cpp123
-rw-r--r--src/3rdparty/webkit/WebCore/platform/sql/SQLiteFileSystem.h114
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/AtomicString.h20
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/Base64.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/BidiContext.cpp31
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/BidiContext.h33
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/BidiResolver.h46
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/CString.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/CString.h17
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/CharacterNames.h14
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/PlatformString.h29
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/RegularExpression.cpp121
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/RegularExpression.h14
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/String.cpp129
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/StringBuffer.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/StringBuilder.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp288
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/StringImpl.h74
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextBoundaries.h5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextBoundariesICU.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextBreakIterator.h12
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextBreakIteratorICU.cpp116
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextBreakIteratorInternalICU.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextCodec.h5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextCodecICU.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextCodecICU.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextCodecLatin1.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextCodecUTF16.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextCodecUserDefined.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextDecoder.cpp129
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextDecoder.h64
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextEncoding.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextEncoding.h27
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextEncodingDetector.h48
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextEncodingDetectorICU.cpp129
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextEncodingDetectorNone.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.h10
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextStream.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextStream.h1
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/android/TextBreakIteratorInternalICU.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/cf/StringImplCF.cpp131
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/mac/ShapeArabic.c9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/mac/StringImplMac.mm8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/mac/StringMac.mm1
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/mac/TextBoundaries.mm2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/mac/TextBreakIteratorInternalICUMac.mm96
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/mac/TextCodecMac.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/qt/StringQt.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/qt/TextBoundaries.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/qt/TextBreakIteratorQt.cpp51
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/symbian/StringImplSymbian.cpp53
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/symbian/StringSymbian.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/win/TextBreakIteratorInternalICUWin.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/platform/win/SystemTimeWin.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDataNone.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDatabase.h19
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDebug.cpp168
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDebug.h37
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp86
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginPackage.h1
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginPackageNone.cpp77
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginStream.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginView.cpp118
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginView.h29
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp156
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp81
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp146
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/npfunctions.h9
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginContainerQt.cpp149
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginContainerQt.h63
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp92
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp165
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/win/PaintHooks.asm50
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/win/PluginDatabaseWin.cpp46
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/win/PluginMessageThrottlerWin.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/win/PluginPackageWin.cpp82
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp325
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/AutoTableLayout.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/CounterNode.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/EllipsisBox.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/EllipsisBox.h11
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/FixedTableLayout.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/HitTestRequest.h34
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/HitTestResult.cpp64
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/HitTestResult.h9
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/InlineBox.cpp113
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/InlineBox.h135
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/InlineFlowBox.cpp647
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/InlineFlowBox.h82
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/InlineTextBox.cpp362
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/InlineTextBox.h59
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/LayoutState.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/LayoutState.h13
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/ListMarkerBox.cpp45
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/ListMarkerBox.h41
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/MediaControlElements.cpp410
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/MediaControlElements.h117
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/OverlapTestRequestClient.h39
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/PointerEventsHitRules.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderApplet.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderApplet.h9
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderArena.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBR.cpp15
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBR.h8
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp2117
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBlock.h260
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBlockLineLayout.cpp2264
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp1656
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBox.h304
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBoxModelObject.cpp1356
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBoxModelObject.h134
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderButton.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderButton.h25
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderContainer.cpp701
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderContainer.h75
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderCounter.cpp15
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderCounter.h1
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderDataGrid.cpp250
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderDataGrid.h84
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFieldset.cpp75
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFieldset.h5
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFileUploadControl.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFileUploadControl.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFlexibleBox.cpp278
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFlexibleBox.h4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFlow.cpp883
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFlow.h146
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderForeignObject.cpp95
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderForeignObject.h19
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFrame.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFrame.h14
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFrameSet.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderFrameSet.h17
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderHTMLCanvas.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderImage.cpp98
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderImage.h16
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderImageGeneratedContent.h14
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderInline.cpp876
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderInline.h130
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp1629
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayer.h258
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.cpp1091
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.h177
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayerCompositor.cpp988
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayerCompositor.h185
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLegend.cpp36
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLegend.h42
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLineBoxList.cpp333
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLineBoxList.h86
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderListBox.cpp183
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderListBox.h13
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderListItem.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderListItem.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderListMarker.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderListMarker.h10
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMarquee.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMarquee.h3
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMedia.cpp335
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMedia.h44
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMediaControls.cpp150
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMediaControls.h43
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMenuList.cpp147
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMenuList.h15
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp2441
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderObject.h783
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderObjectChildList.cpp426
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderObjectChildList.h67
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderPart.cpp82
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderPart.h22
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderPartObject.cpp178
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderPartObject.h10
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderPath.cpp186
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderPath.h46
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderReplaced.cpp141
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderReplaced.h16
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderReplica.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderReplica.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGBlock.h3
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGContainer.cpp356
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGContainer.h78
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGGradientStop.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGGradientStop.h16
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGHiddenContainer.cpp36
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGHiddenContainer.h29
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGImage.cpp115
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGImage.h38
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGInline.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGInline.h18
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGInlineText.cpp92
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGInlineText.h17
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGModelObject.cpp97
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGModelObject.h71
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGRoot.cpp305
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGRoot.h53
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGTSpan.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGTSpan.h11
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGText.cpp145
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGText.h37
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGTextPath.cpp51
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGTextPath.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGTransformableContainer.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGTransformableContainer.h15
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGViewportContainer.cpp126
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSVGViewportContainer.h23
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderScrollbar.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderScrollbar.h16
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderScrollbarPart.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderScrollbarPart.h5
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSelectionInfo.h104
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSlider.cpp467
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSlider.h42
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTable.cpp262
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTable.h39
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTableCell.cpp190
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTableCell.h43
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTableCol.cpp34
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTableCol.h22
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTableRow.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTableRow.h17
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTableSection.cpp263
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTableSection.h34
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderText.cpp428
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderText.h74
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControl.cpp216
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControl.h42
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControlMultiLine.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControlMultiLine.h1
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.cpp289
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.h23
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextFragment.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTheme.cpp196
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTheme.h98
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumLinux.cpp99
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumLinux.h62
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.h220
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.mm2030
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumSkia.cpp634
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumSkia.h144
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumWin.cpp581
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumWin.h106
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeMac.h26
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeSafari.cpp160
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeSafari.h9
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeWin.cpp310
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeWin.h28
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeWince.cpp667
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeWince.h147
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTreeAsText.cpp124
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderVideo.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderVideo.h15
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderView.cpp281
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderView.h153
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderWidget.cpp145
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderWidget.h49
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RootInlineBox.cpp124
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RootInlineBox.h44
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGCharacterLayoutInfo.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGCharacterLayoutInfo.h3
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGInlineFlowBox.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGInlineFlowBox.h9
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGInlineTextBox.cpp93
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGInlineTextBox.h12
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGRenderSupport.cpp112
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGRenderSupport.h53
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGRenderTreeAsText.cpp205
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGRenderTreeAsText.h6
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGRootInlineBox.cpp128
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGRootInlineBox.h7
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/ScrollBehavior.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/ScrollBehavior.h78
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/TextControlInnerElements.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/TextControlInnerElements.h4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/TransformState.cpp169
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/TransformState.h133
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/bidi.cpp2222
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/bidi.h67
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/break_lines.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/ContentData.cpp58
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/ContentData.h50
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/CounterContent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/FillLayer.h10
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/RenderStyle.cpp337
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/RenderStyle.h196
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/RenderStyleConstants.h60
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyle.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyleDefs.h4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/ShadowData.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/ShadowData.h20
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/StyleGeneratedImage.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/StyleInheritedData.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/StyleInheritedData.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/StyleRareInheritedData.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/StyleRareNonInheritedData.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/StyleRareNonInheritedData.h13
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/StyleTransformData.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/StyleTransformData.h1
-rw-r--r--src/3rdparty/webkit/WebCore/storage/ChangeVersionWrapper.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/storage/ChangeVersionWrapper.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/Database.cpp85
-rw-r--r--src/3rdparty/webkit/WebCore/storage/Database.h20
-rw-r--r--src/3rdparty/webkit/WebCore/storage/Database.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseAuthorizer.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseAuthorizer.h8
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseDetails.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseTask.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseTask.h17
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseThread.cpp35
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseThread.h17
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseTracker.cpp65
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseTracker.h3
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseTrackerClient.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorage.cpp172
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorage.h81
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageArea.cpp416
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageArea.h105
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageTask.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageTask.h24
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageThread.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageThread.h14
-rw-r--r--src/3rdparty/webkit/WebCore/storage/OriginQuotaManager.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/OriginQuotaManager.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/OriginUsageRecord.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/storage/OriginUsageRecord.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLError.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLError.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLResultSet.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLResultSet.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLResultSet.idl8
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLResultSetRowList.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLResultSetRowList.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLResultSetRowList.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLStatement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLStatement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLStatementCallback.h6
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLStatementCallback.idl35
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLStatementErrorCallback.h6
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLStatementErrorCallback.idl35
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLTransaction.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLTransaction.h5
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLTransaction.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLTransactionCallback.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLTransactionCallback.idl35
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLTransactionErrorCallback.h6
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLTransactionErrorCallback.idl35
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SessionStorage.cpp75
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SessionStorage.h64
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SessionStorageArea.cpp89
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SessionStorageArea.h57
-rw-r--r--src/3rdparty/webkit/WebCore/storage/Storage.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/storage/Storage.h8
-rw-r--r--src/3rdparty/webkit/WebCore/storage/Storage.idl3
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageArea.cpp125
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageArea.h58
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.cpp261
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.h85
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageAreaSync.cpp338
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageAreaSync.h96
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageEvent.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageEvent.h34
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageEvent.idl10
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageMap.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageMap.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageNamespace.cpp51
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageNamespace.h57
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.cpp133
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.h74
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageSyncManager.cpp104
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageSyncManager.h71
-rw-r--r--src/3rdparty/webkit/WebCore/svg/Filter.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/svg/Filter.h46
-rw-r--r--src/3rdparty/webkit/WebCore/svg/FilterBuilder.h51
-rw-r--r--src/3rdparty/webkit/WebCore/svg/FilterEffect.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/svg/FilterEffect.h48
-rw-r--r--src/3rdparty/webkit/WebCore/svg/GradientAttributes.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/LinearGradientAttributes.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/PatternAttributes.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/RadialGradientAttributes.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAElement.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAllInOne.cpp152
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimateMotionElement.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimateTransformElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimatedPathData.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimatedPoints.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimatedProperty.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGCircleElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGColor.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGColor.h4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGComponentTransferFunctionElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGComponentTransferFunctionElement.h4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGComponentTransferFunctionElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGCursorElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGDocument.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGDocument.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGDocumentExtensions.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGElement.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGElementInstance.cpp164
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGElementInstance.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGElementInstance.idl88
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGException.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEBlendElement.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEBlendElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEBlendElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEColorMatrixElement.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEColorMatrixElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEColorMatrixElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEComponentTransferElement.cpp27
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEComponentTransferElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEComponentTransferElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFECompositeElement.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFECompositeElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFECompositeElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDiffuseLightingElement.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDiffuseLightingElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDiffuseLightingElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDisplacementMapElement.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDisplacementMapElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDisplacementMapElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDistantLightElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDistantLightElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEDistantLightElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncAElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncAElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncAElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncBElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncBElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncBElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncGElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncGElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncGElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncRElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncRElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFuncRElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEGaussianBlurElement.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEGaussianBlurElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEGaussianBlurElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFELightElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFELightElement.h4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMergeElement.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMergeElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMergeElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMergeNodeElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMergeNodeElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMergeNodeElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEOffsetElement.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEOffsetElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEOffsetElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEPointLightElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEPointLightElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEPointLightElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFESpecularLightingElement.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFESpecularLightingElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFESpecularLightingElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFESpotLightElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFESpotLightElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFESpotLightElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFETileElement.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFETileElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFETileElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFETurbulenceElement.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFETurbulenceElement.h7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFETurbulenceElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterElement.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFont.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFontFaceElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFontFaceUriElement.cpp42
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFontFaceUriElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGGlyphElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGGlyphElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGGradientElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGHKernElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGImageElement.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGImageLoader.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGLangSpace.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGLength.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGLineElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGLinearGradientElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGList.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGListTraits.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGLocatable.cpp70
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMPathElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMaskElement.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMaskElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMatrix.idl18
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMetadataElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGParserUtilities.cpp115
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPathElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPathElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPathSeg.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPathSegClosePath.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPathSegCurvetoCubicSmooth.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPathSegList.idl14
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPatternElement.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPointList.idl14
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPolyElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPolyElement.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPreserveAspectRatio.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGRadialGradientElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGRectElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSVGElement.cpp57
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSVGElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGScriptElement.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGScriptElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSetElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGStopElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGStyleElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGStyledElement.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGStyledTransformableElement.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTests.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.cpp51
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.h16
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.idl16
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextPositioningElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTitleElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTransform.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTransformDistance.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTransformList.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTransformList.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTransformList.idl14
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTransformable.cpp15
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGURIReference.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGUseElement.cpp46
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGViewElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGViewSpec.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGViewSpec.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SynchronizableTypeWrapper.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/animation/SMILTime.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/svg/animation/SMILTime.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/animation/SMILTimeContainer.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/animation/SVGSMILElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/animation/SVGSMILElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp119
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.h14
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGPaintServer.cpp54
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGPaintServer.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGPaintServerGradient.cpp101
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGPaintServerGradient.h5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGPaintServerPattern.cpp100
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGPaintServerPattern.h11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGPaintServerSolid.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGPaintServerSolid.h1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResource.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceClipper.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp103
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h54
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceMarker.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceMasker.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGDistantLightSource.h4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEConvolveMatrix.h11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDiffuseLighting.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDisplacementMap.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEDisplacementMap.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.h14
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEImage.h11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.cpp37
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMerge.h13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEOffset.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFESpecularLighting.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFESpecularLighting.h12
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.cpp44
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETile.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETurbulence.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFETurbulence.h9
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp84
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h57
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp79
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilterBuilder.h56
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilterEffect.cpp133
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilterEffect.h99
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGLightSource.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGLightSource.h4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGPointLightSource.h4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGSpotLightSource.h4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/qt/RenderPathQt.cpp47
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/qt/SVGPaintServerPatternQt.cpp90
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/qt/SVGPaintServerQt.cpp72
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/qt/SVGResourceFilterQt.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/qt/SVGResourceMaskerQt.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/svg/svgattrs.in4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/svgtags.in8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/xlinkattrs.in2
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLAElement.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLAccessElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLAnchorElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLAttributeNames.in2
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLBRElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLCardElement.cpp55
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLCardElement.h4
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLDoElement.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLDoElement.h4
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLDocument.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLDocument.h2
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLElement.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLErrorHandling.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLEventHandlingElement.cpp27
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLEventHandlingElement.h16
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLFieldSetElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLFieldSetElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLFormControlElement.cpp80
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLFormControlElement.h53
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLGoElement.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLImageElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLImageLoader.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLInputElement.cpp507
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLInputElement.h110
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLInsertedLegendElement.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLInsertedLegendElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLMetaElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLNoopElement.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLOnEventElement.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLOptGroupElement.cpp170
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLOptGroupElement.h66
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLOptionElement.cpp171
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLOptionElement.h69
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLPElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLPageState.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLPageState.h4
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLPostfieldElement.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLPostfieldElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLSelectElement.cpp547
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLSelectElement.h113
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLSetvarElement.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLSetvarElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLTableElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLTagNames.in11
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLTemplateElement.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLTemplateElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLTimerElement.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLTimerElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/workers/AbstractWorker.cpp139
-rw-r--r--src/3rdparty/webkit/WebCore/workers/AbstractWorker.h86
-rw-r--r--src/3rdparty/webkit/WebCore/workers/AbstractWorker.idl52
-rw-r--r--src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.cpp101
-rw-r--r--src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.h64
-rw-r--r--src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.idl48
-rw-r--r--src/3rdparty/webkit/WebCore/workers/GenericWorkerTask.h485
-rw-r--r--src/3rdparty/webkit/WebCore/workers/SharedWorker.cpp52
-rw-r--r--src/3rdparty/webkit/WebCore/workers/SharedWorker.h61
-rw-r--r--src/3rdparty/webkit/WebCore/workers/SharedWorker.idl42
-rw-r--r--src/3rdparty/webkit/WebCore/workers/Worker.cpp133
-rw-r--r--src/3rdparty/webkit/WebCore/workers/Worker.h93
-rw-r--r--src/3rdparty/webkit/WebCore/workers/Worker.idl43
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerContext.cpp274
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerContext.h144
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerContext.idl83
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerContextProxy.h67
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerLoaderProxy.h64
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerLocation.cpp85
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerLocation.h (renamed from src/3rdparty/webkit/WebCore/dom/WorkerLocation.h)0
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerLocation.idl (renamed from src/3rdparty/webkit/WebCore/dom/WorkerLocation.idl)0
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.cpp361
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.h110
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerObjectProxy.h67
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerRunLoop.cpp209
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerRunLoop.h82
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerScriptLoader.cpp179
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerScriptLoader.h94
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerScriptLoaderClient.h47
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerThread.cpp154
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerThread.h81
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XMLHttpRequest.cpp559
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XMLHttpRequest.h55
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XMLHttpRequest.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XMLHttpRequestException.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XMLHttpRequestProgressEvent.idl3
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XMLHttpRequestUpload.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XMLHttpRequestUpload.h2
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XMLHttpRequestUpload.idl3
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathException.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathExpression.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathExpressionNode.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathExpressionNode.h34
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathFunctions.cpp131
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathFunctions.h12
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathGrammar.y8
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathNodeSet.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathNodeSet.h16
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathParser.h2
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathPath.cpp92
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathPath.h17
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathPredicate.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathPredicate.h18
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathResult.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathResult.h22
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathStep.cpp283
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathStep.h43
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathUtil.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathValue.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XPathVariableReference.h4
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XSLStyleSheet.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XSLTExtensions.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XSLTProcessor.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/xml/XSLTUnicodeSort.cpp54
-rw-r--r--src/3rdparty/webkit/WebKit.pri37
-rw-r--r--src/3rdparty/webkit/WebKit/ChangeLog506
-rw-r--r--src/3rdparty/webkit/WebKit/StringsNotToBeLocalized.txt182
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/headers.pri5
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebdatabase.cpp62
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebdatabase.h6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebdatabase_p.h3
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebelement.cpp1675
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h152
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp530
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebframe.h34
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebframe_p.h36
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebhistory.cpp160
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebhistory.h31
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebhistory_p.h31
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebhistoryinterface.cpp16
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebhistoryinterface.h3
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebkitglobal.h22
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp408
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebpage.h37
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebpage_p.h21
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebpluginfactory.cpp14
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebpluginfactory.h17
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebsecurityorigin.cpp40
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebsecurityorigin.h3
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebsecurityorigin_p.h3
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.cpp159
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.h14
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebview.cpp168
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebview.h58
-rw-r--r--src/3rdparty/webkit/WebKit/qt/ChangeLog2579
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.cpp1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp45
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/ChromeClientQt.h21
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/ContextMenuClientQt.cpp6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/ContextMenuClientQt.h1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/DragClientQt.cpp1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/EditCommandQt.cpp1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/EditorClientQt.cpp15
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/EditorClientQt.h1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp127
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h15
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.h2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebKit_pch.h3
-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/qtwebkit.qdoc144
-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/qtwebkit.qdocconf4
-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/qwebview-diagram.pngbin0 -> 9036 bytes-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/webkitsnippets/simple/main.cpp2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/webkitsnippets/webelement/main.cpp69
-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/webkitsnippets/webelement/webelement.pro5
-rw-r--r--src/3rdparty/webkit/WebKit/qt/docs/webkitsnippets/webpage/main.cpp2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/benchmarks/loading/tst_loading.cpp105
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/benchmarks/loading/tst_loading.pro6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/benchmarks/painting/tst_painting.cpp109
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/benchmarks/painting/tst_painting.pro6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebelement/qwebelement.pro7
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebelement/qwebelement.qrc6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebelement/style.css1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebelement/style2.css1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp882
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebframe/qwebframe.qrc3
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebframe/style.css1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebframe/test1.html1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebframe/test2.html1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp294
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/data/page1.html1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/data/page2.html1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/data/page3.html1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/data/page4.html1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/data/page5.html1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/data/page6.html1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/qwebhistory.pro7
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/tst_qwebhistory.cpp326
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebhistory/tst_qwebhistory.qrc11
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/frametest/frame_a.html2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/frametest/iframe.html6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/frametest/iframe2.html7
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/frametest/iframe3.html5
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/frametest/index.html4
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/qwebpage.pro1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp150
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.qrc10
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebview/.gitignore1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebview/qwebview.pro6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebview/tst_qwebview.cpp165
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/tests.pro3
-rw-r--r--src/activeqt/container/qaxbase.cpp158
-rw-r--r--src/activeqt/container/qaxdump.cpp42
-rw-r--r--src/activeqt/container/qaxobject.cpp12
-rw-r--r--src/activeqt/container/qaxscript.cpp26
-rw-r--r--src/activeqt/container/qaxselect.cpp34
-rw-r--r--src/activeqt/container/qaxwidget.cpp134
-rw-r--r--src/activeqt/control/qaxfactory.cpp12
-rw-r--r--src/activeqt/control/qaxserver.cpp199
-rw-r--r--src/activeqt/control/qaxserverbase.cpp286
-rw-r--r--src/activeqt/control/qaxserverdll.cpp4
-rw-r--r--src/activeqt/control/qaxservermain.cpp17
-rw-r--r--src/activeqt/shared/qaxtypes.cpp17
-rw-r--r--src/activeqt/shared/qaxtypes.h3
-rw-r--r--src/corelib/animation/animation.pri25
-rw-r--r--src/corelib/animation/qabstractanimation.cpp728
-rw-r--r--src/corelib/animation/qabstractanimation.h137
-rw-r--r--src/corelib/animation/qabstractanimation_p.h153
-rw-r--r--src/corelib/animation/qanimationgroup.cpp302
-rw-r--r--src/corelib/animation/qanimationgroup.h88
-rw-r--r--src/corelib/animation/qanimationgroup_p.h83
-rw-r--r--src/corelib/animation/qparallelanimationgroup.cpp324
-rw-r--r--src/corelib/animation/qparallelanimationgroup.h86
-rw-r--r--src/corelib/animation/qparallelanimationgroup_p.h89
-rw-r--r--src/corelib/animation/qpauseanimation.cpp154
-rw-r--r--src/corelib/animation/qpauseanimation.h84
-rw-r--r--src/corelib/animation/qpropertyanimation.cpp300
-rw-r--r--src/corelib/animation/qpropertyanimation.h89
-rw-r--r--src/corelib/animation/qpropertyanimation_p.h90
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.cpp594
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.h96
-rw-r--r--src/corelib/animation/qsequentialanimationgroup_p.h114
-rw-r--r--src/corelib/animation/qvariantanimation.cpp669
-rw-r--r--src/corelib/animation/qvariantanimation.h130
-rw-r--r--src/corelib/animation/qvariantanimation_p.h124
-rw-r--r--src/corelib/arch/arch.pri12
-rw-r--r--src/corelib/arch/generic/qatomic_generic_unix.cpp5
-rw-r--r--src/corelib/arch/qatomic_arch.h6
-rw-r--r--src/corelib/arch/qatomic_arm.h32
-rw-r--r--src/corelib/arch/qatomic_symbian.h56
-rw-r--r--src/corelib/arch/qatomic_vxworks.h318
-rw-r--r--src/corelib/arch/qatomic_windows.h561
-rw-r--r--src/corelib/arch/symbian/arch.pri5
-rw-r--r--src/corelib/arch/symbian/qatomic_symbian.cpp116
-rw-r--r--src/corelib/arch/vxworks/arch.pri6
-rw-r--r--src/corelib/arch/vxworks/qatomic_ppc.s415
-rw-r--r--src/corelib/codecs/codecs.pri2
-rw-r--r--src/corelib/codecs/codecs.qdoc546
-rw-r--r--src/corelib/codecs/qfontlaocodec.cpp3
-rw-r--r--src/corelib/codecs/qiconvcodec.cpp13
-rw-r--r--src/corelib/codecs/qisciicodec.cpp9
-rw-r--r--src/corelib/codecs/qlatincodec.cpp6
-rw-r--r--src/corelib/codecs/qsimplecodec.cpp6
-rw-r--r--src/corelib/codecs/qtextcodec.cpp191
-rw-r--r--src/corelib/codecs/qtextcodec.h3
-rw-r--r--src/corelib/codecs/qtextcodec_p.h27
-rw-r--r--src/corelib/codecs/qtsciicodec.cpp3
-rw-r--r--src/corelib/codecs/qtsciicodec_p.h2
-rw-r--r--src/corelib/codecs/qutfcodec.cpp370
-rw-r--r--src/corelib/codecs/qutfcodec_p.h53
-rw-r--r--src/corelib/concurrent/qfuture.cpp6
-rw-r--r--src/corelib/concurrent/qfuturesynchronizer.cpp6
-rw-r--r--src/corelib/concurrent/qfuturewatcher.cpp10
-rw-r--r--src/corelib/concurrent/qfuturewatcher_p.h6
-rw-r--r--src/corelib/concurrent/qrunnable.cpp2
-rw-r--r--src/corelib/concurrent/qtconcurrentfilter.cpp4
-rw-r--r--src/corelib/concurrent/qtconcurrentiteratekernel.cpp16
-rw-r--r--src/corelib/concurrent/qtconcurrentiteratekernel.h23
-rw-r--r--src/corelib/concurrent/qtconcurrentmap.cpp15
-rw-r--r--src/corelib/concurrent/qtconcurrentrun.cpp6
-rw-r--r--src/corelib/concurrent/qtconcurrentthreadengine.cpp94
-rw-r--r--src/corelib/concurrent/qtconcurrentthreadengine.h79
-rw-r--r--src/corelib/concurrent/qthreadpool.cpp20
-rw-r--r--src/corelib/corelib.pro12
-rw-r--r--src/corelib/global/qendian.qdoc168
-rw-r--r--src/corelib/global/qfeatures.h10
-rw-r--r--src/corelib/global/qfeatures.txt29
-rw-r--r--src/corelib/global/qglobal.cpp599
-rw-r--r--src/corelib/global/qglobal.h499
-rw-r--r--src/corelib/global/qlibraryinfo.cpp49
-rw-r--r--src/corelib/global/qnamespace.h97
-rw-r--r--src/corelib/global/qnamespace.qdoc2783
-rw-r--r--src/corelib/global/qt_windows.h40
-rw-r--r--src/corelib/io/io.pri16
-rw-r--r--src/corelib/io/qabstractfileengine.cpp27
-rw-r--r--src/corelib/io/qabstractfileengine.h7
-rw-r--r--src/corelib/io/qdatastream.cpp12
-rw-r--r--src/corelib/io/qdatastream.h10
-rw-r--r--src/corelib/io/qdebug.cpp3
-rw-r--r--src/corelib/io/qdebug.h52
-rw-r--r--src/corelib/io/qdir.cpp143
-rw-r--r--src/corelib/io/qdir.h3
-rw-r--r--src/corelib/io/qdiriterator.cpp252
-rw-r--r--src/corelib/io/qdiriterator.h2
-rw-r--r--src/corelib/io/qfile.cpp45
-rw-r--r--src/corelib/io/qfile_p.h1
-rw-r--r--src/corelib/io/qfileinfo.cpp91
-rw-r--r--src/corelib/io/qfileinfo.h3
-rw-r--r--src/corelib/io/qfileinfo_p.h62
-rw-r--r--src/corelib/io/qfilesystemwatcher.cpp24
-rw-r--r--src/corelib/io/qfilesystemwatcher_dnotify.cpp22
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents.cpp472
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents_p.h128
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify.cpp40
-rw-r--r--src/corelib/io/qfilesystemwatcher_kqueue.cpp5
-rw-r--r--src/corelib/io/qfilesystemwatcher_p.h7
-rw-r--r--src/corelib/io/qfilesystemwatcher_symbian.cpp291
-rw-r--r--src/corelib/io/qfilesystemwatcher_symbian_p.h130
-rw-r--r--src/corelib/io/qfilesystemwatcher_win.cpp435
-rw-r--r--src/corelib/io/qfilesystemwatcher_win_p.h53
-rw-r--r--src/corelib/io/qfsfileengine.cpp8
-rw-r--r--src/corelib/io/qfsfileengine_iterator.cpp1
-rw-r--r--src/corelib/io/qfsfileengine_iterator_p.h2
-rw-r--r--src/corelib/io/qfsfileengine_iterator_unix.cpp14
-rw-r--r--src/corelib/io/qfsfileengine_iterator_win.cpp44
-rw-r--r--src/corelib/io/qfsfileengine_p.h8
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp477
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp1412
-rw-r--r--src/corelib/io/qiodevice.cpp38
-rw-r--r--src/corelib/io/qiodevice.h3
-rw-r--r--src/corelib/io/qnoncontiguousbytedevice.cpp543
-rw-r--r--src/corelib/io/qnoncontiguousbytedevice_p.h184
-rw-r--r--src/corelib/io/qprocess.cpp457
-rw-r--r--src/corelib/io/qprocess.h41
-rw-r--r--src/corelib/io/qprocess_p.h26
-rw-r--r--src/corelib/io/qprocess_symbian.cpp1041
-rw-r--r--src/corelib/io/qprocess_unix.cpp372
-rw-r--r--src/corelib/io/qprocess_win.cpp275
-rw-r--r--src/corelib/io/qresource.cpp114
-rw-r--r--src/corelib/io/qresource.h2
-rw-r--r--src/corelib/io/qresource_iterator.cpp8
-rw-r--r--src/corelib/io/qresource_iterator_p.h4
-rw-r--r--src/corelib/io/qsettings.cpp149
-rw-r--r--src/corelib/io/qsettings.h2
-rw-r--r--src/corelib/io/qsettings_p.h6
-rw-r--r--src/corelib/io/qsettings_win.cpp211
-rw-r--r--src/corelib/io/qtemporaryfile.cpp28
-rw-r--r--src/corelib/io/qtextstream.cpp33
-rw-r--r--src/corelib/io/qtextstream.h5
-rw-r--r--src/corelib/io/qurl.cpp361
-rw-r--r--src/corelib/io/qurl.h7
-rw-r--r--src/corelib/kernel/kernel.pri43
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher.cpp26
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher_p.h2
-rw-r--r--src/corelib/kernel/qabstractitemmodel.cpp1351
-rw-r--r--src/corelib/kernel/qabstractitemmodel.h20
-rw-r--r--src/corelib/kernel/qabstractitemmodel_p.h15
-rw-r--r--src/corelib/kernel/qbasictimer.cpp1
-rw-r--r--src/corelib/kernel/qcore_symbian_p.cpp206
-rw-r--r--src/corelib/kernel/qcore_symbian_p.h155
-rw-r--r--src/corelib/kernel/qcore_unix.cpp163
-rw-r--r--src/corelib/kernel/qcore_unix_p.h324
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp377
-rw-r--r--src/corelib/kernel/qcoreapplication.h4
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h7
-rw-r--r--src/corelib/kernel/qcoreapplication_win.cpp123
-rw-r--r--src/corelib/kernel/qcorecmdlineargs_p.h9
-rw-r--r--src/corelib/kernel/qcoreevent.cpp10
-rw-r--r--src/corelib/kernel/qcoreevent.h21
-rw-r--r--src/corelib/kernel/qcoreglobaldata.cpp2
-rw-r--r--src/corelib/kernel/qeventdispatcher_symbian.cpp1000
-rw-r--r--src/corelib/kernel/qeventdispatcher_symbian_p.h307
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix.cpp210
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix_p.h64
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp89
-rw-r--r--src/corelib/kernel/qfunctions_p.h2
-rw-r--r--src/corelib/kernel/qfunctions_vxworks.cpp202
-rw-r--r--src/corelib/kernel/qfunctions_vxworks.h153
-rw-r--r--src/corelib/kernel/qfunctions_wince.cpp24
-rw-r--r--src/corelib/kernel/qfunctions_wince.h11
-rw-r--r--src/corelib/kernel/qguard_p.h157
-rw-r--r--src/corelib/kernel/qmath.h4
-rw-r--r--src/corelib/kernel/qmetaobject.cpp254
-rw-r--r--src/corelib/kernel/qmetaobject.h4
-rw-r--r--src/corelib/kernel/qmetaobject_p.h79
-rw-r--r--src/corelib/kernel/qmetatype.cpp32
-rw-r--r--src/corelib/kernel/qmetatype.h25
-rw-r--r--src/corelib/kernel/qmimedata.cpp2
-rw-r--r--src/corelib/kernel/qobject.cpp1074
-rw-r--r--src/corelib/kernel/qobject.h17
-rw-r--r--src/corelib/kernel/qobject_p.h171
-rw-r--r--src/corelib/kernel/qobjectdefs.h19
-rw-r--r--src/corelib/kernel/qpointer.cpp2
-rw-r--r--src/corelib/kernel/qsharedmemory.cpp18
-rw-r--r--src/corelib/kernel/qsharedmemory_p.h9
-rw-r--r--src/corelib/kernel/qsharedmemory_symbian.cpp176
-rw-r--r--src/corelib/kernel/qsharedmemory_unix.cpp13
-rw-r--r--src/corelib/kernel/qsharedmemory_win.cpp19
-rw-r--r--src/corelib/kernel/qsignalmapper.cpp4
-rw-r--r--src/corelib/kernel/qsocketnotifier.cpp1
-rw-r--r--src/corelib/kernel/qsystemsemaphore.cpp17
-rw-r--r--src/corelib/kernel/qsystemsemaphore.h3
-rw-r--r--src/corelib/kernel/qsystemsemaphore_p.h13
-rw-r--r--src/corelib/kernel/qsystemsemaphore_symbian.cpp126
-rw-r--r--src/corelib/kernel/qsystemsemaphore_win.cpp6
-rw-r--r--src/corelib/kernel/qtimer.cpp30
-rw-r--r--src/corelib/kernel/qtranslator.cpp9
-rw-r--r--src/corelib/kernel/qvariant.cpp303
-rw-r--r--src/corelib/kernel/qvariant.h29
-rw-r--r--src/corelib/kernel/qvariant_p.h37
-rw-r--r--src/corelib/kernel/qwineventnotifier_p.cpp2
-rw-r--r--src/corelib/plugin/plugin.pri2
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp15
-rw-r--r--src/corelib/plugin/qlibrary.cpp141
-rw-r--r--src/corelib/plugin/qlibrary_unix.cpp51
-rw-r--r--src/corelib/plugin/qlibrary_win.cpp34
-rw-r--r--src/corelib/plugin/qplugin.h2
-rw-r--r--src/corelib/plugin/qplugin.qdoc (renamed from doc/src/qplugin.qdoc)0
-rw-r--r--src/corelib/plugin/qpluginloader.cpp58
-rw-r--r--src/corelib/plugin/quuid.cpp5
-rw-r--r--src/corelib/statemachine/qabstractstate.cpp206
-rw-r--r--src/corelib/statemachine/qabstractstate.h97
-rw-r--r--src/corelib/statemachine/qabstractstate_p.h83
-rw-r--r--src/corelib/statemachine/qabstracttransition.cpp331
-rw-r--r--src/corelib/statemachine/qabstracttransition.h118
-rw-r--r--src/corelib/statemachine/qabstracttransition_p.h92
-rw-r--r--src/corelib/statemachine/qeventtransition.cpp260
-rw-r--r--src/corelib/statemachine/qeventtransition.h95
-rw-r--r--src/corelib/statemachine/qeventtransition_p.h79
-rw-r--r--src/corelib/statemachine/qfinalstate.cpp139
-rw-r--r--src/corelib/statemachine/qfinalstate.h80
-rw-r--r--src/corelib/statemachine/qhistorystate.cpp226
-rw-r--r--src/corelib/statemachine/qhistorystate.h95
-rw-r--r--src/corelib/statemachine/qhistorystate_p.h79
-rw-r--r--src/corelib/statemachine/qsignalevent.h83
-rw-r--r--src/corelib/statemachine/qsignaleventgenerator_p.h78
-rw-r--r--src/corelib/statemachine/qsignaltransition.cpp265
-rw-r--r--src/corelib/statemachine/qsignaltransition.h90
-rw-r--r--src/corelib/statemachine/qsignaltransition_p.h82
-rw-r--r--src/corelib/statemachine/qstate.cpp492
-rw-r--r--src/corelib/statemachine/qstate.h119
-rw-r--r--src/corelib/statemachine/qstate_p.h108
-rw-r--r--src/corelib/statemachine/qstatemachine.cpp2215
-rw-r--r--src/corelib/statemachine/qstatemachine.h158
-rw-r--r--src/corelib/statemachine/qstatemachine_p.h224
-rw-r--r--src/corelib/statemachine/qwrappedevent.h80
-rw-r--r--src/corelib/statemachine/statemachine.pri30
-rw-r--r--src/corelib/thread/qbasicatomic.h15
-rw-r--r--src/corelib/thread/qmutex.cpp3
-rw-r--r--src/corelib/thread/qmutex_unix.cpp4
-rw-r--r--src/corelib/thread/qmutex_win.cpp16
-rw-r--r--src/corelib/thread/qmutexpool.cpp20
-rw-r--r--src/corelib/thread/qmutexpool_p.h7
-rw-r--r--src/corelib/thread/qreadwritelock.cpp3
-rw-r--r--src/corelib/thread/qreadwritelock.h3
-rw-r--r--src/corelib/thread/qsemaphore.cpp1
-rw-r--r--src/corelib/thread/qthread.cpp130
-rw-r--r--src/corelib/thread/qthread.h9
-rw-r--r--src/corelib/thread/qthread_p.h106
-rw-r--r--src/corelib/thread/qthread_unix.cpp161
-rw-r--r--src/corelib/thread/qthread_win.cpp49
-rw-r--r--src/corelib/thread/qthreadstorage.cpp16
-rw-r--r--src/corelib/thread/qwaitcondition.qdoc187
-rw-r--r--src/corelib/thread/qwaitcondition_win.cpp6
-rw-r--r--src/corelib/tools/qalgorithms.h17
-rw-r--r--src/corelib/tools/qalgorithms.qdoc651
-rw-r--r--src/corelib/tools/qbitarray.cpp7
-rw-r--r--src/corelib/tools/qbytearray.cpp140
-rw-r--r--src/corelib/tools/qbytearray.h26
-rw-r--r--src/corelib/tools/qbytearraymatcher.cpp2
-rw-r--r--src/corelib/tools/qbytearraymatcher.h11
-rw-r--r--src/corelib/tools/qbytedata_p.h213
-rw-r--r--src/corelib/tools/qcache.h2
-rw-r--r--src/corelib/tools/qcache.qdoc244
-rw-r--r--src/corelib/tools/qchar.cpp44
-rw-r--r--src/corelib/tools/qcontiguouscache.cpp432
-rw-r--r--src/corelib/tools/qcontiguouscache.h437
-rw-r--r--src/corelib/tools/qcryptographichash.cpp4
-rw-r--r--src/corelib/tools/qdatetime.cpp57
-rw-r--r--src/corelib/tools/qdatetime.h3
-rw-r--r--src/corelib/tools/qdatetime_p.h18
-rw-r--r--src/corelib/tools/qdumper.cpp1157
-rw-r--r--src/corelib/tools/qeasingcurve.cpp850
-rw-r--r--src/corelib/tools/qeasingcurve.h114
-rw-r--r--src/corelib/tools/qharfbuzz.cpp5
-rw-r--r--src/corelib/tools/qharfbuzz_p.h2
-rw-r--r--src/corelib/tools/qhash.cpp82
-rw-r--r--src/corelib/tools/qhash.h64
-rw-r--r--src/corelib/tools/qiterator.qdoc (renamed from doc/src/qiterator.qdoc)0
-rw-r--r--src/corelib/tools/qline.cpp8
-rw-r--r--src/corelib/tools/qlinkedlist.cpp2
-rw-r--r--src/corelib/tools/qlinkedlist.h44
-rw-r--r--src/corelib/tools/qlist.cpp1827
-rw-r--r--src/corelib/tools/qlist.h130
-rw-r--r--src/corelib/tools/qlistdata.cpp1752
-rw-r--r--src/corelib/tools/qlocale.cpp266
-rw-r--r--src/corelib/tools/qlocale.h2
-rw-r--r--src/corelib/tools/qlocale_data_p.h10
-rw-r--r--src/corelib/tools/qlocale_p.h40
-rw-r--r--src/corelib/tools/qlocale_symbian.cpp879
-rw-r--r--src/corelib/tools/qmap.cpp41
-rw-r--r--src/corelib/tools/qmap.h45
-rw-r--r--src/corelib/tools/qmargins.cpp167
-rw-r--r--src/corelib/tools/qmargins.h147
-rw-r--r--src/corelib/tools/qpair.qdoc (renamed from doc/src/qpair.qdoc)0
-rw-r--r--src/corelib/tools/qpodlist_p.h192
-rw-r--r--src/corelib/tools/qpoint.cpp21
-rw-r--r--src/corelib/tools/qpoint.h6
-rw-r--r--src/corelib/tools/qqueue.cpp2
-rw-r--r--src/corelib/tools/qrect.cpp4
-rw-r--r--src/corelib/tools/qregexp.cpp410
-rw-r--r--src/corelib/tools/qregexp.h2
-rw-r--r--src/corelib/tools/qringbuffer_p.h102
-rw-r--r--src/corelib/tools/qscopedpointer.cpp226
-rw-r--r--src/corelib/tools/qscopedpointer.h307
-rw-r--r--src/corelib/tools/qset.h14
-rw-r--r--src/corelib/tools/qset.qdoc953
-rw-r--r--src/corelib/tools/qshareddata.cpp686
-rw-r--r--src/corelib/tools/qshareddata.h18
-rw-r--r--src/corelib/tools/qsharedpointer.cpp723
-rw-r--r--src/corelib/tools/qsharedpointer.h7
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h483
-rw-r--r--src/corelib/tools/qsize.cpp4
-rw-r--r--src/corelib/tools/qsize.h12
-rw-r--r--src/corelib/tools/qstack.cpp2
-rw-r--r--src/corelib/tools/qstring.cpp499
-rw-r--r--src/corelib/tools/qstring.h14
-rw-r--r--src/corelib/tools/qstringbuilder.cpp145
-rw-r--r--src/corelib/tools/qstringbuilder.h260
-rw-r--r--src/corelib/tools/qstringlist.cpp5
-rw-r--r--src/corelib/tools/qstringlist.h1
-rw-r--r--src/corelib/tools/qstringmatcher.cpp2
-rw-r--r--src/corelib/tools/qstringmatcher.h11
-rw-r--r--src/corelib/tools/qtextboundaryfinder.cpp14
-rw-r--r--src/corelib/tools/qtimeline.cpp130
-rw-r--r--src/corelib/tools/qtimeline.h5
-rw-r--r--src/corelib/tools/qunicodetables_p.h2
-rw-r--r--src/corelib/tools/qvarlengtharray.h82
-rw-r--r--src/corelib/tools/qvarlengtharray.qdoc (renamed from doc/src/qvarlengtharray.qdoc)0
-rw-r--r--src/corelib/tools/qvector.cpp3
-rw-r--r--src/corelib/tools/qvector.h253
-rw-r--r--src/corelib/tools/tools.pri141
-rwxr-xr-xsrc/corelib/xml/make-parser.sh4
-rw-r--r--src/corelib/xml/qxmlstream.cpp157
-rw-r--r--src/corelib/xml/qxmlstream.g4
-rw-r--r--src/corelib/xml/qxmlstream.h23
-rw-r--r--src/corelib/xml/qxmlstream_p.h47
-rw-r--r--src/corelib/xml/qxmlutils.cpp4
-rw-r--r--src/corelib/xml/qxmlutils_p.h2
-rw-r--r--src/dbus/dbus.pro10
-rw-r--r--src/dbus/qdbus_symbols_p.h2
-rw-r--r--src/dbus/qdbusabstractadaptor.cpp2
-rw-r--r--src/dbus/qdbusabstractinterface.cpp252
-rw-r--r--src/dbus/qdbusabstractinterface.h18
-rw-r--r--src/dbus/qdbusabstractinterface_p.h8
-rw-r--r--src/dbus/qdbusargument_p.h3
-rw-r--r--src/dbus/qdbusconnection_p.h5
-rw-r--r--src/dbus/qdbuscontext.h2
-rw-r--r--src/dbus/qdbuserror.cpp23
-rw-r--r--src/dbus/qdbuserror.h6
-rw-r--r--src/dbus/qdbusintegrator.cpp106
-rw-r--r--src/dbus/qdbusinterface.cpp146
-rw-r--r--src/dbus/qdbusinternalfilters.cpp167
-rw-r--r--src/dbus/qdbusmarshaller.cpp35
-rw-r--r--src/dbus/qdbusmessage.cpp80
-rw-r--r--src/dbus/qdbusmessage.h6
-rw-r--r--src/dbus/qdbusmessage_p.h11
-rw-r--r--src/dbus/qdbusmetaobject.cpp2
-rw-r--r--src/dbus/qdbusmisc.cpp47
-rw-r--r--src/dbus/qdbuspendingcall.cpp38
-rw-r--r--src/dbus/qdbuspendingcall.h3
-rw-r--r--src/dbus/qdbuspendingcall_p.h3
-rw-r--r--src/dbus/qdbusthreaddebug_p.h2
-rw-r--r--src/dbus/qdbusutil.cpp16
-rw-r--r--src/dbus/qdbusutil_p.h68
-rw-r--r--src/dbus/qdbusxmlgenerator.cpp37
-rw-r--r--src/gui/accessible/accessible.pri3
-rw-r--r--src/gui/accessible/qaccessible.cpp4
-rw-r--r--src/gui/accessible/qaccessible.h1
-rw-r--r--src/gui/accessible/qaccessible_mac.mm14
-rw-r--r--src/gui/accessible/qaccessible_mac_cocoa.mm194
-rw-r--r--src/gui/accessible/qaccessible_win.cpp46
-rw-r--r--src/gui/accessible/qaccessibleobject.cpp14
-rw-r--r--src/gui/accessible/qaccessiblewidget.cpp19
-rw-r--r--src/gui/animation/animation.pri3
-rw-r--r--src/gui/animation/qguivariantanimation.cpp99
-rw-r--r--src/gui/dialogs/dialogs.pri7
-rw-r--r--src/gui/dialogs/qabstractprintdialog.cpp11
-rw-r--r--src/gui/dialogs/qcolordialog.cpp17
-rw-r--r--src/gui/dialogs/qcolordialog_mac.mm38
-rw-r--r--src/gui/dialogs/qdialog.cpp60
-rw-r--r--src/gui/dialogs/qdialog.h4
-rw-r--r--src/gui/dialogs/qdialog_p.h2
-rw-r--r--src/gui/dialogs/qerrormessage.cpp13
-rw-r--r--src/gui/dialogs/qfiledialog.cpp137
-rw-r--r--src/gui/dialogs/qfiledialog_embedded.ui (renamed from src/gui/dialogs/qfiledialog_wince.ui)0
-rw-r--r--src/gui/dialogs/qfiledialog_mac.mm19
-rw-r--r--src/gui/dialogs/qfiledialog_p.h63
-rw-r--r--src/gui/dialogs/qfiledialog_win.cpp686
-rw-r--r--src/gui/dialogs/qfileinfogatherer.cpp37
-rw-r--r--src/gui/dialogs/qfileinfogatherer_p.h2
-rw-r--r--src/gui/dialogs/qfilesystemmodel.cpp61
-rw-r--r--src/gui/dialogs/qfontdialog.cpp20
-rw-r--r--src/gui/dialogs/qfscompleter_p.h82
-rw-r--r--src/gui/dialogs/qinputdialog.cpp7
-rw-r--r--src/gui/dialogs/qmessagebox.cpp71
-rw-r--r--src/gui/dialogs/qmessagebox.h4
-rw-r--r--src/gui/dialogs/qpagesetupdialog.cpp46
-rw-r--r--src/gui/dialogs/qpagesetupdialog_win.cpp11
-rw-r--r--src/gui/dialogs/qprintdialog.qdoc (renamed from doc/src/qprintdialog.qdoc)0
-rw-r--r--src/gui/dialogs/qprintdialog_unix.cpp13
-rw-r--r--src/gui/dialogs/qprintdialog_win.cpp117
-rw-r--r--src/gui/dialogs/qprintpreviewdialog.cpp164
-rw-r--r--src/gui/dialogs/qprintpreviewdialog.h2
-rw-r--r--src/gui/dialogs/qprogressdialog.cpp6
-rw-r--r--src/gui/dialogs/qsidebar.cpp13
-rw-r--r--src/gui/dialogs/qwizard.cpp101
-rw-r--r--src/gui/dialogs/qwizard_win.cpp8
-rw-r--r--src/gui/dialogs/qwizard_win_p.h2
-rw-r--r--src/gui/effects/effects.pri4
-rw-r--r--src/gui/effects/qgraphicseffect.cpp1185
-rw-r--r--src/gui/effects/qgraphicseffect.h325
-rw-r--r--src/gui/effects/qgraphicseffect_p.h182
-rw-r--r--src/gui/egl/egl.pri28
-rw-r--r--src/gui/egl/qegl.cpp414
-rw-r--r--src/gui/egl/qegl_p.h143
-rw-r--r--src/gui/egl/qegl_qws.cpp111
-rw-r--r--src/gui/egl/qegl_symbian.cpp109
-rw-r--r--src/gui/egl/qegl_wince.cpp116
-rw-r--r--src/gui/egl/qegl_x11.cpp157
-rw-r--r--src/gui/egl/qeglproperties.cpp533
-rw-r--r--src/gui/egl/qeglproperties_p.h141
-rw-r--r--src/gui/embedded/directfb.pri39
-rw-r--r--src/gui/embedded/embedded.pri80
-rw-r--r--src/gui/embedded/qdirectpainter_qws.cpp10
-rw-r--r--src/gui/embedded/qkbd_defaultmap_qws_p.h798
-rw-r--r--src/gui/embedded/qkbd_qws.cpp479
-rw-r--r--src/gui/embedded/qkbd_qws.h22
-rw-r--r--src/gui/embedded/qkbd_qws_p.h134
-rw-r--r--src/gui/embedded/qkbddriverfactory_qws.cpp42
-rw-r--r--src/gui/embedded/qkbdlinuxinput_qws.cpp245
-rw-r--r--src/gui/embedded/qkbdlinuxinput_qws.h79
-rw-r--r--src/gui/embedded/qkbdpc101_qws.cpp485
-rw-r--r--src/gui/embedded/qkbdpc101_qws.h95
-rw-r--r--src/gui/embedded/qkbdqnx_qws.cpp236
-rw-r--r--src/gui/embedded/qkbdqnx_qws.h76
-rw-r--r--src/gui/embedded/qkbdsl5000_qws.cpp356
-rw-r--r--src/gui/embedded/qkbdsl5000_qws.h79
-rw-r--r--src/gui/embedded/qkbdtty_qws.cpp308
-rw-r--r--src/gui/embedded/qkbdtty_qws.h8
-rw-r--r--src/gui/embedded/qkbdum_qws.cpp9
-rw-r--r--src/gui/embedded/qkbdusb_qws.cpp401
-rw-r--r--src/gui/embedded/qkbdusb_qws.h77
-rw-r--r--src/gui/embedded/qkbdvfb_qws.cpp9
-rw-r--r--src/gui/embedded/qkbdvr41xx_qws.cpp185
-rw-r--r--src/gui/embedded/qkbdvr41xx_qws.h73
-rw-r--r--src/gui/embedded/qkbdyopy_qws.cpp209
-rw-r--r--src/gui/embedded/qkbdyopy_qws.h73
-rw-r--r--src/gui/embedded/qlock.cpp78
-rw-r--r--src/gui/embedded/qmouse_qws.cpp4
-rw-r--r--src/gui/embedded/qmousebus_qws.cpp238
-rw-r--r--src/gui/embedded/qmousebus_qws.h76
-rw-r--r--src/gui/embedded/qmousedriverfactory_qws.cpp42
-rw-r--r--src/gui/embedded/qmouselinuxinput_qws.cpp205
-rw-r--r--src/gui/embedded/qmouselinuxinput_qws.h78
-rw-r--r--src/gui/embedded/qmouselinuxtp_qws.cpp7
-rw-r--r--src/gui/embedded/qmousepc_qws.cpp41
-rw-r--r--src/gui/embedded/qmouseqnx_qws.cpp190
-rw-r--r--src/gui/embedded/qmouseqnx_qws.h79
-rw-r--r--src/gui/embedded/qmousetslib_qws.h2
-rw-r--r--src/gui/embedded/qmousevfb_qws.cpp9
-rw-r--r--src/gui/embedded/qmousevr41xx_qws.cpp250
-rw-r--r--src/gui/embedded/qmousevr41xx_qws.h80
-rw-r--r--src/gui/embedded/qmouseyopy_qws.cpp184
-rw-r--r--src/gui/embedded/qmouseyopy_qws.h80
-rw-r--r--src/gui/embedded/qscreen_qws.cpp37
-rw-r--r--src/gui/embedded/qscreen_qws.h4
-rw-r--r--src/gui/embedded/qscreendriverfactory_qws.cpp17
-rw-r--r--src/gui/embedded/qscreenlinuxfb_qws.cpp42
-rw-r--r--src/gui/embedded/qscreenlinuxfb_qws.h8
-rw-r--r--src/gui/embedded/qscreenmulti_qws.cpp4
-rw-r--r--src/gui/embedded/qscreenproxy_qws.cpp12
-rw-r--r--src/gui/embedded/qscreenqnx_qws.cpp450
-rw-r--r--src/gui/embedded/qscreenqnx_qws.h82
-rw-r--r--src/gui/embedded/qscreentransformed_qws.cpp6
-rw-r--r--src/gui/embedded/qscreenvfb_qws.cpp4
-rw-r--r--src/gui/embedded/qsoundqss_qws.cpp49
-rw-r--r--src/gui/embedded/qtransportauth_qws.cpp11
-rw-r--r--src/gui/embedded/qunixsocket.cpp50
-rw-r--r--src/gui/embedded/qunixsocketserver.cpp8
-rw-r--r--src/gui/embedded/qwindowsystem_qws.cpp93
-rw-r--r--src/gui/embedded/qwscommand_qws.cpp9
-rw-r--r--src/gui/embedded/qwscursor_qws.cpp2
-rw-r--r--src/gui/embedded/qwssignalhandler.cpp6
-rw-r--r--src/gui/embedded/qwsutils_qws.h12
-rw-r--r--src/gui/graphicsview/graphicsview.pri94
-rw-r--r--src/gui/graphicsview/qgraph_p.h296
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout.cpp477
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout.h141
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout_p.cpp2117
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout_p.h493
-rw-r--r--src/gui/graphicsview/qgraphicsgridlayout.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp3077
-rw-r--r--src/gui/graphicsview/qgraphicsitem.h174
-rw-r--r--src/gui/graphicsview/qgraphicsitem_p.h402
-rw-r--r--src/gui/graphicsview/qgraphicsitemanimation.cpp1
-rw-r--r--src/gui/graphicsview/qgraphicslayout.cpp5
-rw-r--r--src/gui/graphicsview/qgraphicslayout.h2
-rw-r--r--src/gui/graphicsview/qgraphicslayout_p.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicslayout_p.h4
-rw-r--r--src/gui/graphicsview/qgraphicslayoutitem.cpp140
-rw-r--r--src/gui/graphicsview/qgraphicslayoutitem.h5
-rw-r--r--src/gui/graphicsview/qgraphicslayoutitem_p.h12
-rw-r--r--src/gui/graphicsview/qgraphicslinearlayout.cpp20
-rw-r--r--src/gui/graphicsview/qgraphicsproxywidget.cpp38
-rw-r--r--src/gui/graphicsview/qgraphicsproxywidget.h4
-rw-r--r--src/gui/graphicsview/qgraphicsproxywidget_p.h6
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp3179
-rw-r--r--src/gui/graphicsview/qgraphicsscene.h57
-rw-r--r--src/gui/graphicsview/qgraphicsscene_bsp.cpp56
-rw-r--r--src/gui/graphicsview/qgraphicsscene_bsp_p.h9
-rw-r--r--src/gui/graphicsview/qgraphicsscene_p.h210
-rw-r--r--src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp783
-rw-r--r--src/gui/graphicsview/qgraphicsscenebsptreeindex_p.h208
-rw-r--r--src/gui/graphicsview/qgraphicssceneevent.cpp46
-rw-r--r--src/gui/graphicsview/qgraphicssceneevent.h7
-rw-r--r--src/gui/graphicsview/qgraphicssceneindex.cpp647
-rw-r--r--src/gui/graphicsview/qgraphicssceneindex_p.h182
-rw-r--r--src/gui/graphicsview/qgraphicsscenelinearindex.cpp95
-rw-r--r--src/gui/graphicsview/qgraphicsscenelinearindex_p.h109
-rw-r--r--src/gui/graphicsview/qgraphicstransform.cpp564
-rw-r--r--src/gui/graphicsview/qgraphicstransform.h154
-rw-r--r--src/gui/graphicsview/qgraphicstransform_p.h77
-rw-r--r--src/gui/graphicsview/qgraphicsview.cpp995
-rw-r--r--src/gui/graphicsview/qgraphicsview.h7
-rw-r--r--src/gui/graphicsview/qgraphicsview_p.h57
-rw-r--r--src/gui/graphicsview/qgraphicswidget.cpp215
-rw-r--r--src/gui/graphicsview/qgraphicswidget.h10
-rw-r--r--src/gui/graphicsview/qgraphicswidget_p.cpp294
-rw-r--r--src/gui/graphicsview/qgraphicswidget_p.h78
-rw-r--r--src/gui/graphicsview/qgridlayoutengine.cpp46
-rw-r--r--src/gui/graphicsview/qgridlayoutengine_p.h4
-rw-r--r--src/gui/graphicsview/qsimplex_p.cpp412
-rw-r--r--src/gui/graphicsview/qsimplex_p.h164
-rw-r--r--src/gui/gui.pro12
-rw-r--r--src/gui/image/image.pri15
-rw-r--r--src/gui/image/qbitmap.cpp20
-rw-r--r--src/gui/image/qbitmap.h2
-rw-r--r--src/gui/image/qbmphandler.cpp8
-rw-r--r--src/gui/image/qicon.cpp235
-rw-r--r--src/gui/image/qicon.h10
-rw-r--r--src/gui/image/qicon_p.h138
-rw-r--r--src/gui/image/qiconengine.cpp4
-rw-r--r--src/gui/image/qiconloader.cpp607
-rw-r--r--src/gui/image/qiconloader_p.h187
-rw-r--r--src/gui/image/qimage.cpp162
-rw-r--r--src/gui/image/qimageiohandler.cpp1
-rw-r--r--src/gui/image/qimageiohandler.h3
-rw-r--r--src/gui/image/qimagepixmapcleanuphooks.cpp113
-rw-r--r--src/gui/image/qimagepixmapcleanuphooks_p.h89
-rw-r--r--src/gui/image/qimagereader.cpp2
-rw-r--r--src/gui/image/qimagewriter.cpp2
-rw-r--r--src/gui/image/qmovie.cpp4
-rw-r--r--src/gui/image/qnativeimage.cpp22
-rw-r--r--src/gui/image/qnativeimage_p.h3
-rw-r--r--src/gui/image/qpicture.cpp84
-rw-r--r--src/gui/image/qpicture.h9
-rw-r--r--src/gui/image/qpicture_p.h10
-rw-r--r--src/gui/image/qpixmap.cpp277
-rw-r--r--src/gui/image/qpixmap.h31
-rw-r--r--src/gui/image/qpixmap_mac.cpp205
-rw-r--r--src/gui/image/qpixmap_mac_p.h7
-rw-r--r--src/gui/image/qpixmap_qws.cpp13
-rw-r--r--src/gui/image/qpixmap_raster.cpp64
-rw-r--r--src/gui/image/qpixmap_raster_p.h8
-rw-r--r--src/gui/image/qpixmap_s60.cpp236
-rw-r--r--src/gui/image/qpixmap_win.cpp26
-rw-r--r--src/gui/image/qpixmap_x11.cpp51
-rw-r--r--src/gui/image/qpixmap_x11_p.h15
-rw-r--r--src/gui/image/qpixmapcache.cpp435
-rw-r--r--src/gui/image/qpixmapcache.h27
-rw-r--r--src/gui/image/qpixmapcache_p.h98
-rw-r--r--src/gui/image/qpixmapdata.cpp59
-rw-r--r--src/gui/image/qpixmapdata_p.h24
-rw-r--r--src/gui/image/qpixmapdatafactory.cpp6
-rw-r--r--src/gui/image/qpixmapdatafactory_p.h2
-rw-r--r--src/gui/image/qpixmapfilter.cpp286
-rw-r--r--src/gui/image/qpixmapfilter_p.h29
-rw-r--r--src/gui/image/qpnghandler.cpp10
-rw-r--r--src/gui/image/qppmhandler.cpp2
-rw-r--r--src/gui/image/qxpmhandler.cpp6
-rw-r--r--src/gui/inputmethod/inputmethod.pri5
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_p.h154
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_s60.cpp667
-rw-r--r--src/gui/inputmethod/qinputcontext.cpp99
-rw-r--r--src/gui/inputmethod/qinputcontext.h8
-rw-r--r--src/gui/inputmethod/qinputcontext_p.h4
-rw-r--r--src/gui/inputmethod/qinputcontextfactory.cpp24
-rw-r--r--src/gui/inputmethod/qinputcontextplugin.h2
-rw-r--r--src/gui/inputmethod/qmacinputcontext_mac.cpp20
-rw-r--r--src/gui/inputmethod/qmacinputcontext_p.h5
-rw-r--r--src/gui/inputmethod/qwininputcontext_p.h2
-rw-r--r--src/gui/inputmethod/qwininputcontext_win.cpp195
-rw-r--r--src/gui/inputmethod/qwsinputcontext_p.h1
-rw-r--r--src/gui/inputmethod/qwsinputcontext_qws.cpp27
-rw-r--r--src/gui/inputmethod/qximinputcontext_x11.cpp6
-rw-r--r--src/gui/itemviews/qabstractitemdelegate.cpp2
-rw-r--r--src/gui/itemviews/qabstractitemview.cpp371
-rw-r--r--src/gui/itemviews/qabstractitemview.h1
-rw-r--r--src/gui/itemviews/qabstractitemview_p.h53
-rw-r--r--src/gui/itemviews/qcolumnview.cpp120
-rw-r--r--src/gui/itemviews/qcolumnview.h8
-rw-r--r--src/gui/itemviews/qcolumnview_p.h11
-rw-r--r--src/gui/itemviews/qdirmodel.cpp28
-rw-r--r--src/gui/itemviews/qfileiconprovider.cpp42
-rw-r--r--src/gui/itemviews/qfileiconprovider.h5
-rw-r--r--src/gui/itemviews/qheaderview.cpp104
-rw-r--r--src/gui/itemviews/qheaderview.h3
-rw-r--r--src/gui/itemviews/qheaderview_p.h9
-rw-r--r--src/gui/itemviews/qitemdelegate.cpp34
-rw-r--r--src/gui/itemviews/qitemselectionmodel.cpp412
-rw-r--r--src/gui/itemviews/qitemselectionmodel_p.h2
-rw-r--r--src/gui/itemviews/qlistview.cpp1169
-rw-r--r--src/gui/itemviews/qlistview_p.h222
-rw-r--r--src/gui/itemviews/qlistwidget.cpp532
-rw-r--r--src/gui/itemviews/qlistwidget_p.h3
-rw-r--r--src/gui/itemviews/qsortfilterproxymodel.cpp294
-rw-r--r--src/gui/itemviews/qsortfilterproxymodel.h1
-rw-r--r--src/gui/itemviews/qstandarditemmodel.cpp78
-rw-r--r--src/gui/itemviews/qstandarditemmodel.h2
-rw-r--r--src/gui/itemviews/qstandarditemmodel_p.h5
-rw-r--r--src/gui/itemviews/qstringlistmodel.cpp2
-rw-r--r--src/gui/itemviews/qstyleditemdelegate.cpp26
-rw-r--r--src/gui/itemviews/qtableview.cpp369
-rw-r--r--src/gui/itemviews/qtableview_p.h98
-rw-r--r--src/gui/itemviews/qtablewidget.cpp160
-rw-r--r--src/gui/itemviews/qtablewidget_p.h3
-rw-r--r--src/gui/itemviews/qtreeview.cpp331
-rw-r--r--src/gui/itemviews/qtreeview.h12
-rw-r--r--src/gui/itemviews/qtreeview_p.h38
-rw-r--r--src/gui/itemviews/qtreewidget.cpp132
-rw-r--r--src/gui/itemviews/qtreewidget_p.h7
-rw-r--r--src/gui/itemviews/qtreewidgetitemiterator.cpp3
-rw-r--r--src/gui/itemviews/qtreewidgetitemiterator.h3
-rw-r--r--src/gui/itemviews/qtreewidgetitemiterator_p.h3
-rw-r--r--src/gui/kernel/kernel.pri66
-rw-r--r--src/gui/kernel/mac.pri2
-rw-r--r--src/gui/kernel/qaction.cpp130
-rw-r--r--src/gui/kernel/qaction.h47
-rw-r--r--src/gui/kernel/qaction_p.h2
-rw-r--r--src/gui/kernel/qactiongroup.cpp2
-rw-r--r--src/gui/kernel/qapplication.cpp762
-rw-r--r--src/gui/kernel/qapplication.h27
-rw-r--r--src/gui/kernel/qapplication_mac.mm123
-rw-r--r--src/gui/kernel/qapplication_p.h199
-rw-r--r--src/gui/kernel/qapplication_qws.cpp75
-rw-r--r--src/gui/kernel/qapplication_s60.cpp1237
-rw-r--r--src/gui/kernel/qapplication_win.cpp1007
-rw-r--r--src/gui/kernel/qapplication_x11.cpp805
-rw-r--r--src/gui/kernel/qboxlayout.cpp40
-rw-r--r--src/gui/kernel/qclipboard.cpp28
-rw-r--r--src/gui/kernel/qclipboard_mac.cpp14
-rw-r--r--src/gui/kernel/qclipboard_s60.cpp266
-rw-r--r--src/gui/kernel/qclipboard_win.cpp10
-rw-r--r--src/gui/kernel/qclipboard_x11.cpp2
-rw-r--r--src/gui/kernel/qcocoaapplicationdelegate_mac.mm18
-rw-r--r--src/gui/kernel/qcocoapanel_mac.mm6
-rw-r--r--src/gui/kernel/qcocoaview_mac.mm224
-rw-r--r--src/gui/kernel/qcocoaview_mac_p.h2
-rw-r--r--src/gui/kernel/qcocoawindow_mac.mm6
-rw-r--r--src/gui/kernel/qcursor.cpp7
-rw-r--r--src/gui/kernel/qcursor_qws.cpp6
-rw-r--r--src/gui/kernel/qcursor_s60.cpp60
-rw-r--r--src/gui/kernel/qcursor_win.cpp56
-rw-r--r--src/gui/kernel/qdesktopwidget.h8
-rw-r--r--src/gui/kernel/qdesktopwidget.qdoc264
-rw-r--r--src/gui/kernel/qdesktopwidget_mac.mm64
-rw-r--r--src/gui/kernel/qdesktopwidget_mac_p.h3
-rw-r--r--src/gui/kernel/qdesktopwidget_s60.cpp201
-rw-r--r--src/gui/kernel/qdesktopwidget_win.cpp151
-rw-r--r--src/gui/kernel/qdesktopwidget_x11.cpp53
-rw-r--r--src/gui/kernel/qdnd.cpp2
-rw-r--r--src/gui/kernel/qdnd_mac.mm4
-rw-r--r--src/gui/kernel/qdnd_p.h4
-rw-r--r--src/gui/kernel/qdnd_s60.cpp395
-rw-r--r--src/gui/kernel/qdnd_win.cpp77
-rw-r--r--src/gui/kernel/qdnd_x11.cpp30
-rw-r--r--src/gui/kernel/qevent.cpp705
-rw-r--r--src/gui/kernel/qevent.h104
-rw-r--r--src/gui/kernel/qevent_p.h65
-rw-r--r--src/gui/kernel/qeventdispatcher_mac.mm435
-rw-r--r--src/gui/kernel/qeventdispatcher_mac_p.h26
-rw-r--r--src/gui/kernel/qeventdispatcher_s60.cpp130
-rw-r--r--src/gui/kernel/qeventdispatcher_s60_p.h96
-rw-r--r--src/gui/kernel/qformlayout.cpp2
-rw-r--r--src/gui/kernel/qgesture.cpp312
-rw-r--r--src/gui/kernel/qgesture.h103
-rw-r--r--src/gui/kernel/qgesture_p.h91
-rw-r--r--src/gui/kernel/qgridlayout.cpp22
-rw-r--r--src/gui/kernel/qguifunctions_wince.cpp49
-rw-r--r--src/gui/kernel/qguifunctions_wince.h8
-rw-r--r--src/gui/kernel/qguivariant.cpp161
-rw-r--r--src/gui/kernel/qkde.cpp157
-rw-r--r--src/gui/kernel/qkde_p.h76
-rw-r--r--src/gui/kernel/qkeymapper.cpp3
-rw-r--r--src/gui/kernel/qkeymapper_mac.cpp46
-rw-r--r--src/gui/kernel/qkeymapper_p.h10
-rw-r--r--src/gui/kernel/qkeymapper_s60.cpp247
-rw-r--r--src/gui/kernel/qkeymapper_win.cpp139
-rw-r--r--src/gui/kernel/qkeysequence.cpp275
-rw-r--r--src/gui/kernel/qkeysequence.h4
-rw-r--r--src/gui/kernel/qlayout.cpp28
-rw-r--r--src/gui/kernel/qlayoutengine.cpp2
-rw-r--r--src/gui/kernel/qlayoutitem.cpp9
-rw-r--r--src/gui/kernel/qmime_mac.cpp172
-rw-r--r--src/gui/kernel/qmime_win.cpp160
-rw-r--r--src/gui/kernel/qmotifdnd_x11.cpp2
-rw-r--r--src/gui/kernel/qmultitouch_mac.mm219
-rw-r--r--src/gui/kernel/qmultitouch_mac_p.h102
-rw-r--r--src/gui/kernel/qpalette.cpp8
-rw-r--r--src/gui/kernel/qshortcut.cpp3
-rw-r--r--src/gui/kernel/qshortcutmap.cpp25
-rw-r--r--src/gui/kernel/qshortcutmap_p.h3
-rw-r--r--src/gui/kernel/qsizepolicy.h2
-rw-r--r--src/gui/kernel/qsizepolicy.qdoc521
-rw-r--r--src/gui/kernel/qsound.cpp5
-rw-r--r--src/gui/kernel/qsound_qws.cpp6
-rw-r--r--src/gui/kernel/qsound_s60.cpp206
-rw-r--r--src/gui/kernel/qsound_win.cpp40
-rw-r--r--src/gui/kernel/qstackedlayout.cpp2
-rw-r--r--src/gui/kernel/qstandardgestures.cpp792
-rw-r--r--src/gui/kernel/qstandardgestures.h174
-rw-r--r--src/gui/kernel/qstandardgestures_p.h137
-rw-r--r--src/gui/kernel/qt_cocoa_helpers_mac.mm233
-rw-r--r--src/gui/kernel/qt_cocoa_helpers_mac_p.h12
-rw-r--r--src/gui/kernel/qt_mac_p.h15
-rw-r--r--src/gui/kernel/qt_s60_p.h291
-rw-r--r--src/gui/kernel/qt_x11_p.h26
-rw-r--r--src/gui/kernel/qtooltip.cpp23
-rw-r--r--src/gui/kernel/qwhatsthis.cpp11
-rw-r--r--src/gui/kernel/qwidget.cpp1100
-rw-r--r--src/gui/kernel/qwidget.h27
-rw-r--r--src/gui/kernel/qwidget_mac.mm582
-rw-r--r--src/gui/kernel/qwidget_p.h622
-rw-r--r--src/gui/kernel/qwidget_qws.cpp52
-rw-r--r--src/gui/kernel/qwidget_s60.cpp1206
-rw-r--r--src/gui/kernel/qwidget_win.cpp343
-rw-r--r--src/gui/kernel/qwidget_wince.cpp65
-rw-r--r--src/gui/kernel/qwidget_x11.cpp176
-rw-r--r--src/gui/kernel/qwidgetaction.cpp9
-rw-r--r--src/gui/kernel/qwindowdefs.h5
-rw-r--r--src/gui/kernel/qwindowdefs_win.h2
-rw-r--r--src/gui/kernel/qx11embed_x11.cpp26
-rw-r--r--src/gui/kernel/qx11info_x11.cpp3
-rw-r--r--src/gui/kernel/symbian.pri3
-rw-r--r--src/gui/kernel/x11.pri2
-rw-r--r--src/gui/mac/images/leopard-unified-toolbar-on.pngbin0 -> 356 bytes-rw-r--r--src/gui/mac/maccursors.qrc9
-rw-r--r--src/gui/mac/macresources.qrc12
-rw-r--r--src/gui/math3d/math3d.pri15
-rw-r--r--src/gui/math3d/qgenericmatrix.cpp253
-rw-r--r--src/gui/math3d/qgenericmatrix.h373
-rw-r--r--src/gui/math3d/qmatrix4x4.cpp1908
-rw-r--r--src/gui/math3d/qmatrix4x4.h1002
-rw-r--r--src/gui/math3d/qquaternion.cpp631
-rw-r--r--src/gui/math3d/qquaternion.h334
-rw-r--r--src/gui/math3d/qvector2d.cpp466
-rw-r--r--src/gui/math3d/qvector2d.h260
-rw-r--r--src/gui/math3d/qvector3d.cpp618
-rw-r--r--src/gui/math3d/qvector3d.h287
-rw-r--r--src/gui/math3d/qvector4d.cpp571
-rw-r--r--src/gui/math3d/qvector4d.h292
-rw-r--r--src/gui/painting/painting.pri59
-rw-r--r--src/gui/painting/qbackingstore.cpp53
-rw-r--r--src/gui/painting/qbackingstore_p.h8
-rw-r--r--src/gui/painting/qbezier.cpp32
-rw-r--r--src/gui/painting/qblendfunctions.cpp701
-rw-r--r--src/gui/painting/qblendfunctions_armv6_rvct.s222
-rw-r--r--src/gui/painting/qbrush.cpp123
-rw-r--r--src/gui/painting/qbrush.h17
-rw-r--r--src/gui/painting/qcolor.cpp474
-rw-r--r--src/gui/painting/qcolor.h32
-rw-r--r--src/gui/painting/qcolor_p.cpp2
-rw-r--r--src/gui/painting/qcolormap.qdoc152
-rw-r--r--src/gui/painting/qcolormap_s60.cpp107
-rw-r--r--src/gui/painting/qcolormap_win.cpp2
-rw-r--r--src/gui/painting/qcssutil.cpp8
-rw-r--r--src/gui/painting/qdrawhelper.cpp1387
-rw-r--r--src/gui/painting/qdrawhelper_armv6_p.h81
-rw-r--r--src/gui/painting/qdrawhelper_armv6_rvct.inc496
-rw-r--r--src/gui/painting/qdrawhelper_armv6_rvct.s177
-rw-r--r--src/gui/painting/qdrawhelper_mmx_p.h2
-rw-r--r--src/gui/painting/qdrawhelper_p.h117
-rw-r--r--src/gui/painting/qdrawhelper_sse2.cpp2
-rw-r--r--src/gui/painting/qdrawhelper_sse_p.h2
-rw-r--r--src/gui/painting/qdrawutil.cpp306
-rw-r--r--src/gui/painting/qdrawutil.h29
-rw-r--r--src/gui/painting/qemulationpaintengine.cpp12
-rw-r--r--src/gui/painting/qfixed_p.h2
-rw-r--r--src/gui/painting/qgraphicssystem.cpp4
-rw-r--r--src/gui/painting/qgraphicssystemfactory.cpp6
-rw-r--r--src/gui/painting/qgraphicssystemfactory_p.h2
-rw-r--r--src/gui/painting/qgraphicssystemplugin_p.h2
-rw-r--r--src/gui/painting/qgrayraster.c8
-rw-r--r--src/gui/painting/qmatrix.cpp90
-rw-r--r--src/gui/painting/qmatrix.h34
-rw-r--r--src/gui/painting/qoutlinemapper.cpp28
-rw-r--r--src/gui/painting/qpaintdevice.cpp68
-rw-r--r--src/gui/painting/qpaintdevice.qdoc289
-rw-r--r--src/gui/painting/qpaintdevice_mac.cpp37
-rw-r--r--src/gui/painting/qpaintdevice_qws.cpp33
-rw-r--r--src/gui/painting/qpaintdevice_win.cpp21
-rw-r--r--src/gui/painting/qpaintdevice_x11.cpp21
-rw-r--r--src/gui/painting/qpaintengine.cpp11
-rw-r--r--src/gui/painting/qpaintengine.h4
-rw-r--r--src/gui/painting/qpaintengine_d3d.cpp4576
-rw-r--r--src/gui/painting/qpaintengine_d3d.fx608
-rw-r--r--src/gui/painting/qpaintengine_d3d.qrc5
-rw-r--r--src/gui/painting/qpaintengine_d3d_p.h120
-rw-r--r--src/gui/painting/qpaintengine_mac.cpp94
-rw-r--r--src/gui/painting/qpaintengine_mac_p.h107
-rw-r--r--src/gui/painting/qpaintengine_p.h4
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp836
-rw-r--r--src/gui/painting/qpaintengine_raster_p.h22
-rw-r--r--src/gui/painting/qpaintengine_x11.cpp38
-rw-r--r--src/gui/painting/qpaintengineex.cpp222
-rw-r--r--src/gui/painting/qpaintengineex_p.h49
-rw-r--r--src/gui/painting/qpainter.cpp339
-rw-r--r--src/gui/painting/qpainter.h9
-rw-r--r--src/gui/painting/qpainter_p.h8
-rw-r--r--src/gui/painting/qpainterpath.cpp116
-rw-r--r--src/gui/painting/qpainterpath.h25
-rw-r--r--src/gui/painting/qpainterpath_p.h2
-rw-r--r--src/gui/painting/qpathclipper.cpp36
-rw-r--r--src/gui/painting/qpathclipper_p.h7
-rw-r--r--src/gui/painting/qpdf.cpp66
-rw-r--r--src/gui/painting/qpdf_p.h2
-rw-r--r--src/gui/painting/qpen.cpp6
-rw-r--r--src/gui/painting/qpolygon.cpp65
-rw-r--r--src/gui/painting/qpolygon.h13
-rw-r--r--src/gui/painting/qprintengine_mac.mm41
-rw-r--r--src/gui/painting/qprintengine_pdf.cpp6
-rw-r--r--src/gui/painting/qprintengine_ps.cpp24
-rw-r--r--src/gui/painting/qprintengine_win.cpp658
-rw-r--r--src/gui/painting/qprintengine_win_p.h16
-rw-r--r--src/gui/painting/qprinter.cpp39
-rw-r--r--src/gui/painting/qprinter.h5
-rw-r--r--src/gui/painting/qprinterinfo.h3
-rw-r--r--src/gui/painting/qprinterinfo.qdoc139
-rw-r--r--src/gui/painting/qprinterinfo_mac.cpp36
-rw-r--r--src/gui/painting/qprinterinfo_unix.cpp31
-rw-r--r--src/gui/painting/qprinterinfo_win.cpp124
-rw-r--r--src/gui/painting/qrasterizer.cpp5
-rw-r--r--src/gui/painting/qrasterizer_p.h2
-rw-r--r--src/gui/painting/qregion.cpp204
-rw-r--r--src/gui/painting/qregion.h5
-rw-r--r--src/gui/painting/qregion_mac.cpp37
-rw-r--r--src/gui/painting/qregion_s60.cpp52
-rw-r--r--src/gui/painting/qregion_win.cpp513
-rw-r--r--src/gui/painting/qregion_wince.cpp119
-rw-r--r--src/gui/painting/qstroker.cpp12
-rw-r--r--src/gui/painting/qstylepainter.cpp2
-rw-r--r--src/gui/painting/qtessellator.cpp29
-rw-r--r--src/gui/painting/qtextureglyphcache.cpp69
-rw-r--r--src/gui/painting/qtextureglyphcache_p.h9
-rw-r--r--src/gui/painting/qtransform.cpp363
-rw-r--r--src/gui/painting/qtransform.h51
-rw-r--r--src/gui/painting/qvectorpath_p.h12
-rw-r--r--src/gui/painting/qwindowsurface_d3d.cpp169
-rw-r--r--src/gui/painting/qwindowsurface_d3d_p.h84
-rw-r--r--src/gui/painting/qwindowsurface_raster.cpp43
-rw-r--r--src/gui/painting/qwindowsurface_raster_p.h15
-rw-r--r--src/gui/painting/qwindowsurface_s60.cpp237
-rw-r--r--src/gui/painting/qwindowsurface_s60_p.h95
-rw-r--r--src/gui/painting/qwindowsurface_x11.cpp8
-rw-r--r--src/gui/statemachine/qbasickeyeventtransition.cpp208
-rw-r--r--src/gui/statemachine/qbasickeyeventtransition_p.h98
-rw-r--r--src/gui/statemachine/qbasicmouseeventtransition.cpp213
-rw-r--r--src/gui/statemachine/qbasicmouseeventtransition_p.h101
-rw-r--r--src/gui/statemachine/qguistatemachine.cpp566
-rw-r--r--src/gui/statemachine/qkeyeventtransition.cpp178
-rw-r--r--src/gui/statemachine/qkeyeventtransition.h88
-rw-r--r--src/gui/statemachine/qmouseeventtransition.cpp206
-rw-r--r--src/gui/statemachine/qmouseeventtransition.h92
-rw-r--r--src/gui/statemachine/statemachine.pri13
-rw-r--r--src/gui/styles/gtksymbols.cpp309
-rw-r--r--src/gui/styles/gtksymbols_p.h6
-rw-r--r--src/gui/styles/images/defaults60theme.blobbin0 -> 74127 bytes-rw-r--r--src/gui/styles/qcleanlooksstyle.cpp1174
-rw-r--r--src/gui/styles/qcleanlooksstyle_p.h2
-rw-r--r--src/gui/styles/qcommonstyle.cpp1807
-rw-r--r--src/gui/styles/qcommonstyle_p.h15
-rw-r--r--src/gui/styles/qgtkstyle.cpp267
-rw-r--r--src/gui/styles/qgtkstyle.h4
-rw-r--r--src/gui/styles/qmacstyle.qdoc (renamed from doc/src/qstyles.qdoc)0
-rw-r--r--src/gui/styles/qmacstyle_mac.mm1077
-rw-r--r--src/gui/styles/qmacstylepixmaps_mac_p.h1400
-rw-r--r--src/gui/styles/qmotifstyle.cpp160
-rw-r--r--src/gui/styles/qplastiquestyle.cpp215
-rw-r--r--src/gui/styles/qproxystyle.cpp420
-rw-r--r--src/gui/styles/qproxystyle.h114
-rw-r--r--src/gui/styles/qproxystyle_p.h79
-rw-r--r--src/gui/styles/qs60style.cpp2882
-rw-r--r--src/gui/styles/qs60style.h110
-rw-r--r--src/gui/styles/qs60style_p.h508
-rw-r--r--src/gui/styles/qs60style_s60.cpp1384
-rw-r--r--src/gui/styles/qs60style_simulated.cpp448
-rw-r--r--src/gui/styles/qstyle.cpp126
-rw-r--r--src/gui/styles/qstyle.h16
-rw-r--r--src/gui/styles/qstyle_p.h17
-rw-r--r--src/gui/styles/qstyle_s60_simulated.qrc6
-rw-r--r--src/gui/styles/qstylefactory.cpp14
-rw-r--r--src/gui/styles/qstylehelper.cpp376
-rw-r--r--src/gui/styles/qstylehelper_p.h84
-rw-r--r--src/gui/styles/qstyleoption.cpp96
-rw-r--r--src/gui/styles/qstyleoption.h1
-rw-r--r--src/gui/styles/qstylesheetstyle.cpp350
-rw-r--r--src/gui/styles/qstylesheetstyle_default.cpp7
-rw-r--r--src/gui/styles/qstylesheetstyle_p.h2
-rw-r--r--src/gui/styles/qwindowscestyle.cpp4
-rw-r--r--src/gui/styles/qwindowsmobilestyle.cpp4449
-rw-r--r--src/gui/styles/qwindowsmobilestyle_p.h39
-rw-r--r--src/gui/styles/qwindowsstyle.cpp258
-rw-r--r--src/gui/styles/qwindowsvistastyle.cpp318
-rw-r--r--src/gui/styles/qwindowsxpstyle.cpp227
-rw-r--r--src/gui/styles/styles.pri23
-rw-r--r--src/gui/text/qabstractfontengine_p.h2
-rw-r--r--src/gui/text/qabstracttextdocumentlayout.cpp3
-rw-r--r--src/gui/text/qcssparser.cpp81
-rw-r--r--src/gui/text/qcssparser_p.h46
-rw-r--r--src/gui/text/qcssscanner.cpp84
-rw-r--r--src/gui/text/qfont.cpp86
-rw-r--r--src/gui/text/qfont.h3
-rw-r--r--src/gui/text/qfont_s60.cpp94
-rw-r--r--src/gui/text/qfont_win.cpp8
-rw-r--r--src/gui/text/qfontdatabase.cpp281
-rw-r--r--src/gui/text/qfontdatabase.h3
-rw-r--r--src/gui/text/qfontdatabase_qws.cpp294
-rw-r--r--src/gui/text/qfontdatabase_s60.cpp428
-rw-r--r--src/gui/text/qfontdatabase_win.cpp271
-rw-r--r--src/gui/text/qfontdatabase_x11.cpp30
-rw-r--r--src/gui/text/qfontengine.cpp66
-rw-r--r--src/gui/text/qfontengine_ft.cpp105
-rw-r--r--src/gui/text/qfontengine_ft_p.h3
-rw-r--r--src/gui/text/qfontengine_mac.mm124
-rw-r--r--src/gui/text/qfontengine_p.h31
-rw-r--r--src/gui/text/qfontengine_qpf.cpp95
-rw-r--r--src/gui/text/qfontengine_qpf_p.h1
-rw-r--r--src/gui/text/qfontengine_qws.cpp7
-rw-r--r--src/gui/text/qfontengine_s60.cpp331
-rw-r--r--src/gui/text/qfontengine_s60_p.h148
-rw-r--r--src/gui/text/qfontengine_win.cpp500
-rw-r--r--src/gui/text/qfontengine_win_p.h18
-rw-r--r--src/gui/text/qfontengine_x11.cpp5
-rw-r--r--src/gui/text/qfontengineglyphcache_p.h4
-rw-r--r--src/gui/text/qfontmetrics.cpp50
-rw-r--r--src/gui/text/qfontsubset.cpp30
-rw-r--r--src/gui/text/qfragmentmap_p.h21
-rw-r--r--src/gui/text/qsyntaxhighlighter.cpp44
-rw-r--r--src/gui/text/qsyntaxhighlighter.h1
-rw-r--r--src/gui/text/qtextcontrol.cpp42
-rw-r--r--src/gui/text/qtextcursor.cpp90
-rw-r--r--src/gui/text/qtextdocument.cpp13
-rw-r--r--src/gui/text/qtextdocument_p.cpp188
-rw-r--r--src/gui/text/qtextdocument_p.h11
-rw-r--r--src/gui/text/qtextdocumentfragment.cpp6
-rw-r--r--src/gui/text/qtextdocumentlayout.cpp55
-rw-r--r--src/gui/text/qtextdocumentwriter.cpp2
-rw-r--r--src/gui/text/qtextengine.cpp16
-rw-r--r--src/gui/text/qtextengine_p.h2
-rw-r--r--src/gui/text/qtextformat.cpp180
-rw-r--r--src/gui/text/qtextformat.h6
-rw-r--r--src/gui/text/qtexthtmlparser.cpp15
-rw-r--r--src/gui/text/qtextimagehandler_p.h4
-rw-r--r--src/gui/text/qtextlayout.cpp8
-rw-r--r--src/gui/text/qtextlist.cpp53
-rw-r--r--src/gui/text/qtextobject.cpp16
-rw-r--r--src/gui/text/qtextobject_p.h3
-rw-r--r--src/gui/text/qtextodfwriter.cpp61
-rw-r--r--src/gui/text/qtextoption.cpp12
-rw-r--r--src/gui/text/qtexttable.cpp15
-rw-r--r--src/gui/text/qtexttable_p.h2
-rw-r--r--src/gui/text/qzip.cpp32
-rw-r--r--src/gui/text/text.pri35
-rw-r--r--src/gui/util/qcompleter.cpp67
-rw-r--r--src/gui/util/qcompleter.h4
-rw-r--r--src/gui/util/qcompleter_p.h4
-rw-r--r--src/gui/util/qdesktopservices.cpp8
-rw-r--r--src/gui/util/qdesktopservices_mac.cpp15
-rw-r--r--src/gui/util/qdesktopservices_s60.cpp440
-rw-r--r--src/gui/util/qdesktopservices_win.cpp95
-rw-r--r--src/gui/util/qdesktopservices_x11.cpp8
-rw-r--r--src/gui/util/qsystemtrayicon.cpp11
-rw-r--r--src/gui/util/qsystemtrayicon_win.cpp357
-rw-r--r--src/gui/util/qundogroup.cpp1
-rw-r--r--src/gui/util/qundostack.cpp2
-rw-r--r--src/gui/util/qundoview.cpp2
-rw-r--r--src/gui/util/util.pri5
-rw-r--r--src/gui/widgets/qabstractbutton.cpp43
-rw-r--r--src/gui/widgets/qabstractscrollarea.cpp101
-rw-r--r--src/gui/widgets/qabstractscrollarea.h5
-rw-r--r--src/gui/widgets/qabstractscrollarea_p.h14
-rw-r--r--src/gui/widgets/qabstractslider.cpp1
-rw-r--r--src/gui/widgets/qabstractspinbox.cpp35
-rw-r--r--src/gui/widgets/qabstractspinbox.h2
-rw-r--r--src/gui/widgets/qactiontokeyeventmapper.cpp103
-rw-r--r--src/gui/widgets/qactiontokeyeventmapper_p.h81
-rw-r--r--src/gui/widgets/qbuttongroup.cpp19
-rw-r--r--src/gui/widgets/qcalendarwidget.cpp30
-rw-r--r--src/gui/widgets/qcheckbox.cpp129
-rw-r--r--src/gui/widgets/qcocoamenu_mac.mm4
-rw-r--r--src/gui/widgets/qcocoatoolbardelegate_mac.mm12
-rw-r--r--src/gui/widgets/qcombobox.cpp67
-rw-r--r--src/gui/widgets/qcombobox_p.h3
-rw-r--r--src/gui/widgets/qcommandlinkbutton.cpp15
-rw-r--r--src/gui/widgets/qdatetimeedit.cpp51
-rw-r--r--src/gui/widgets/qdatetimeedit_p.h1
-rw-r--r--src/gui/widgets/qdial.cpp2
-rw-r--r--src/gui/widgets/qdialogbuttonbox.cpp4
-rw-r--r--src/gui/widgets/qdockarealayout.cpp319
-rw-r--r--src/gui/widgets/qdockarealayout_p.h47
-rw-r--r--src/gui/widgets/qdockwidget.cpp94
-rw-r--r--src/gui/widgets/qeffects.cpp104
-rw-r--r--src/gui/widgets/qfocusframe.cpp2
-rw-r--r--src/gui/widgets/qfontcombobox.cpp3
-rw-r--r--src/gui/widgets/qframe.cpp8
-rw-r--r--src/gui/widgets/qframe_p.h3
-rw-r--r--src/gui/widgets/qgroupbox.cpp19
-rw-r--r--src/gui/widgets/qlabel.cpp26
-rw-r--r--src/gui/widgets/qlcdnumber.cpp14
-rw-r--r--src/gui/widgets/qlinecontrol.cpp1779
-rw-r--r--src/gui/widgets/qlinecontrol_p.h744
-rw-r--r--src/gui/widgets/qlineedit.cpp1903
-rw-r--r--src/gui/widgets/qlineedit.h7
-rw-r--r--src/gui/widgets/qlineedit_p.cpp263
-rw-r--r--src/gui/widgets/qlineedit_p.h177
-rw-r--r--src/gui/widgets/qmacnativewidget_mac.h2
-rw-r--r--src/gui/widgets/qmainwindow.cpp52
-rw-r--r--src/gui/widgets/qmainwindowlayout.cpp327
-rw-r--r--src/gui/widgets/qmainwindowlayout_mac.mm51
-rw-r--r--src/gui/widgets/qmainwindowlayout_p.h62
-rw-r--r--src/gui/widgets/qmdiarea.cpp38
-rw-r--r--src/gui/widgets/qmdisubwindow.cpp79
-rw-r--r--src/gui/widgets/qmdisubwindow_p.h4
-rw-r--r--src/gui/widgets/qmenu.cpp656
-rw-r--r--src/gui/widgets/qmenu.h13
-rw-r--r--src/gui/widgets/qmenu_mac.mm240
-rw-r--r--src/gui/widgets/qmenu_p.h79
-rw-r--r--src/gui/widgets/qmenu_symbian.cpp425
-rw-r--r--src/gui/widgets/qmenu_wince.cpp4
-rw-r--r--src/gui/widgets/qmenubar.cpp437
-rw-r--r--src/gui/widgets/qmenubar.h8
-rw-r--r--src/gui/widgets/qmenubar_p.h74
-rw-r--r--src/gui/widgets/qmenudata.h2
-rw-r--r--src/gui/widgets/qplaintextedit.cpp106
-rw-r--r--src/gui/widgets/qplaintextedit.h5
-rw-r--r--src/gui/widgets/qplaintextedit_p.h14
-rw-r--r--src/gui/widgets/qprintpreviewwidget.cpp59
-rw-r--r--src/gui/widgets/qprintpreviewwidget.h2
-rw-r--r--src/gui/widgets/qprogressbar.cpp27
-rw-r--r--src/gui/widgets/qpushbutton.cpp16
-rw-r--r--src/gui/widgets/qpushbutton_p.h3
-rw-r--r--src/gui/widgets/qradiobutton.cpp2
-rw-r--r--src/gui/widgets/qrubberband.cpp3
-rw-r--r--src/gui/widgets/qscrollarea.cpp2
-rw-r--r--src/gui/widgets/qscrollbar.cpp6
-rw-r--r--src/gui/widgets/qsizegrip.cpp8
-rw-r--r--src/gui/widgets/qslider.cpp12
-rw-r--r--src/gui/widgets/qspinbox.cpp53
-rw-r--r--src/gui/widgets/qsplashscreen.cpp3
-rw-r--r--src/gui/widgets/qsplitter.cpp16
-rw-r--r--src/gui/widgets/qsplitter_p.h9
-rw-r--r--src/gui/widgets/qstackedwidget.cpp3
-rw-r--r--src/gui/widgets/qstatusbar.cpp8
-rw-r--r--src/gui/widgets/qtabbar.cpp100
-rw-r--r--src/gui/widgets/qtabbar.h2
-rw-r--r--src/gui/widgets/qtabbar_p.h68
-rw-r--r--src/gui/widgets/qtabwidget.cpp4
-rw-r--r--src/gui/widgets/qtextbrowser.cpp10
-rw-r--r--src/gui/widgets/qtextedit.cpp23
-rw-r--r--src/gui/widgets/qtextedit_p.h2
-rw-r--r--src/gui/widgets/qtoolbar.cpp109
-rw-r--r--src/gui/widgets/qtoolbar.h1
-rw-r--r--src/gui/widgets/qtoolbar_p.h8
-rw-r--r--src/gui/widgets/qtoolbararealayout.cpp139
-rw-r--r--src/gui/widgets/qtoolbararealayout_p.h77
-rw-r--r--src/gui/widgets/qtoolbarextension.cpp6
-rw-r--r--src/gui/widgets/qtoolbarlayout.cpp27
-rw-r--r--src/gui/widgets/qtoolbarlayout_p.h10
-rw-r--r--src/gui/widgets/qtoolbox.cpp2
-rw-r--r--src/gui/widgets/qtoolbutton.cpp30
-rw-r--r--src/gui/widgets/qvalidator.cpp11
-rw-r--r--src/gui/widgets/qvalidator.h4
-rw-r--r--src/gui/widgets/qwidgetanimator.cpp164
-rw-r--r--src/gui/widgets/qwidgetanimator_p.h34
-rw-r--r--src/gui/widgets/qwidgetresizehandler.cpp2
-rw-r--r--src/gui/widgets/qworkspace.cpp33
-rw-r--r--src/gui/widgets/widgets.pri17
-rw-r--r--src/multimedia/audio/audio.pri56
-rw-r--r--src/multimedia/audio/qaudio.cpp102
-rw-r--r--src/multimedia/audio/qaudio.h71
-rw-r--r--src/multimedia/audio/qaudio_mac.cpp142
-rw-r--r--src/multimedia/audio/qaudio_mac_p.h144
-rw-r--r--src/multimedia/audio/qaudiodevicefactory.cpp250
-rw-r--r--src/multimedia/audio/qaudiodevicefactory_p.h100
-rw-r--r--src/multimedia/audio/qaudiodeviceid.cpp168
-rw-r--r--src/multimedia/audio/qaudiodeviceid.h94
-rw-r--r--src/multimedia/audio/qaudiodeviceid_p.h82
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo.cpp270
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo.h102
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp396
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo_alsa_p.h117
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo_mac_p.cpp357
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo_mac_p.h97
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo_win32_p.cpp381
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo_win32_p.h112
-rw-r--r--src/multimedia/audio/qaudioengine.cpp343
-rw-r--r--src/multimedia/audio/qaudioengine.h131
-rw-r--r--src/multimedia/audio/qaudioengineplugin.cpp54
-rw-r--r--src/multimedia/audio/qaudioengineplugin.h93
-rw-r--r--src/multimedia/audio/qaudioformat.cpp357
-rw-r--r--src/multimedia/audio/qaudioformat.h103
-rw-r--r--src/multimedia/audio/qaudioinput.cpp400
-rw-r--r--src/multimedia/audio/qaudioinput.h108
-rw-r--r--src/multimedia/audio/qaudioinput_alsa_p.cpp691
-rw-r--r--src/multimedia/audio/qaudioinput_alsa_p.h155
-rw-r--r--src/multimedia/audio/qaudioinput_mac_p.cpp930
-rw-r--r--src/multimedia/audio/qaudioinput_mac_p.h171
-rw-r--r--src/multimedia/audio/qaudioinput_win32_p.cpp544
-rw-r--r--src/multimedia/audio/qaudioinput_win32_p.h156
-rw-r--r--src/multimedia/audio/qaudiooutput.cpp403
-rw-r--r--src/multimedia/audio/qaudiooutput.h109
-rw-r--r--src/multimedia/audio/qaudiooutput_alsa_p.cpp710
-rw-r--r--src/multimedia/audio/qaudiooutput_alsa_p.h163
-rw-r--r--src/multimedia/audio/qaudiooutput_mac_p.cpp700
-rw-r--r--src/multimedia/audio/qaudiooutput_mac_p.h171
-rw-r--r--src/multimedia/audio/qaudiooutput_win32_p.cpp508
-rw-r--r--src/multimedia/audio/qaudiooutput_win32_p.h156
-rw-r--r--src/multimedia/multimedia.pro12
-rw-r--r--src/multimedia/video/qabstractvideobuffer.cpp199
-rw-r--r--src/multimedia/video/qabstractvideobuffer.h104
-rw-r--r--src/multimedia/video/qabstractvideobuffer_p.h73
-rw-r--r--src/multimedia/video/qabstractvideosurface.cpp268
-rw-r--r--src/multimedia/video/qabstractvideosurface.h110
-rw-r--r--src/multimedia/video/qabstractvideosurface_p.h79
-rw-r--r--src/multimedia/video/qimagevideobuffer.cpp106
-rw-r--r--src/multimedia/video/qimagevideobuffer_p.h79
-rw-r--r--src/multimedia/video/qmemoryvideobuffer.cpp129
-rw-r--r--src/multimedia/video/qmemoryvideobuffer_p.h83
-rw-r--r--src/multimedia/video/qvideoframe.cpp742
-rw-r--r--src/multimedia/video/qvideoframe.h169
-rw-r--r--src/multimedia/video/qvideosurfaceformat.cpp742
-rw-r--r--src/multimedia/video/qvideosurfaceformat.h157
-rw-r--r--src/multimedia/video/video.pri21
-rw-r--r--src/network/access/access.pri7
-rw-r--r--src/network/access/qabstractnetworkcache.cpp4
-rw-r--r--src/network/access/qftp.cpp25
-rw-r--r--src/network/access/qhttp.cpp46
-rw-r--r--src/network/access/qhttp.h3
-rw-r--r--src/network/access/qhttpnetworkconnection.cpp1072
-rw-r--r--src/network/access/qhttpnetworkconnection_p.h122
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel.cpp884
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel_p.h192
-rw-r--r--src/network/access/qhttpnetworkreply.cpp209
-rw-r--r--src/network/access/qhttpnetworkreply_p.h38
-rw-r--r--src/network/access/qhttpnetworkrequest.cpp36
-rw-r--r--src/network/access/qhttpnetworkrequest_p.h14
-rw-r--r--src/network/access/qnetworkaccessbackend.cpp69
-rw-r--r--src/network/access/qnetworkaccessbackend_p.h42
-rw-r--r--src/network/access/qnetworkaccesscache_p.h3
-rw-r--r--src/network/access/qnetworkaccesscachebackend.cpp1
-rw-r--r--src/network/access/qnetworkaccessdatabackend.cpp6
-rw-r--r--src/network/access/qnetworkaccessdebugpipebackend.cpp288
-rw-r--r--src/network/access/qnetworkaccessdebugpipebackend_p.h23
-rw-r--r--src/network/access/qnetworkaccessfilebackend.cpp93
-rw-r--r--src/network/access/qnetworkaccessfilebackend_p.h9
-rw-r--r--src/network/access/qnetworkaccessftpbackend.cpp88
-rw-r--r--src/network/access/qnetworkaccessftpbackend_p.h9
-rw-r--r--src/network/access/qnetworkaccesshttpbackend.cpp182
-rw-r--r--src/network/access/qnetworkaccesshttpbackend_p.h19
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp122
-rw-r--r--src/network/access/qnetworkaccessmanager.h2
-rw-r--r--src/network/access/qnetworkaccessmanager_p.h12
-rw-r--r--src/network/access/qnetworkcookie.cpp264
-rw-r--r--src/network/access/qnetworkcookie.h23
-rw-r--r--src/network/access/qnetworkcookiejar.cpp296
-rw-r--r--src/network/access/qnetworkcookiejar.h81
-rw-r--r--src/network/access/qnetworkcookiejar_p.h71
-rw-r--r--src/network/access/qnetworkdiskcache.cpp60
-rw-r--r--src/network/access/qnetworkdiskcache.h5
-rw-r--r--src/network/access/qnetworkreply.cpp63
-rw-r--r--src/network/access/qnetworkreply.h4
-rw-r--r--src/network/access/qnetworkreply_p.h2
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp258
-rw-r--r--src/network/access/qnetworkreplyimpl_p.h24
-rw-r--r--src/network/access/qnetworkrequest.cpp22
-rw-r--r--src/network/access/qnetworkrequest.h3
-rw-r--r--src/network/kernel/kernel.pri5
-rw-r--r--src/network/kernel/qauthenticator.cpp11
-rw-r--r--src/network/kernel/qhostaddress.cpp9
-rw-r--r--src/network/kernel/qhostaddress.h3
-rw-r--r--src/network/kernel/qhostinfo.cpp35
-rw-r--r--src/network/kernel/qhostinfo.h3
-rw-r--r--src/network/kernel/qhostinfo_unix.cpp44
-rw-r--r--src/network/kernel/qhostinfo_win.cpp22
-rw-r--r--src/network/kernel/qnetworkinterface.cpp18
-rw-r--r--src/network/kernel/qnetworkinterface.h3
-rw-r--r--src/network/kernel/qnetworkinterface_symbian.cpp238
-rw-r--r--src/network/kernel/qnetworkinterface_unix.cpp19
-rw-r--r--src/network/kernel/qnetworkinterface_win.cpp26
-rw-r--r--src/network/kernel/qnetworkinterface_win_p.h2
-rw-r--r--src/network/kernel/qnetworkproxy.cpp41
-rw-r--r--src/network/kernel/qnetworkproxy.h1
-rw-r--r--src/network/kernel/qnetworkproxy_p.h85
-rw-r--r--src/network/kernel/qnetworkproxy_win.cpp24
-rw-r--r--src/network/kernel/qurlinfo.cpp2
-rw-r--r--src/network/network.pro13
-rw-r--r--src/network/socket/qabstractsocket.cpp86
-rw-r--r--src/network/socket/qabstractsocket.h8
-rw-r--r--src/network/socket/qabstractsocketengine_p.h4
-rw-r--r--src/network/socket/qhttpsocketengine.cpp22
-rw-r--r--src/network/socket/qlocalserver.cpp14
-rw-r--r--src/network/socket/qlocalserver.h8
-rw-r--r--src/network/socket/qlocalserver_p.h61
-rw-r--r--src/network/socket/qlocalserver_unix.cpp37
-rw-r--r--src/network/socket/qlocalserver_win.cpp234
-rw-r--r--src/network/socket/qlocalsocket.cpp33
-rw-r--r--src/network/socket/qlocalsocket.h1
-rw-r--r--src/network/socket/qlocalsocket_p.h53
-rw-r--r--src/network/socket/qlocalsocket_unix.cpp29
-rw-r--r--src/network/socket/qlocalsocket_win.cpp285
-rw-r--r--src/network/socket/qnativesocketengine.cpp28
-rw-r--r--src/network/socket/qnativesocketengine_p.h37
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp271
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp153
-rw-r--r--src/network/socket/qnet_unix_p.h204
-rw-r--r--src/network/socket/qsocks5socketengine.cpp42
-rw-r--r--src/network/socket/qtcpserver.cpp9
-rw-r--r--src/network/socket/qtcpsocket.cpp10
-rw-r--r--src/network/socket/qtcpsocket.h1
-rw-r--r--src/network/socket/qudpsocket.cpp24
-rw-r--r--src/network/socket/socket.pri5
-rw-r--r--src/network/ssl/qssl.cpp3
-rw-r--r--src/network/ssl/qsslcertificate.cpp65
-rw-r--r--src/network/ssl/qsslcertificate.h3
-rw-r--r--src/network/ssl/qsslcertificate_p.h1
-rw-r--r--src/network/ssl/qsslcipher.cpp9
-rw-r--r--src/network/ssl/qsslcipher.h3
-rw-r--r--src/network/ssl/qsslconfiguration.cpp2
-rw-r--r--src/network/ssl/qsslerror.cpp35
-rw-r--r--src/network/ssl/qsslerror.h10
-rw-r--r--src/network/ssl/qsslkey.cpp14
-rw-r--r--src/network/ssl/qsslkey.h5
-rw-r--r--src/network/ssl/qsslkey_p.h4
-rw-r--r--src/network/ssl/qsslsocket.cpp96
-rw-r--r--src/network/ssl/qsslsocket.h2
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp38
-rw-r--r--src/network/ssl/qsslsocket_openssl_p.h6
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols.cpp149
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols_p.h2
-rw-r--r--src/network/ssl/qsslsocket_p.h7
-rw-r--r--src/network/ssl/ssl.pri10
-rw-r--r--src/opengl/gl2paintengineex/glgc_shader_source.h289
-rw-r--r--src/opengl/gl2paintengineex/qgl2pexvertexarray.cpp12
-rw-r--r--src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h14
-rw-r--r--src/opengl/gl2paintengineex/qglcustomshaderstage.cpp125
-rw-r--r--src/opengl/gl2paintengineex/qglcustomshaderstage_p.h92
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager.cpp668
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager_p.h466
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadersource_p.h414
-rw-r--r--src/opengl/gl2paintengineex/qglgradientcache.cpp58
-rw-r--r--src/opengl/gl2paintengineex/qglgradientcache_p.h33
-rw-r--r--src/opengl/gl2paintengineex/qglpexshadermanager.cpp450
-rw-r--r--src/opengl/gl2paintengineex/qglpexshadermanager_p.h156
-rw-r--r--src/opengl/gl2paintengineex/qglshader.cpp605
-rw-r--r--src/opengl/gl2paintengineex/qglshader_p.h260
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp1593
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h181
-rw-r--r--src/opengl/opengl.pro78
-rw-r--r--src/opengl/qegl.cpp787
-rw-r--r--src/opengl/qegl_p.h188
-rw-r--r--src/opengl/qegl_qws.cpp125
-rw-r--r--src/opengl/qegl_wince.cpp105
-rw-r--r--src/opengl/qegl_x11egl.cpp130
-rw-r--r--src/opengl/qgl.cpp1312
-rw-r--r--src/opengl/qgl.h45
-rw-r--r--src/opengl/qgl_egl.cpp8
-rw-r--r--src/opengl/qgl_egl_p.h2
-rw-r--r--src/opengl/qgl_p.h312
-rw-r--r--src/opengl/qgl_qws.cpp61
-rw-r--r--src/opengl/qgl_win.cpp16
-rw-r--r--src/opengl/qgl_wince.cpp4
-rw-r--r--src/opengl/qgl_x11.cpp344
-rw-r--r--src/opengl/qgl_x11egl.cpp365
-rw-r--r--src/opengl/qglcolormap.cpp26
-rw-r--r--src/opengl/qglextensions.cpp300
-rw-r--r--src/opengl/qglextensions_p.h514
-rw-r--r--src/opengl/qglframebufferobject.cpp606
-rw-r--r--src/opengl/qglframebufferobject.h51
-rw-r--r--src/opengl/qglpaintdevice_qws.cpp2
-rw-r--r--src/opengl/qglpaintdevice_qws_p.h3
-rw-r--r--src/opengl/qglpixelbuffer.cpp50
-rw-r--r--src/opengl/qglpixelbuffer.h2
-rw-r--r--src/opengl/qglpixelbuffer_egl.cpp10
-rw-r--r--src/opengl/qglpixelbuffer_x11.cpp2
-rw-r--r--src/opengl/qglpixmapfilter.cpp486
-rw-r--r--src/opengl/qglpixmapfilter_p.h29
-rw-r--r--src/opengl/qglshaderprogram.cpp3135
-rw-r--r--src/opengl/qglshaderprogram.h302
-rw-r--r--src/opengl/qgraphicsshadereffect.cpp314
-rw-r--r--src/opengl/qgraphicsshadereffect.h83
-rw-r--r--src/opengl/qgraphicssystem_gl.cpp1
-rw-r--r--src/opengl/qpaintengine_opengl.cpp317
-rw-r--r--src/opengl/qpaintengine_opengl_p.h1
-rw-r--r--src/opengl/qpixmapdata_gl.cpp467
-rw-r--r--src/opengl/qpixmapdata_gl_p.h59
-rw-r--r--src/opengl/qwindowsurface_gl.cpp302
-rw-r--r--src/opengl/qwindowsurface_gl_p.h7
-rw-r--r--src/opengl/util/fragmentprograms_p.h6824
-rw-r--r--src/opengl/util/generator.cpp3
-rw-r--r--src/opengl/util/generator.pro2
-rw-r--r--src/opengl/util/texture_brush.glsl2
-rw-r--r--src/openvg/openvg.pro54
-rw-r--r--src/openvg/qpaintengine_vg.cpp3416
-rw-r--r--src/openvg/qpaintengine_vg_p.h165
-rw-r--r--src/openvg/qpixmapdata_vg.cpp369
-rw-r--r--src/openvg/qpixmapdata_vg_p.h113
-rw-r--r--src/openvg/qpixmapfilter_vg.cpp399
-rw-r--r--src/openvg/qpixmapfilter_vg_p.h121
-rw-r--r--src/openvg/qvg.h65
-rw-r--r--src/openvg/qvg_p.h110
-rw-r--r--src/openvg/qvgcompositionhelper_p.h91
-rw-r--r--src/openvg/qwindowsurface_vg.cpp120
-rw-r--r--src/openvg/qwindowsurface_vg_p.h92
-rw-r--r--src/openvg/qwindowsurface_vgegl.cpp757
-rw-r--r--src/openvg/qwindowsurface_vgegl_p.h163
-rw-r--r--src/phonon/phonon.pro14
-rw-r--r--src/plugins/accessible/compat/q3complexwidgets.cpp2
-rw-r--r--src/plugins/accessible/widgets/rangecontrols.cpp2
-rw-r--r--src/plugins/audio/audio.pro3
-rw-r--r--src/plugins/codecs/cn/cn.pro2
-rw-r--r--src/plugins/codecs/jp/jp.pro2
-rw-r--r--src/plugins/codecs/jp/qeucjpcodec.cpp1
-rw-r--r--src/plugins/codecs/kr/kr.pro2
-rw-r--r--src/plugins/codecs/kr/qeuckrcodec.cpp2
-rw-r--r--src/plugins/codecs/tw/tw.pro2
-rw-r--r--src/plugins/gfxdrivers/directfb/directfb.pro35
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.cpp8
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.h11
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp11
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbmouse.h11
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp136
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h32
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp205
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h9
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp288
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpixmap.h45
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp766
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.h125
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreenplugin.cpp3
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp225
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h32
-rw-r--r--src/plugins/gfxdrivers/hybrid/hybridscreen.cpp4
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp2
-rw-r--r--src/plugins/gfxdrivers/vnc/qscreenvnc_qws.cpp4
-rw-r--r--src/plugins/graphicssystems/graphicssystems.pro6
-rw-r--r--src/plugins/graphicssystems/openvg/main.cpp71
-rw-r--r--src/plugins/graphicssystems/openvg/openvg.pro12
-rw-r--r--src/plugins/graphicssystems/openvg/qgraphicssystem_vg.cpp70
-rw-r--r--src/plugins/graphicssystems/openvg/qgraphicssystem_vg_p.h71
-rw-r--r--src/plugins/graphicssystems/shivavg/README8
-rw-r--r--src/plugins/graphicssystems/shivavg/main.cpp71
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavg.pro12
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavggraphicssystem.cpp62
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavggraphicssystem.h60
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp370
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavgwindowsurface.h76
-rw-r--r--src/plugins/iconengines/svgiconengine/svgiconengine.pro2
-rw-r--r--src/plugins/imageformats/gif/gif.pro2
-rw-r--r--src/plugins/imageformats/ico/ico.pro2
-rw-r--r--src/plugins/imageformats/ico/qicohandler.cpp343
-rw-r--r--src/plugins/imageformats/jpeg/jpeg.pro7
-rw-r--r--src/plugins/imageformats/jpeg/qjpeghandler.cpp3
-rw-r--r--src/plugins/imageformats/mng/mng.pro7
-rw-r--r--src/plugins/imageformats/mng/qmnghandler.cpp2
-rw-r--r--src/plugins/imageformats/mng/qmnghandler.h3
-rw-r--r--src/plugins/imageformats/svg/svg.pro2
-rw-r--r--src/plugins/imageformats/tiff/qtiffhandler.cpp437
-rw-r--r--src/plugins/imageformats/tiff/tiff.pro5
-rw-r--r--src/plugins/kbddrivers/kbddrivers.pro6
-rw-r--r--src/plugins/kbddrivers/linuxinput/linuxinput.pro14
-rw-r--r--src/plugins/kbddrivers/linuxinput/main.cpp77
-rw-r--r--src/plugins/kbddrivers/linuxis/README1
-rw-r--r--src/plugins/kbddrivers/linuxis/linuxis.pro11
-rw-r--r--src/plugins/kbddrivers/linuxis/linuxiskbddriverplugin.cpp87
-rw-r--r--src/plugins/kbddrivers/linuxis/linuxiskbddriverplugin.h58
-rw-r--r--src/plugins/kbddrivers/linuxis/linuxiskbdhandler.cpp171
-rw-r--r--src/plugins/kbddrivers/linuxis/linuxiskbdhandler.h80
-rw-r--r--src/plugins/kbddrivers/sl5000/main.cpp76
-rw-r--r--src/plugins/kbddrivers/sl5000/sl5000.pro16
-rw-r--r--src/plugins/kbddrivers/usb/main.cpp76
-rw-r--r--src/plugins/kbddrivers/usb/usb.pro14
-rw-r--r--src/plugins/kbddrivers/vr41xx/main.cpp76
-rw-r--r--src/plugins/kbddrivers/vr41xx/vr41xx.pro14
-rw-r--r--src/plugins/kbddrivers/yopy/main.cpp76
-rw-r--r--src/plugins/kbddrivers/yopy/yopy.pro14
-rw-r--r--src/plugins/mousedrivers/bus/bus.pro14
-rw-r--r--src/plugins/mousedrivers/bus/main.cpp76
-rw-r--r--src/plugins/mousedrivers/linuxis/linuxis.pro10
-rw-r--r--src/plugins/mousedrivers/linuxis/linuxismousedriverplugin.cpp83
-rw-r--r--src/plugins/mousedrivers/linuxis/linuxismousedriverplugin.h58
-rw-r--r--src/plugins/mousedrivers/linuxis/linuxismousehandler.cpp180
-rw-r--r--src/plugins/mousedrivers/linuxis/linuxismousehandler.h72
-rw-r--r--src/plugins/mousedrivers/mousedrivers.pro5
-rw-r--r--src/plugins/mousedrivers/vr41xx/main.cpp76
-rw-r--r--src/plugins/mousedrivers/vr41xx/vr41xx.pro14
-rw-r--r--src/plugins/mousedrivers/yopy/main.cpp76
-rw-r--r--src/plugins/mousedrivers/yopy/yopy.pro14
-rw-r--r--src/plugins/phonon/qt7/qt7.pro2
-rw-r--r--src/plugins/plugins.pro6
-rw-r--r--src/plugins/qpluginbase.pri8
-rw-r--r--src/plugins/s60/3_1/3_1.pro8
-rw-r--r--src/plugins/s60/3_2/3_2.pro15
-rw-r--r--src/plugins/s60/5_0/5_0.pro15
-rw-r--r--src/plugins/s60/bwins/qts60pluginu.def6
-rw-r--r--src/plugins/s60/eabi/qts60pluginu.def6
-rw-r--r--src/plugins/s60/s60.pro3
-rw-r--r--src/plugins/s60/s60pluginbase.pri16
-rw-r--r--src/plugins/s60/src/qdesktopservices_3_1.cpp49
-rw-r--r--src/plugins/s60/src/qdesktopservices_3_2.cpp80
-rw-r--r--src/plugins/s60/src/qlocale_3_1.cpp62
-rw-r--r--src/plugins/s60/src/qlocale_3_2.cpp64
-rw-r--r--src/plugins/script/script.pro2
-rw-r--r--src/plugins/sqldrivers/odbc/odbc.pro8
-rw-r--r--src/plugins/sqldrivers/sqldrivers.pro4
-rw-r--r--src/plugins/sqldrivers/sqlite_symbian/SQLite3_v9.2.zipbin0 -> 3155605 bytes-rw-r--r--src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pro5
-rw-r--r--src/qbase.pri30
-rw-r--r--src/qt3support/canvas/q3canvas.cpp2
-rw-r--r--src/qt3support/dialogs/q3filedialog.cpp220
-rw-r--r--src/qt3support/dialogs/q3filedialog_mac.cpp2
-rw-r--r--src/qt3support/dialogs/q3filedialog_win.cpp432
-rw-r--r--src/qt3support/dialogs/q3tabdialog.cpp13
-rw-r--r--src/qt3support/dialogs/q3tabdialog.h1
-rw-r--r--src/qt3support/itemviews/q3iconview.cpp6
-rw-r--r--src/qt3support/itemviews/q3table.cpp3
-rw-r--r--src/qt3support/network/network.pri2
-rw-r--r--src/qt3support/network/q3dns.cpp84
-rw-r--r--src/qt3support/network/q3ftp.cpp24
-rw-r--r--src/qt3support/network/q3http.cpp15
-rw-r--r--src/qt3support/network/q3socketdevice_win.cpp7
-rw-r--r--src/qt3support/network/q3url.cpp61
-rw-r--r--src/qt3support/network/q3urloperator.cpp2
-rw-r--r--src/qt3support/other/q3accel.cpp2
-rw-r--r--src/qt3support/other/q3dragobject.cpp18
-rw-r--r--src/qt3support/other/q3process.cpp2
-rw-r--r--src/qt3support/other/q3process_unix.cpp2
-rw-r--r--src/qt3support/other/q3process_win.cpp158
-rw-r--r--src/qt3support/painting/q3paintengine_svg.cpp48
-rw-r--r--src/qt3support/painting/q3painter.h2
-rw-r--r--src/qt3support/qt3support.pro2
-rw-r--r--src/qt3support/sql/q3datatable.cpp2
-rw-r--r--src/qt3support/sql/q3sqlcursor.cpp2
-rw-r--r--src/qt3support/sql/q3sqlfieldinfo.qdoc (renamed from doc/src/q3sqlfieldinfo.qdoc)0
-rw-r--r--src/qt3support/sql/q3sqlrecordinfo.qdoc (renamed from doc/src/q3sqlrecordinfo.qdoc)0
-rw-r--r--src/qt3support/text/q3richtext.cpp28
-rw-r--r--src/qt3support/text/q3textedit.cpp4
-rw-r--r--src/qt3support/tools/q3asciicache.qdoc (renamed from doc/src/q3asciicache.qdoc)0
-rw-r--r--src/qt3support/tools/q3asciidict.qdoc (renamed from doc/src/q3asciidict.qdoc)0
-rw-r--r--src/qt3support/tools/q3cache.qdoc (renamed from doc/src/q3cache.qdoc)0
-rw-r--r--src/qt3support/tools/q3cstring.cpp32
-rw-r--r--src/qt3support/tools/q3dict.qdoc (renamed from doc/src/q3dict.qdoc)0
-rw-r--r--src/qt3support/tools/q3intcache.qdoc (renamed from doc/src/q3intcache.qdoc)0
-rw-r--r--src/qt3support/tools/q3intdict.qdoc (renamed from doc/src/q3intdict.qdoc)0
-rw-r--r--src/qt3support/tools/q3memarray.qdoc (renamed from doc/src/q3memarray.qdoc)0
-rw-r--r--src/qt3support/tools/q3ptrdict.qdoc (renamed from doc/src/q3ptrdict.qdoc)0
-rw-r--r--src/qt3support/tools/q3ptrlist.qdoc (renamed from doc/src/q3ptrlist.qdoc)0
-rw-r--r--src/qt3support/tools/q3ptrqueue.qdoc (renamed from doc/src/q3ptrqueue.qdoc)0
-rw-r--r--src/qt3support/tools/q3ptrstack.qdoc (renamed from doc/src/q3ptrstack.qdoc)0
-rw-r--r--src/qt3support/tools/q3ptrvector.qdoc (renamed from doc/src/q3ptrvector.qdoc)0
-rw-r--r--src/qt3support/tools/q3valuelist.qdoc (renamed from doc/src/q3valuelist.qdoc)0
-rw-r--r--src/qt3support/tools/q3valuestack.qdoc (renamed from doc/src/q3valuestack.qdoc)0
-rw-r--r--src/qt3support/tools/q3valuevector.qdoc (renamed from doc/src/q3valuevector.qdoc)0
-rw-r--r--src/qt3support/widgets/q3action.cpp2
-rw-r--r--src/qt3support/widgets/q3datetimeedit.cpp75
-rw-r--r--src/qt3support/widgets/q3dockarea.cpp29
-rw-r--r--src/qt3support/widgets/q3mainwindow.cpp18
-rw-r--r--src/qt3support/widgets/q3popupmenu.cpp37
-rw-r--r--src/qt3support/widgets/q3scrollview.cpp4
-rw-r--r--src/qt3support/widgets/q3titlebar.cpp33
-rw-r--r--src/s60installs/.gitignore1
-rw-r--r--src/s60installs/bwins/QtCoreu.def3848
-rw-r--r--src/s60installs/bwins/QtGuiu.def12196
-rw-r--r--src/s60installs/bwins/QtNetworku.def1232
-rw-r--r--src/s60installs/bwins/QtScriptu.def307
-rw-r--r--src/s60installs/bwins/QtSqlu.def451
-rw-r--r--src/s60installs/bwins/QtSvgu.def201
-rw-r--r--src/s60installs/bwins/QtTestu.def76
-rw-r--r--src/s60installs/bwins/QtXmlu.def402
-rw-r--r--src/s60installs/bwins/phononu.def505
-rw-r--r--src/s60installs/eabi/QtCoreu.def3726
-rw-r--r--src/s60installs/eabi/QtGuiu.def12513
-rw-r--r--src/s60installs/eabi/QtMultimediau.def159
-rw-r--r--src/s60installs/eabi/QtNetworku.def1367
-rw-r--r--src/s60installs/eabi/QtScriptu.def589
-rw-r--r--src/s60installs/eabi/QtSqlu.def476
-rw-r--r--src/s60installs/eabi/QtSvgu.def205
-rw-r--r--src/s60installs/eabi/QtTestu.def83
-rw-r--r--src/s60installs/eabi/QtXmlu.def491
-rw-r--r--src/s60installs/eabi/phononu.def561
-rw-r--r--src/s60installs/qt.iby102
-rw-r--r--src/s60installs/qtdemoapps.iby15
-rw-r--r--src/s60installs/s60installs.pro97
-rw-r--r--src/s60main/qts60main.cpp62
-rw-r--r--src/s60main/qts60main_mcrt0.cpp111
-rw-r--r--src/s60main/qts60mainapplication.cpp91
-rw-r--r--src/s60main/qts60mainapplication_p.h104
-rw-r--r--src/s60main/qts60mainappui.cpp213
-rw-r--r--src/s60main/qts60mainappui_p.h146
-rw-r--r--src/s60main/qts60maindocument.cpp117
-rw-r--r--src/s60main/qts60maindocument_p.h133
-rw-r--r--src/s60main/s60main.pro55
-rw-r--r--src/s60main/s60main.rss85
-rw-r--r--src/script/api/api.pri32
-rw-r--r--src/script/api/qscriptable.cpp182
-rw-r--r--src/script/api/qscriptable.h88
-rw-r--r--src/script/api/qscriptable_p.h79
-rw-r--r--src/script/api/qscriptclass.cpp397
-rw-r--r--src/script/api/qscriptclass.h118
-rw-r--r--src/script/api/qscriptclasspropertyiterator.cpp222
-rw-r--r--src/script/api/qscriptclasspropertyiterator.h93
-rw-r--r--src/script/api/qscriptcontext.cpp769
-rw-r--r--src/script/api/qscriptcontext.h122
-rw-r--r--src/script/api/qscriptcontext_p.h76
-rw-r--r--src/script/api/qscriptcontextinfo.cpp573
-rw-r--r--src/script/api/qscriptcontextinfo.h122
-rw-r--r--src/script/api/qscriptengine.cpp3819
-rw-r--r--src/script/api/qscriptengine.h478
-rw-r--r--src/script/api/qscriptengine_p.h396
-rw-r--r--src/script/api/qscriptengineagent.cpp510
-rw-r--r--src/script/api/qscriptengineagent.h109
-rw-r--r--src/script/api/qscriptengineagent_p.h142
-rw-r--r--src/script/api/qscriptextensioninterface.h70
-rw-r--r--src/script/api/qscriptextensionplugin.cpp143
-rw-r--r--src/script/api/qscriptextensionplugin.h76
-rw-r--r--src/script/api/qscriptstring.cpp198
-rw-r--r--src/script/api/qscriptstring.h83
-rw-r--r--src/script/api/qscriptstring_p.h112
-rw-r--r--src/script/api/qscriptvalue.cpp2452
-rw-r--r--src/script/api/qscriptvalue.h238
-rw-r--r--src/script/api/qscriptvalue_p.h157
-rw-r--r--src/script/api/qscriptvalueiterator.cpp352
-rw-r--r--src/script/api/qscriptvalueiterator.h97
-rw-r--r--src/script/bridge/bridge.pri17
-rw-r--r--src/script/bridge/qscriptactivationobject.cpp172
-rw-r--r--src/script/bridge/qscriptactivationobject_p.h110
-rw-r--r--src/script/bridge/qscriptclassobject.cpp277
-rw-r--r--src/script/bridge/qscriptclassobject_p.h111
-rw-r--r--src/script/bridge/qscriptfunction.cpp194
-rw-r--r--src/script/bridge/qscriptfunction_p.h137
-rw-r--r--src/script/bridge/qscriptglobalobject.cpp168
-rw-r--r--src/script/bridge/qscriptglobalobject_p.h147
-rw-r--r--src/script/bridge/qscriptobject.cpp258
-rw-r--r--src/script/bridge/qscriptobject_p.h160
-rw-r--r--src/script/bridge/qscriptqobject.cpp2222
-rw-r--r--src/script/bridge/qscriptqobject_p.h337
-rw-r--r--src/script/bridge/qscriptvariant.cpp163
-rw-r--r--src/script/bridge/qscriptvariant_p.h91
-rw-r--r--src/script/instruction.table87
-rw-r--r--src/script/parser/parser.pri19
-rw-r--r--src/script/parser/qscript.g2080
-rw-r--r--src/script/parser/qscriptast.cpp785
-rw-r--r--src/script/parser/qscriptast_p.h1498
-rw-r--r--src/script/parser/qscriptastfwd_p.h (renamed from src/script/qscriptastfwd_p.h)0
-rw-r--r--src/script/parser/qscriptastvisitor.cpp (renamed from src/script/qscriptastvisitor.cpp)0
-rw-r--r--src/script/parser/qscriptastvisitor_p.h (renamed from src/script/qscriptastvisitor_p.h)0
-rw-r--r--src/script/parser/qscriptgrammar.cpp971
-rw-r--r--src/script/parser/qscriptgrammar_p.h204
-rw-r--r--src/script/parser/qscriptlexer.cpp1111
-rw-r--r--src/script/parser/qscriptlexer_p.h242
-rw-r--r--src/script/parser/qscriptparser.cpp1158
-rw-r--r--src/script/parser/qscriptparser_p.h163
-rw-r--r--src/script/parser/qscriptsyntaxchecker.cpp214
-rw-r--r--src/script/parser/qscriptsyntaxchecker_p.h114
-rw-r--r--src/script/qscript.g2120
-rw-r--r--src/script/qscriptable.cpp195
-rw-r--r--src/script/qscriptable.h89
-rw-r--r--src/script/qscriptable_p.h84
-rw-r--r--src/script/qscriptarray_p.h428
-rw-r--r--src/script/qscriptasm.cpp108
-rw-r--r--src/script/qscriptasm_p.h183
-rw-r--r--src/script/qscriptast.cpp789
-rw-r--r--src/script/qscriptast_p.h1502
-rw-r--r--src/script/qscriptbuffer_p.h206
-rw-r--r--src/script/qscriptclass.cpp684
-rw-r--r--src/script/qscriptclass.h121
-rw-r--r--src/script/qscriptclass_p.h91
-rw-r--r--src/script/qscriptclassdata.cpp117
-rw-r--r--src/script/qscriptclassdata_p.h119
-rw-r--r--src/script/qscriptclassinfo_p.h122
-rw-r--r--src/script/qscriptclasspropertyiterator.cpp225
-rw-r--r--src/script/qscriptclasspropertyiterator.h96
-rw-r--r--src/script/qscriptclasspropertyiterator_p.h81
-rw-r--r--src/script/qscriptcompiler.cpp2111
-rw-r--r--src/script/qscriptcompiler_p.h377
-rw-r--r--src/script/qscriptcontext.cpp571
-rw-r--r--src/script/qscriptcontext.h125
-rw-r--r--src/script/qscriptcontext_p.cpp2598
-rw-r--r--src/script/qscriptcontext_p.h361
-rw-r--r--src/script/qscriptcontextfwd_p.h257
-rw-r--r--src/script/qscriptcontextinfo.cpp553
-rw-r--r--src/script/qscriptcontextinfo.h125
-rw-r--r--src/script/qscriptcontextinfo_p.h99
-rw-r--r--src/script/qscriptecmaarray.cpp777
-rw-r--r--src/script/qscriptecmaarray_p.h141
-rw-r--r--src/script/qscriptecmaboolean.cpp137
-rw-r--r--src/script/qscriptecmaboolean_p.h89
-rw-r--r--src/script/qscriptecmacore.cpp120
-rw-r--r--src/script/qscriptecmacore_p.h115
-rw-r--r--src/script/qscriptecmadate.cpp1281
-rw-r--r--src/script/qscriptecmadate_p.h234
-rw-r--r--src/script/qscriptecmaerror.cpp368
-rw-r--r--src/script/qscriptecmaerror_p.h121
-rw-r--r--src/script/qscriptecmafunction.cpp459
-rw-r--r--src/script/qscriptecmafunction_p.h105
-rw-r--r--src/script/qscriptecmaglobal.cpp572
-rw-r--r--src/script/qscriptecmaglobal_p.h141
-rw-r--r--src/script/qscriptecmamath.cpp391
-rw-r--r--src/script/qscriptecmamath_p.h158
-rw-r--r--src/script/qscriptecmanumber.cpp268
-rw-r--r--src/script/qscriptecmanumber_p.h89
-rw-r--r--src/script/qscriptecmaobject.cpp238
-rw-r--r--src/script/qscriptecmaobject_p.h109
-rw-r--r--src/script/qscriptecmaregexp.cpp339
-rw-r--r--src/script/qscriptecmaregexp_p.h142
-rw-r--r--src/script/qscriptecmastring.cpp778
-rw-r--r--src/script/qscriptecmastring_p.h128
-rw-r--r--src/script/qscriptengine.cpp1880
-rw-r--r--src/script/qscriptengine.h481
-rw-r--r--src/script/qscriptengine_p.cpp2724
-rw-r--r--src/script/qscriptengine_p.h828
-rw-r--r--src/script/qscriptengineagent.cpp444
-rw-r--r--src/script/qscriptengineagent.h112
-rw-r--r--src/script/qscriptengineagent_p.h81
-rw-r--r--src/script/qscriptenginefwd_p.h559
-rw-r--r--src/script/qscriptextensioninterface.h73
-rw-r--r--src/script/qscriptextensionplugin.cpp147
-rw-r--r--src/script/qscriptextensionplugin.h79
-rw-r--r--src/script/qscriptextenumeration.cpp209
-rw-r--r--src/script/qscriptextenumeration_p.h126
-rw-r--r--src/script/qscriptextqobject.cpp2209
-rw-r--r--src/script/qscriptextqobject_p.h447
-rw-r--r--src/script/qscriptextvariant.cpp169
-rw-r--r--src/script/qscriptextvariant_p.h106
-rw-r--r--src/script/qscriptfunction.cpp171
-rw-r--r--src/script/qscriptfunction_p.h219
-rw-r--r--src/script/qscriptgc_p.h317
-rw-r--r--src/script/qscriptglobals_p.h104
-rw-r--r--src/script/qscriptgrammar.cpp975
-rw-r--r--src/script/qscriptgrammar_p.h208
-rw-r--r--src/script/qscriptlexer.cpp1122
-rw-r--r--src/script/qscriptlexer_p.h246
-rw-r--r--src/script/qscriptmember_p.h191
-rw-r--r--src/script/qscriptmemberfwd_p.h126
-rw-r--r--src/script/qscriptmemorypool_p.h130
-rw-r--r--src/script/qscriptnameid_p.h77
-rw-r--r--src/script/qscriptnodepool_p.h139
-rw-r--r--src/script/qscriptobject_p.h188
-rw-r--r--src/script/qscriptobjectdata_p.h81
-rw-r--r--src/script/qscriptobjectfwd_p.h112
-rw-r--r--src/script/qscriptparser.cpp1172
-rw-r--r--src/script/qscriptparser_p.h167
-rw-r--r--src/script/qscriptprettypretty.cpp1334
-rw-r--r--src/script/qscriptprettypretty_p.h329
-rw-r--r--src/script/qscriptrepository_p.h91
-rw-r--r--src/script/qscriptstring.cpp227
-rw-r--r--src/script/qscriptstring.h86
-rw-r--r--src/script/qscriptstring_p.h86
-rw-r--r--src/script/qscriptsyntaxchecker.cpp218
-rw-r--r--src/script/qscriptsyntaxchecker_p.h118
-rw-r--r--src/script/qscriptsyntaxcheckresult_p.h80
-rw-r--r--src/script/qscriptvalue.cpp1595
-rw-r--r--src/script/qscriptvalue.h238
-rw-r--r--src/script/qscriptvalue_p.h108
-rw-r--r--src/script/qscriptvaluefwd_p.h89
-rw-r--r--src/script/qscriptvalueimpl.cpp448
-rw-r--r--src/script/qscriptvalueimpl_p.h786
-rw-r--r--src/script/qscriptvalueimplfwd_p.h237
-rw-r--r--src/script/qscriptvalueiterator.cpp328
-rw-r--r--src/script/qscriptvalueiterator.h99
-rw-r--r--src/script/qscriptvalueiterator_p.h75
-rw-r--r--src/script/qscriptvalueiteratorimpl.cpp415
-rw-r--r--src/script/qscriptvalueiteratorimpl_p.h127
-rw-r--r--src/script/qscriptxmlgenerator.cpp1118
-rw-r--r--src/script/qscriptxmlgenerator_p.h330
-rw-r--r--src/script/script.pri128
-rw-r--r--src/script/script.pro66
-rw-r--r--src/script/utils/qscriptdate.cpp383
-rw-r--r--src/script/utils/qscriptdate_p.h70
-rw-r--r--src/script/utils/utils.pri5
-rw-r--r--src/scripttools/debugging/debugging.pri6
-rw-r--r--src/scripttools/debugging/qscriptbreakpointdata.cpp5
-rw-r--r--src/scripttools/debugging/qscriptbreakpointdata_p.h4
-rw-r--r--src/scripttools/debugging/qscriptcompletiontask.cpp217
-rw-r--r--src/scripttools/debugging/qscriptcompletiontask_p.h9
-rw-r--r--src/scripttools/debugging/qscriptdebugger.cpp262
-rw-r--r--src/scripttools/debugging/qscriptdebugger_p.h41
-rw-r--r--src/scripttools/debugging/qscriptdebuggeragent.cpp3
-rw-r--r--src/scripttools/debugging/qscriptdebuggeragent_p.h1
-rw-r--r--src/scripttools/debugging/qscriptdebuggeragent_p_p.h4
-rw-r--r--src/scripttools/debugging/qscriptdebuggerbackend.cpp46
-rw-r--r--src/scripttools/debugging/qscriptdebuggerbackend_p.h2
-rw-r--r--src/scripttools/debugging/qscriptdebuggerbackend_p_p.h6
-rw-r--r--src/scripttools/debugging/qscriptdebuggercodeview.cpp3
-rw-r--r--src/scripttools/debugging/qscriptdebuggercodewidget.cpp13
-rw-r--r--src/scripttools/debugging/qscriptdebuggercommand.cpp25
-rw-r--r--src/scripttools/debugging/qscriptdebuggercommand_p.h9
-rw-r--r--src/scripttools/debugging/qscriptdebuggercommandexecutor.cpp109
-rw-r--r--src/scripttools/debugging/qscriptdebuggercommandexecutor_p.h3
-rw-r--r--src/scripttools/debugging/qscriptdebuggercommandschedulerfrontend.cpp11
-rw-r--r--src/scripttools/debugging/qscriptdebuggercommandschedulerfrontend_p.h3
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsole.cpp5
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsole_p.h3
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsolecommand.cpp1
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsolecommand_p.h4
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsolecommandgroupdata.cpp14
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsolecommandgroupdata_p.h4
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsolecommandmanager.cpp1
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsolecommandmanager_p.h4
-rw-r--r--src/scripttools/debugging/qscriptdebuggerconsoleglobalobject.cpp3
-rw-r--r--src/scripttools/debugging/qscriptdebuggerevent.cpp5
-rw-r--r--src/scripttools/debugging/qscriptdebuggerevent_p.h3
-rw-r--r--src/scripttools/debugging/qscriptdebuggerfrontend.cpp1
-rw-r--r--src/scripttools/debugging/qscriptdebuggerfrontend_p.h4
-rw-r--r--src/scripttools/debugging/qscriptdebuggerjob.cpp1
-rw-r--r--src/scripttools/debugging/qscriptdebuggerjob_p.h3
-rw-r--r--src/scripttools/debugging/qscriptdebuggerlocalsmodel.cpp18
-rw-r--r--src/scripttools/debugging/qscriptdebuggerobjectsnapshotdelta_p.h5
-rw-r--r--src/scripttools/debugging/qscriptdebuggerresponse.cpp5
-rw-r--r--src/scripttools/debugging/qscriptdebuggerresponse_p.h4
-rw-r--r--src/scripttools/debugging/qscriptdebuggerscriptedconsolecommand.cpp18
-rw-r--r--src/scripttools/debugging/qscriptdebuggerstackmodel.cpp11
-rw-r--r--src/scripttools/debugging/qscriptdebuggerstandardwidgetfactory.cpp109
-rw-r--r--src/scripttools/debugging/qscriptdebuggerstandardwidgetfactory_p.h85
-rw-r--r--src/scripttools/debugging/qscriptdebuggervalue.cpp16
-rw-r--r--src/scripttools/debugging/qscriptdebuggervalue_p.h4
-rw-r--r--src/scripttools/debugging/qscriptdebuggervalueproperty.cpp31
-rw-r--r--src/scripttools/debugging/qscriptdebuggervalueproperty_p.h3
-rw-r--r--src/scripttools/debugging/qscriptdebuggerwidgetfactoryinterface_p.h10
-rw-r--r--src/scripttools/debugging/qscriptedit.cpp18
-rw-r--r--src/scripttools/debugging/qscriptedit_p.h1
-rw-r--r--src/scripttools/debugging/qscriptenginedebugger.cpp220
-rw-r--r--src/scripttools/debugging/qscriptenginedebugger.h7
-rw-r--r--src/scripttools/debugging/qscriptenginedebuggerfrontend.cpp2
-rw-r--r--src/scripttools/debugging/qscriptscriptdata.cpp20
-rw-r--r--src/scripttools/debugging/qscriptscriptdata_p.h4
-rw-r--r--src/scripttools/debugging/qscriptstdmessagehandler.cpp14
-rw-r--r--src/scripttools/debugging/qscriptstdmessagehandler_p.h4
-rw-r--r--src/scripttools/debugging/qscripttooltipproviderinterface_p.h5
-rw-r--r--src/scripttools/debugging/qscriptvalueproperty.cpp14
-rw-r--r--src/scripttools/debugging/qscriptvalueproperty_p.h3
-rw-r--r--src/scripttools/scripttools.pro3
-rw-r--r--src/sql/drivers/db2/qsql_db2.cpp134
-rw-r--r--src/sql/drivers/ibase/qsql_ibase.cpp58
-rw-r--r--src/sql/drivers/mysql/qsql_mysql.cpp147
-rw-r--r--src/sql/drivers/mysql/qsql_mysql.h4
-rw-r--r--src/sql/drivers/oci/qsql_oci.cpp373
-rw-r--r--src/sql/drivers/odbc/qsql_odbc.cpp262
-rw-r--r--src/sql/drivers/odbc/qsql_odbc.h4
-rw-r--r--src/sql/drivers/psql/qsql_psql.cpp85
-rw-r--r--src/sql/drivers/sqlite/qsql_sqlite.cpp57
-rw-r--r--src/sql/drivers/sqlite2/qsql_sqlite2.cpp35
-rw-r--r--src/sql/drivers/tds/qsql_tds.cpp27
-rw-r--r--src/sql/kernel/qsql.qdoc139
-rw-r--r--src/sql/kernel/qsqlcachedresult.cpp13
-rw-r--r--src/sql/kernel/qsqlcachedresult_p.h1
-rw-r--r--src/sql/kernel/qsqldatabase.cpp65
-rw-r--r--src/sql/kernel/qsqldatabase.h2
-rw-r--r--src/sql/kernel/qsqldriver.cpp172
-rw-r--r--src/sql/kernel/qsqldriver.h9
-rw-r--r--src/sql/kernel/qsqlerror.cpp2
-rw-r--r--src/sql/kernel/qsqlfield.cpp4
-rw-r--r--src/sql/kernel/qsqlquery.cpp25
-rw-r--r--src/sql/kernel/qsqlrecord.cpp2
-rw-r--r--src/sql/kernel/qsqlresult.cpp19
-rw-r--r--src/sql/kernel/qsqlresult.h1
-rw-r--r--src/sql/models/qsqlrelationaltablemodel.cpp73
-rw-r--r--src/sql/models/qsqltablemodel.cpp20
-rw-r--r--src/sql/sql.pro7
-rw-r--r--src/src.pro25
-rw-r--r--src/svg/qgraphicssvgitem.cpp3
-rw-r--r--src/svg/qgraphicssvgitem.h7
-rw-r--r--src/svg/qsvggenerator.cpp83
-rw-r--r--src/svg/qsvggenerator.h3
-rw-r--r--src/svg/qsvggraphics.cpp379
-rw-r--r--src/svg/qsvggraphics_p.h53
-rw-r--r--src/svg/qsvghandler.cpp1744
-rw-r--r--src/svg/qsvgnode.cpp6
-rw-r--r--src/svg/qsvgnode_p.h1
-rw-r--r--src/svg/qsvgrenderer.cpp2
-rw-r--r--src/svg/qsvgstructure.cpp98
-rw-r--r--src/svg/qsvgstyle.cpp448
-rw-r--r--src/svg/qsvgstyle_p.h329
-rw-r--r--src/svg/qsvgtinydocument.cpp30
-rw-r--r--src/svg/qsvgwidget.cpp2
-rw-r--r--src/svg/svg.pro4
-rw-r--r--src/testlib/3rdparty/cycle_p.h19
-rw-r--r--src/testlib/qabstracttestlogger.cpp50
-rw-r--r--src/testlib/qabstracttestlogger_p.h68
-rw-r--r--src/testlib/qbenchmark.cpp30
-rw-r--r--src/testlib/qbenchmark.h9
-rw-r--r--src/testlib/qbenchmark_p.h5
-rw-r--r--src/testlib/qbenchmarkvalgrind.cpp15
-rw-r--r--src/testlib/qplaintestlogger.cpp70
-rw-r--r--src/testlib/qsignaldumper.cpp10
-rw-r--r--src/testlib/qsignalspy.qdoc (renamed from doc/src/qsignalspy.qdoc)0
-rw-r--r--src/testlib/qtest.h32
-rw-r--r--src/testlib/qtest_global.h5
-rw-r--r--src/testlib/qtest_gui.h1
-rw-r--r--src/testlib/qtestbasicstreamer.cpp219
-rw-r--r--src/testlib/qtestbasicstreamer.h91
-rw-r--r--src/testlib/qtestcase.cpp427
-rw-r--r--src/testlib/qtestcase.h37
-rw-r--r--src/testlib/qtestcoreelement.h172
-rw-r--r--src/testlib/qtestcorelist.h136
-rw-r--r--src/testlib/qtestelement.cpp88
-rw-r--r--src/testlib/qtestelement.h75
-rw-r--r--src/testlib/qtestelementattribute.cpp177
-rw-r--r--src/testlib/qtestelementattribute.h111
-rw-r--r--src/testlib/qtestevent.h5
-rw-r--r--src/testlib/qtestevent.qdoc (renamed from doc/src/qtestevent.qdoc)0
-rw-r--r--src/testlib/qtestfilelogger.cpp104
-rw-r--r--src/testlib/qtestfilelogger.h67
-rw-r--r--src/testlib/qtestkeyboard.h2
-rw-r--r--src/testlib/qtestlightxmlstreamer.cpp178
-rw-r--r--src/testlib/qtestlightxmlstreamer.h72
-rw-r--r--src/testlib/qtestlog.cpp39
-rw-r--r--src/testlib/qtestlog_p.h5
-rw-r--r--src/testlib/qtestlogger.cpp403
-rw-r--r--src/testlib/qtestlogger_p.h127
-rw-r--r--src/testlib/qtestmouse.h2
-rw-r--r--src/testlib/qtestresult.cpp2
-rw-r--r--src/testlib/qtesttouch.h153
-rw-r--r--src/testlib/qtestxmlstreamer.cpp209
-rw-r--r--src/testlib/qtestxmlstreamer.h72
-rw-r--r--src/testlib/qtestxunitstreamer.cpp209
-rw-r--r--src/testlib/qtestxunitstreamer.h77
-rw-r--r--src/testlib/qxmltestlogger.cpp283
-rw-r--r--src/testlib/qxmltestlogger_p.h5
-rw-r--r--src/testlib/testlib.pro85
-rw-r--r--src/tools/bootstrap/bootstrap.pri20
-rw-r--r--src/tools/bootstrap/bootstrap.pro4
-rw-r--r--src/tools/idc/main.cpp78
-rw-r--r--src/tools/moc/generator.cpp111
-rw-r--r--src/tools/moc/main.cpp14
-rw-r--r--src/tools/moc/moc.cpp60
-rw-r--r--src/tools/moc/moc.h7
-rw-r--r--src/tools/moc/outputrevision.h2
-rw-r--r--src/tools/moc/preprocessor.cpp2
-rw-r--r--src/tools/rcc/rcc.cpp4
-rw-r--r--src/tools/uic/cpp/cppwriteicondata.cpp4
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.cpp28
-rw-r--r--src/tools/uic/main.cpp15
-rw-r--r--src/tools/uic/ui4.cpp245
-rw-r--r--src/tools/uic/ui4.h97
-rw-r--r--src/tools/uic/uic.cpp10
-rw-r--r--src/tools/uic3/converter.cpp17
-rw-r--r--src/tools/uic3/embed.cpp2
-rw-r--r--src/tools/uic3/form.cpp84
-rw-r--r--src/tools/uic3/main.cpp8
-rw-r--r--src/tools/uic3/parser.cpp12
-rw-r--r--src/tools/uic3/qt3to4.cpp2
-rw-r--r--src/tools/uic3/subclassing.cpp36
-rw-r--r--src/tools/uic3/ui3reader.cpp24
-rw-r--r--src/tools/uic3/uic.cpp4
-rw-r--r--src/winmain/qtmain_win.cpp20
-rw-r--r--src/xml/dom/qdom.cpp111
-rw-r--r--src/xml/sax/qxml.cpp188
-rw-r--r--src/xml/sax/qxml.h6
-rw-r--r--src/xml/xml.pro2
-rw-r--r--src/xmlpatterns/Doxyfile2
-rw-r--r--src/xmlpatterns/acceltree/qacceltree.cpp57
-rw-r--r--src/xmlpatterns/acceltree/qacceltree_p.h17
-rw-r--r--src/xmlpatterns/acceltree/qacceltreebuilder.cpp31
-rw-r--r--src/xmlpatterns/acceltree/qacceltreebuilder_p.h19
-rw-r--r--src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp62
-rw-r--r--src/xmlpatterns/acceltree/qacceltreeresourceloader_p.h27
-rw-r--r--src/xmlpatterns/api/api.pri11
-rw-r--r--src/xmlpatterns/api/qabstractxmlforwarditerator_p.h15
-rw-r--r--src/xmlpatterns/api/qabstractxmlnodemodel.cpp20
-rw-r--r--src/xmlpatterns/api/qabstractxmlnodemodel.h8
-rw-r--r--src/xmlpatterns/api/qabstractxmlnodemodel_p.h10
-rw-r--r--src/xmlpatterns/api/qabstractxmlpullprovider.cpp177
-rw-r--r--src/xmlpatterns/api/qabstractxmlpullprovider_p.h113
-rw-r--r--src/xmlpatterns/api/qabstractxmlreceiver.cpp1
-rw-r--r--src/xmlpatterns/api/qabstractxmlreceiver.h3
-rw-r--r--src/xmlpatterns/api/qpullbridge.cpp232
-rw-r--r--src/xmlpatterns/api/qpullbridge_p.h103
-rw-r--r--src/xmlpatterns/api/qresourcedelegator.cpp8
-rw-r--r--src/xmlpatterns/api/qsourcelocation.cpp2
-rw-r--r--src/xmlpatterns/api/qxmlnamepool.cpp4
-rw-r--r--src/xmlpatterns/api/qxmlnamepool.h7
-rw-r--r--src/xmlpatterns/api/qxmlquery.cpp41
-rw-r--r--src/xmlpatterns/api/qxmlquery.h12
-rw-r--r--src/xmlpatterns/api/qxmlquery_p.h37
-rw-r--r--src/xmlpatterns/api/qxmlresultitems.cpp1
-rw-r--r--src/xmlpatterns/api/qxmlresultitems.h3
-rw-r--r--src/xmlpatterns/api/qxmlschema.cpp299
-rw-r--r--src/xmlpatterns/api/qxmlschema.h97
-rw-r--r--src/xmlpatterns/api/qxmlschema_p.cpp203
-rw-r--r--src/xmlpatterns/api/qxmlschema_p.h109
-rw-r--r--src/xmlpatterns/api/qxmlschemavalidator.cpp344
-rw-r--r--src/xmlpatterns/api/qxmlschemavalidator.h97
-rw-r--r--src/xmlpatterns/api/qxmlschemavalidator_p.h131
-rw-r--r--src/xmlpatterns/common.pri1
-rw-r--r--src/xmlpatterns/data/data.pri20
-rw-r--r--src/xmlpatterns/data/qabstractfloat.cpp2
-rw-r--r--src/xmlpatterns/data/qabstractfloatcasters.cpp7
-rw-r--r--src/xmlpatterns/data/qatomicvalue.cpp22
-rw-r--r--src/xmlpatterns/data/qcommonvalues.cpp2
-rw-r--r--src/xmlpatterns/data/qcomparisonfactory.cpp154
-rw-r--r--src/xmlpatterns/data/qcomparisonfactory_p.h121
-rw-r--r--src/xmlpatterns/data/qitem_p.h6
-rw-r--r--src/xmlpatterns/data/qresourceloader_p.h2
-rw-r--r--src/xmlpatterns/data/qschemanumeric.cpp3
-rw-r--r--src/xmlpatterns/data/qvaluefactory.cpp106
-rw-r--r--src/xmlpatterns/data/qvaluefactory_p.h98
-rw-r--r--src/xmlpatterns/environment/createReportContext.xsl7
-rw-r--r--src/xmlpatterns/environment/qreportcontext.cpp1
-rw-r--r--src/xmlpatterns/environment/qreportcontext_p.h4
-rw-r--r--src/xmlpatterns/expr/qcastingplatform.cpp22
-rw-r--r--src/xmlpatterns/expr/qcastingplatform_p.h23
-rw-r--r--src/xmlpatterns/expr/qexpression_p.h2
-rw-r--r--src/xmlpatterns/expr/qexpressionfactory.cpp27
-rw-r--r--src/xmlpatterns/functions/qcomparingaggregator.cpp5
-rw-r--r--src/xmlpatterns/functions/qpatternplatform.cpp23
-rw-r--r--src/xmlpatterns/functions/qpatternplatform_p.h18
-rw-r--r--src/xmlpatterns/functions/qsequencefns_p.h11
-rw-r--r--src/xmlpatterns/functions/qsequencegeneratingfns.cpp13
-rw-r--r--src/xmlpatterns/iterators/qcachingiterator_p.h2
-rwxr-xr-xsrc/xmlpatterns/parser/createTokenLookup.sh46
-rw-r--r--src/xmlpatterns/parser/qmaintainingreader.cpp7
-rw-r--r--src/xmlpatterns/parser/qmaintainingreader_p.h1
-rw-r--r--src/xmlpatterns/parser/qquerytransformparser.cpp944
-rw-r--r--src/xmlpatterns/parser/qquerytransformparser_p.h31
-rw-r--r--src/xmlpatterns/parser/qtokenlookup.cpp246
-rw-r--r--src/xmlpatterns/parser/querytransformparser.ypp176
-rw-r--r--src/xmlpatterns/parser/winCEWorkaround.sed12
-rw-r--r--src/xmlpatterns/query.pri2
-rw-r--r--src/xmlpatterns/schema/.gitignore1
-rw-r--r--src/xmlpatterns/schema/builtinschemas.qrc5
-rw-r--r--src/xmlpatterns/schema/doc/All_diagram.dot13
-rw-r--r--src/xmlpatterns/schema/doc/Alternative_diagram.dot11
-rw-r--r--src/xmlpatterns/schema/doc/Annotation_diagram.dot9
-rw-r--r--src/xmlpatterns/schema/doc/AnyAttribute_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Any_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Assert_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Choice_diagram.dot22
-rw-r--r--src/xmlpatterns/schema/doc/ComplexContentExtension_diagram.dot47
-rw-r--r--src/xmlpatterns/schema/doc/ComplexContentRestriction_diagram.dot47
-rw-r--r--src/xmlpatterns/schema/doc/ComplexContent_diagram.dot11
-rw-r--r--src/xmlpatterns/schema/doc/DefaultOpenContent_diagram.dot9
-rw-r--r--src/xmlpatterns/schema/doc/EnumerationFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Field_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/FractionDigitsFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/GlobalAttribute_diagram.dot9
-rw-r--r--src/xmlpatterns/schema/doc/GlobalComplexType_diagram.dot52
-rw-r--r--src/xmlpatterns/schema/doc/GlobalElement_diagram.dot32
-rw-r--r--src/xmlpatterns/schema/doc/GlobalSimpleType_diagram.dot13
-rw-r--r--src/xmlpatterns/schema/doc/Import_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Include_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/KeyRef_diagram.dot12
-rw-r--r--src/xmlpatterns/schema/doc/Key_diagram.dot12
-rw-r--r--src/xmlpatterns/schema/doc/LengthFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/List_diagram.dot9
-rw-r--r--src/xmlpatterns/schema/doc/LocalAll_diagram.dot13
-rw-r--r--src/xmlpatterns/schema/doc/LocalAttribute_diagram.dot9
-rw-r--r--src/xmlpatterns/schema/doc/LocalChoice_diagram.dot22
-rw-r--r--src/xmlpatterns/schema/doc/LocalComplexType_diagram.dot52
-rw-r--r--src/xmlpatterns/schema/doc/LocalElement_diagram.dot32
-rw-r--r--src/xmlpatterns/schema/doc/LocalSequence_diagram.dot22
-rw-r--r--src/xmlpatterns/schema/doc/LocalSimpleType_diagram.dot13
-rw-r--r--src/xmlpatterns/schema/doc/MaxExclusiveFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/MaxInclusiveFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/MaxLengthFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/MinExclusiveFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/MinInclusiveFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/MinLengthFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/NamedAttributeGroup_diagram.dot17
-rw-r--r--src/xmlpatterns/schema/doc/NamedGroup_diagram.dot13
-rw-r--r--src/xmlpatterns/schema/doc/Notation_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Override_diagram.dot21
-rw-r--r--src/xmlpatterns/schema/doc/PatternFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Redefine_diagram.dot15
-rw-r--r--src/xmlpatterns/schema/doc/ReferredAttributeGroup_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/ReferredGroup_diagram.dot13
-rw-r--r--src/xmlpatterns/schema/doc/Schema_diagram.dot66
-rw-r--r--src/xmlpatterns/schema/doc/Selector_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Sequence_diagram.dot22
-rw-r--r--src/xmlpatterns/schema/doc/SimpleContentExtension_diagram.dot23
-rw-r--r--src/xmlpatterns/schema/doc/SimpleContentRestriction_diagram.dot87
-rw-r--r--src/xmlpatterns/schema/doc/SimpleContent_diagram.dot11
-rw-r--r--src/xmlpatterns/schema/doc/SimpleRestriction_diagram.dot62
-rw-r--r--src/xmlpatterns/schema/doc/TotalDigitsFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/Union_diagram.dot10
-rw-r--r--src/xmlpatterns/schema/doc/Unique_diagram.dot12
-rw-r--r--src/xmlpatterns/schema/doc/WhiteSpaceFacet_diagram.dot6
-rw-r--r--src/xmlpatterns/schema/doc/legend.dot7
-rw-r--r--src/xmlpatterns/schema/qnamespacesupport.cpp160
-rw-r--r--src/xmlpatterns/schema/qnamespacesupport_p.h173
-rw-r--r--src/xmlpatterns/schema/qxsdalternative.cpp68
-rw-r--r--src/xmlpatterns/schema/qxsdalternative_p.h114
-rw-r--r--src/xmlpatterns/schema/qxsdannotated.cpp63
-rw-r--r--src/xmlpatterns/schema/qxsdannotated_p.h96
-rw-r--r--src/xmlpatterns/schema/qxsdannotation.cpp78
-rw-r--r--src/xmlpatterns/schema/qxsdannotation_p.h127
-rw-r--r--src/xmlpatterns/schema/qxsdapplicationinformation.cpp68
-rw-r--r--src/xmlpatterns/schema/qxsdapplicationinformation_p.h115
-rw-r--r--src/xmlpatterns/schema/qxsdassertion.cpp58
-rw-r--r--src/xmlpatterns/schema/qxsdassertion_p.h101
-rw-r--r--src/xmlpatterns/schema/qxsdattribute.cpp130
-rw-r--r--src/xmlpatterns/schema/qxsdattribute_p.h246
-rw-r--r--src/xmlpatterns/schema/qxsdattributegroup.cpp73
-rw-r--r--src/xmlpatterns/schema/qxsdattributegroup_p.h122
-rw-r--r--src/xmlpatterns/schema/qxsdattributereference.cpp88
-rw-r--r--src/xmlpatterns/schema/qxsdattributereference_p.h147
-rw-r--r--src/xmlpatterns/schema/qxsdattributeterm.cpp58
-rw-r--r--src/xmlpatterns/schema/qxsdattributeterm_p.h96
-rw-r--r--src/xmlpatterns/schema/qxsdattributeuse.cpp136
-rw-r--r--src/xmlpatterns/schema/qxsdattributeuse_p.h224
-rw-r--r--src/xmlpatterns/schema/qxsdcomplextype.cpp231
-rw-r--r--src/xmlpatterns/schema/qxsdcomplextype_p.h404
-rw-r--r--src/xmlpatterns/schema/qxsddocumentation.cpp86
-rw-r--r--src/xmlpatterns/schema/qxsddocumentation_p.h137
-rw-r--r--src/xmlpatterns/schema/qxsdelement.cpp244
-rw-r--r--src/xmlpatterns/schema/qxsdelement_p.h403
-rw-r--r--src/xmlpatterns/schema/qxsdfacet.cpp124
-rw-r--r--src/xmlpatterns/schema/qxsdfacet_p.h213
-rw-r--r--src/xmlpatterns/schema/qxsdidcache.cpp66
-rw-r--r--src/xmlpatterns/schema/qxsdidcache_p.h99
-rw-r--r--src/xmlpatterns/schema/qxsdidchelper.cpp137
-rw-r--r--src/xmlpatterns/schema/qxsdidchelper_p.h186
-rw-r--r--src/xmlpatterns/schema/qxsdidentityconstraint.cpp93
-rw-r--r--src/xmlpatterns/schema/qxsdidentityconstraint_p.h173
-rw-r--r--src/xmlpatterns/schema/qxsdinstancereader.cpp196
-rw-r--r--src/xmlpatterns/schema/qxsdinstancereader_p.h189
-rw-r--r--src/xmlpatterns/schema/qxsdmodelgroup.cpp78
-rw-r--r--src/xmlpatterns/schema/qxsdmodelgroup_p.h139
-rw-r--r--src/xmlpatterns/schema/qxsdnotation.cpp68
-rw-r--r--src/xmlpatterns/schema/qxsdnotation_p.h119
-rw-r--r--src/xmlpatterns/schema/qxsdparticle.cpp95
-rw-r--r--src/xmlpatterns/schema/qxsdparticle_p.h154
-rw-r--r--src/xmlpatterns/schema/qxsdparticlechecker.cpp540
-rw-r--r--src/xmlpatterns/schema/qxsdparticlechecker_p.h99
-rw-r--r--src/xmlpatterns/schema/qxsdreference.cpp83
-rw-r--r--src/xmlpatterns/schema/qxsdreference_p.h145
-rw-r--r--src/xmlpatterns/schema/qxsdschema.cpp272
-rw-r--r--src/xmlpatterns/schema/qxsdschema_p.h301
-rw-r--r--src/xmlpatterns/schema/qxsdschemachecker.cpp2061
-rw-r--r--src/xmlpatterns/schema/qxsdschemachecker_helper.cpp306
-rw-r--r--src/xmlpatterns/schema/qxsdschemachecker_p.h284
-rw-r--r--src/xmlpatterns/schema/qxsdschemachecker_setup.cpp327
-rw-r--r--src/xmlpatterns/schema/qxsdschemacontext.cpp528
-rw-r--r--src/xmlpatterns/schema/qxsdschemacontext_p.h187
-rw-r--r--src/xmlpatterns/schema/qxsdschemadebugger.cpp226
-rw-r--r--src/xmlpatterns/schema/qxsdschemadebugger_p.h127
-rw-r--r--src/xmlpatterns/schema/qxsdschemahelper.cpp821
-rw-r--r--src/xmlpatterns/schema/qxsdschemahelper_p.h217
-rw-r--r--src/xmlpatterns/schema/qxsdschemamerger.cpp157
-rw-r--r--src/xmlpatterns/schema/qxsdschemamerger_p.h99
-rw-r--r--src/xmlpatterns/schema/qxsdschemaparser.cpp6078
-rw-r--r--src/xmlpatterns/schema/qxsdschemaparser_p.h721
-rw-r--r--src/xmlpatterns/schema/qxsdschemaparser_setup.cpp1110
-rw-r--r--src/xmlpatterns/schema/qxsdschemaparsercontext.cpp603
-rw-r--r--src/xmlpatterns/schema/qxsdschemaparsercontext_p.h231
-rw-r--r--src/xmlpatterns/schema/qxsdschemaresolver.cpp1736
-rw-r--r--src/xmlpatterns/schema/qxsdschemaresolver_p.h578
-rw-r--r--src/xmlpatterns/schema/qxsdschematoken.cpp2981
-rw-r--r--src/xmlpatterns/schema/qxsdschematoken_p.h209
-rw-r--r--src/xmlpatterns/schema/qxsdschematypesfactory.cpp126
-rw-r--r--src/xmlpatterns/schema/qxsdschematypesfactory_p.h109
-rw-r--r--src/xmlpatterns/schema/qxsdsimpletype.cpp148
-rw-r--r--src/xmlpatterns/schema/qxsdsimpletype_p.h219
-rw-r--r--src/xmlpatterns/schema/qxsdstatemachine.cpp477
-rw-r--r--src/xmlpatterns/schema/qxsdstatemachine_p.h245
-rw-r--r--src/xmlpatterns/schema/qxsdstatemachinebuilder.cpp260
-rw-r--r--src/xmlpatterns/schema/qxsdstatemachinebuilder_p.h141
-rw-r--r--src/xmlpatterns/schema/qxsdterm.cpp68
-rw-r--r--src/xmlpatterns/schema/qxsdterm_p.h114
-rw-r--r--src/xmlpatterns/schema/qxsdtypechecker.cpp1338
-rw-r--r--src/xmlpatterns/schema/qxsdtypechecker_p.h189
-rw-r--r--src/xmlpatterns/schema/qxsduserschematype.cpp75
-rw-r--r--src/xmlpatterns/schema/qxsduserschematype_p.h124
-rw-r--r--src/xmlpatterns/schema/qxsdvalidatedxmlnodemodel.cpp215
-rw-r--r--src/xmlpatterns/schema/qxsdvalidatedxmlnodemodel_p.h179
-rw-r--r--src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp1276
-rw-r--r--src/xmlpatterns/schema/qxsdvalidatinginstancereader_p.h296
-rw-r--r--src/xmlpatterns/schema/qxsdwildcard.cpp115
-rw-r--r--src/xmlpatterns/schema/qxsdwildcard_p.h199
-rw-r--r--src/xmlpatterns/schema/qxsdxpathexpression.cpp88
-rw-r--r--src/xmlpatterns/schema/qxsdxpathexpression_p.h143
-rw-r--r--src/xmlpatterns/schema/schema.pri93
-rw-r--r--src/xmlpatterns/schema/schemas/xml.xsd145
-rw-r--r--src/xmlpatterns/schema/schemas/xml.xsd-LICENSE40
-rw-r--r--src/xmlpatterns/schema/tokens.xml155
-rw-r--r--src/xmlpatterns/type/qanysimpletype.cpp10
-rw-r--r--src/xmlpatterns/type/qanysimpletype_p.h12
-rw-r--r--src/xmlpatterns/type/qanytype.cpp12
-rw-r--r--src/xmlpatterns/type/qanytype_p.h10
-rw-r--r--src/xmlpatterns/type/qnamedschemacomponent.cpp71
-rw-r--r--src/xmlpatterns/type/qnamedschemacomponent_p.h127
-rw-r--r--src/xmlpatterns/type/qprimitives_p.h15
-rw-r--r--src/xmlpatterns/type/qschematype.cpp5
-rw-r--r--src/xmlpatterns/type/qschematype_p.h30
-rw-r--r--src/xmlpatterns/type/type.pri2
-rw-r--r--src/xmlpatterns/utils/qautoptr.cpp2
-rw-r--r--src/xmlpatterns/utils/qpatternistlocale_p.h13
-rw-r--r--src/xmlpatterns/utils/qxpathhelper.cpp12
-rw-r--r--src/xmlpatterns/utils/qxpathhelper_p.h5
-rw-r--r--src/xmlpatterns/xmlpatterns.pro3
-rw-r--r--tests/arthur/common/paintcommands.cpp7
-rw-r--r--tests/arthur/common/paintcommands.h2
-rw-r--r--tests/arthur/common/qengines.cpp8
-rw-r--r--tests/arthur/common/qengines.h3
-rw-r--r--tests/arthur/data/1.2/textArea01.svg2
-rw-r--r--tests/arthur/data/qps/linear_gradients_perspectives_qps.pngbin78017 -> 77944 bytes-rw-r--r--tests/arthur/data/qps/linear_gradients_qps.pngbin82119 -> 162643 bytes-rw-r--r--tests/arthur/data/qps/lineconsistency_qps.pngbin12500 -> 12388 bytes-rw-r--r--tests/arthur/data/qps/linedashes2_aa_qps.pngbin28956 -> 28418 bytes-rw-r--r--tests/arthur/data/qps/paths_aa_qps.pngbin92711 -> 92147 bytes-rw-r--r--tests/arthur/data/qps/paths_qps.pngbin20637 -> 20392 bytes-rw-r--r--tests/arthur/data/qps/radial_gradients_perspectives_qps.pngbin133150 -> 131744 bytes-rw-r--r--tests/arthur/data/qps/radial_gradients_qps.pngbin156036 -> 161009 bytes-rw-r--r--tests/arthur/data/qps/rasterops.qps167
-rw-r--r--tests/arthur/data/qps/rasterops_qps.pngbin20400 -> 11059 bytes-rw-r--r--tests/arthur/data/qps/text_perspectives_qps.pngbin112750 -> 116847 bytes-rw-r--r--tests/arthur/data/qps/text_qps.pngbin72027 -> 32991 bytes-rw-r--r--tests/arthur/lance/interactivewidget.cpp2
-rw-r--r--tests/arthur/lance/lance.pro10
-rw-r--r--tests/arthur/lance/main.cpp27
-rw-r--r--tests/arthur/lance/widgets.h154
-rw-r--r--tests/auto/auto.pro127
-rw-r--r--tests/auto/bic/bic.pro6
-rw-r--r--tests/auto/bic/data/Qt3Support.4.0.0.aix-gcc-power32.txt1215
-rw-r--r--tests/auto/bic/data/Qt3Support.4.0.0.linux-gcc-amd64.txt1411
-rw-r--r--tests/auto/bic/data/Qt3Support.4.0.0.linux-gcc-ia32.txt1411
-rw-r--r--tests/auto/bic/data/Qt3Support.4.0.0.linux-gcc-ppc32.txt1411
-rw-r--r--tests/auto/bic/data/Qt3Support.4.0.0.macx-gcc-ppc32.txt1391
-rw-r--r--tests/auto/bic/data/Qt3Support.4.1.0.linux-gcc-ia32.txt1503
-rw-r--r--tests/auto/bic/data/Qt3Support.4.1.0.linux-gcc-ppc32.txt1523
-rw-r--r--tests/auto/bic/data/Qt3Support.4.1.0.macx-gcc-ia32.txt1447
-rw-r--r--tests/auto/bic/data/Qt3Support.4.1.0.macx-gcc-ppc32.txt1447
-rw-r--r--tests/auto/bic/data/Qt3Support.4.1.0.win32-gcc-ia32.txt1427
-rw-r--r--tests/auto/bic/data/Qt3Support.4.2.0.linux-gcc-ia32.txt1805
-rw-r--r--tests/auto/bic/data/Qt3Support.4.2.0.linux-gcc-ppc32.txt1801
-rw-r--r--tests/auto/bic/data/Qt3Support.4.2.0.macx-gcc-ia32.txt1743
-rw-r--r--tests/auto/bic/data/Qt3Support.4.2.0.macx-gcc-ppc32.txt1747
-rw-r--r--tests/auto/bic/data/Qt3Support.4.2.0.win32-gcc-ia32.txt1707
-rw-r--r--tests/auto/bic/data/Qt3Support.4.3.0.linux-gcc-ia32.txt1897
-rw-r--r--tests/auto/bic/data/Qt3Support.4.3.1.linux-gcc-ia32.txt1895
-rw-r--r--tests/auto/bic/data/Qt3Support.4.3.2.linux-gcc-ia32.txt1897
-rw-r--r--tests/auto/bic/data/Qt3Support.4.4.0.linux-gcc-ia32.txt3156
-rw-r--r--tests/auto/bic/data/QtCore.4.0.0.aix-gcc-power32.txt399
-rw-r--r--tests/auto/bic/data/QtCore.4.0.0.linux-gcc-amd64.txt432
-rw-r--r--tests/auto/bic/data/QtCore.4.0.0.linux-gcc-ia32.txt432
-rw-r--r--tests/auto/bic/data/QtCore.4.0.0.linux-gcc-ppc32.txt2256
-rw-r--r--tests/auto/bic/data/QtCore.4.0.0.macx-gcc-ppc32.txt412
-rw-r--r--tests/auto/bic/data/QtCore.4.1.0.linux-gcc-ia32.txt496
-rw-r--r--tests/auto/bic/data/QtCore.4.1.0.linux-gcc-ppc32.txt516
-rw-r--r--tests/auto/bic/data/QtCore.4.1.0.macx-gcc-ia32.txt440
-rw-r--r--tests/auto/bic/data/QtCore.4.1.0.macx-gcc-ppc32.txt440
-rw-r--r--tests/auto/bic/data/QtCore.4.1.0.win32-gcc-ia32.txt420
-rw-r--r--tests/auto/bic/data/QtCore.4.2.0.linux-gcc-ia32.txt718
-rw-r--r--tests/auto/bic/data/QtCore.4.2.0.linux-gcc-ppc32.txt714
-rw-r--r--tests/auto/bic/data/QtCore.4.2.0.macx-gcc-ia32.txt638
-rw-r--r--tests/auto/bic/data/QtCore.4.2.0.macx-gcc-ppc32.txt642
-rw-r--r--tests/auto/bic/data/QtCore.4.2.0.win32-gcc-ia32.txt618
-rw-r--r--tests/auto/bic/data/QtCore.4.3.0.linux-gcc-ia32.txt722
-rw-r--r--tests/auto/bic/data/QtCore.4.3.1.linux-gcc-ia32.txt722
-rw-r--r--tests/auto/bic/data/QtCore.4.3.2.linux-gcc-ia32.txt722
-rw-r--r--tests/auto/bic/data/QtCore.4.4.0.linux-gcc-ia32.txt1909
-rw-r--r--tests/auto/bic/data/QtDBus.4.2.0.linux-gcc-ia32.txt490
-rw-r--r--tests/auto/bic/data/QtDBus.4.2.0.linux-gcc-ppc32.txt490
-rw-r--r--tests/auto/bic/data/QtDBus.4.2.0.macx-gcc-ia32.txt490
-rw-r--r--tests/auto/bic/data/QtDBus.4.2.0.macx-gcc-ppc32.txt490
-rw-r--r--tests/auto/bic/data/QtDBus.4.2.0.win32-gcc-ia32.txt490
-rw-r--r--tests/auto/bic/data/QtDBus.4.3.0.linux-gcc-ia32.txt534
-rw-r--r--tests/auto/bic/data/QtDBus.4.3.1.linux-gcc-ia32.txt534
-rw-r--r--tests/auto/bic/data/QtDBus.4.3.2.linux-gcc-ia32.txt534
-rw-r--r--tests/auto/bic/data/QtDBus.4.4.0.linux-gcc-ia32.txt2029
-rw-r--r--tests/auto/bic/data/QtDesigner.4.2.0.linux-gcc-ia32.txt802
-rw-r--r--tests/auto/bic/data/QtDesigner.4.3.0.linux-gcc-ia32.txt838
-rw-r--r--tests/auto/bic/data/QtDesigner.4.3.1.linux-gcc-ia32.txt838
-rw-r--r--tests/auto/bic/data/QtDesigner.4.3.2.linux-gcc-ia32.txt838
-rw-r--r--tests/auto/bic/data/QtDesigner.4.4.0.linux-gcc-ia32.txt2173
-rw-r--r--tests/auto/bic/data/QtGui.4.0.0.aix-gcc-power32.txt720
-rw-r--r--tests/auto/bic/data/QtGui.4.0.0.linux-gcc-amd64.txt860
-rw-r--r--tests/auto/bic/data/QtGui.4.0.0.linux-gcc-ia32.txt860
-rw-r--r--tests/auto/bic/data/QtGui.4.0.0.linux-gcc-ppc32.txt812
-rw-r--r--tests/auto/bic/data/QtGui.4.0.0.macx-gcc-ppc32.txt840
-rw-r--r--tests/auto/bic/data/QtGui.4.1.0.linux-gcc-ia32.txt952
-rw-r--r--tests/auto/bic/data/QtGui.4.1.0.linux-gcc-ppc32.txt972
-rw-r--r--tests/auto/bic/data/QtGui.4.1.0.macx-gcc-ia32.txt896
-rw-r--r--tests/auto/bic/data/QtGui.4.1.0.macx-gcc-ppc32.txt896
-rw-r--r--tests/auto/bic/data/QtGui.4.1.0.win32-gcc-ia32.txt876
-rw-r--r--tests/auto/bic/data/QtGui.4.2.0.linux-gcc-ia32.txt1242
-rw-r--r--tests/auto/bic/data/QtGui.4.2.0.linux-gcc-ppc32.txt1238
-rw-r--r--tests/auto/bic/data/QtGui.4.2.0.macx-gcc-ia32.txt1178
-rw-r--r--tests/auto/bic/data/QtGui.4.2.0.macx-gcc-ppc32.txt1182
-rw-r--r--tests/auto/bic/data/QtGui.4.2.0.win32-gcc-ia32.txt1142
-rw-r--r--tests/auto/bic/data/QtGui.4.3.0.linux-gcc-ia32.txt1314
-rw-r--r--tests/auto/bic/data/QtGui.4.3.1.linux-gcc-ia32.txt1314
-rw-r--r--tests/auto/bic/data/QtGui.4.3.2.linux-gcc-ia32.txt1314
-rw-r--r--tests/auto/bic/data/QtGui.4.4.0.linux-gcc-ia32.txt2519
-rw-r--r--tests/auto/bic/data/QtNetwork.4.0.0.aix-gcc-power32.txt399
-rw-r--r--tests/auto/bic/data/QtNetwork.4.0.0.linux-gcc-amd64.txt432
-rw-r--r--tests/auto/bic/data/QtNetwork.4.0.0.linux-gcc-ia32.txt432
-rw-r--r--tests/auto/bic/data/QtNetwork.4.0.0.linux-gcc-ppc32.txt396
-rw-r--r--tests/auto/bic/data/QtNetwork.4.0.0.macx-gcc-ppc32.txt412
-rw-r--r--tests/auto/bic/data/QtNetwork.4.1.0.linux-gcc-ia32.txt496
-rw-r--r--tests/auto/bic/data/QtNetwork.4.1.0.linux-gcc-ppc32.txt516
-rw-r--r--tests/auto/bic/data/QtNetwork.4.1.0.macx-gcc-ia32.txt440
-rw-r--r--tests/auto/bic/data/QtNetwork.4.1.0.macx-gcc-ppc32.txt440
-rw-r--r--tests/auto/bic/data/QtNetwork.4.1.0.win32-gcc-ia32.txt420
-rw-r--r--tests/auto/bic/data/QtNetwork.4.2.0.linux-gcc-ia32.txt730
-rw-r--r--tests/auto/bic/data/QtNetwork.4.2.0.linux-gcc-ppc32.txt726
-rw-r--r--tests/auto/bic/data/QtNetwork.4.2.0.macx-gcc-ia32.txt650
-rw-r--r--tests/auto/bic/data/QtNetwork.4.2.0.macx-gcc-ppc32.txt654
-rw-r--r--tests/auto/bic/data/QtNetwork.4.2.0.win32-gcc-ia32.txt630
-rw-r--r--tests/auto/bic/data/QtNetwork.4.3.0.linux-gcc-ia32.txt754
-rw-r--r--tests/auto/bic/data/QtNetwork.4.3.1.linux-gcc-ia32.txt754
-rw-r--r--tests/auto/bic/data/QtNetwork.4.3.2.linux-gcc-ia32.txt754
-rw-r--r--tests/auto/bic/data/QtNetwork.4.4.0.linux-gcc-ia32.txt1977
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.0.0.aix-gcc-power32.txt723
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.0.0.linux-gcc-amd64.txt864
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.0.0.linux-gcc-ia32.txt864
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.0.0.linux-gcc-ppc32.txt816
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.0.0.macx-gcc-ppc32.txt844
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.1.0.linux-gcc-ia32.txt956
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.1.0.linux-gcc-ppc32.txt976
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.1.0.macx-gcc-ia32.txt900
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.1.0.macx-gcc-ppc32.txt900
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.1.0.win32-gcc-ia32.txt1372
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.2.0.linux-gcc-ia32.txt1250
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.2.0.linux-gcc-ppc32.txt1246
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.2.0.macx-gcc-ia32.txt1186
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.2.0.macx-gcc-ppc32.txt1190
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.2.0.win32-gcc-ia32.txt1642
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.3.0.linux-gcc-ia32.txt1326
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.3.1.linux-gcc-ia32.txt1326
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.3.2.linux-gcc-ia32.txt1326
-rw-r--r--tests/auto/bic/data/QtOpenGL.4.4.0.linux-gcc-ia32.txt2531
-rw-r--r--tests/auto/bic/data/QtScript.4.3.0.linux-gcc-ia32.txt726
-rw-r--r--tests/auto/bic/data/QtScript.4.3.0.macx-gcc-ia32.txt674
-rw-r--r--tests/auto/bic/data/QtScript.4.4.0.linux-gcc-ia32.txt1941
-rw-r--r--tests/auto/bic/data/QtSql.4.0.0.aix-gcc-power32.txt408
-rw-r--r--tests/auto/bic/data/QtSql.4.0.0.linux-gcc-amd64.txt444
-rw-r--r--tests/auto/bic/data/QtSql.4.0.0.linux-gcc-ia32.txt444
-rw-r--r--tests/auto/bic/data/QtSql.4.0.0.linux-gcc-ppc32.txt408
-rw-r--r--tests/auto/bic/data/QtSql.4.0.0.macx-gcc-ppc32.txt424
-rw-r--r--tests/auto/bic/data/QtSql.4.1.0.linux-gcc-ia32.txt508
-rw-r--r--tests/auto/bic/data/QtSql.4.1.0.linux-gcc-ppc32.txt528
-rw-r--r--tests/auto/bic/data/QtSql.4.1.0.macx-gcc-ia32.txt452
-rw-r--r--tests/auto/bic/data/QtSql.4.1.0.macx-gcc-ppc32.txt452
-rw-r--r--tests/auto/bic/data/QtSql.4.1.0.win32-gcc-ia32.txt432
-rw-r--r--tests/auto/bic/data/QtSql.4.2.0.linux-gcc-ia32.txt730
-rw-r--r--tests/auto/bic/data/QtSql.4.2.0.linux-gcc-ppc32.txt726
-rw-r--r--tests/auto/bic/data/QtSql.4.2.0.macx-gcc-ia32.txt650
-rw-r--r--tests/auto/bic/data/QtSql.4.2.0.macx-gcc-ppc32.txt654
-rw-r--r--tests/auto/bic/data/QtSql.4.2.0.win32-gcc-ia32.txt630
-rw-r--r--tests/auto/bic/data/QtSql.4.3.0.linux-gcc-ia32.txt734
-rw-r--r--tests/auto/bic/data/QtSql.4.3.1.linux-gcc-ia32.txt734
-rw-r--r--tests/auto/bic/data/QtSql.4.3.2.linux-gcc-ia32.txt734
-rw-r--r--tests/auto/bic/data/QtSql.4.4.0.linux-gcc-ia32.txt1921
-rw-r--r--tests/auto/bic/data/QtSvg.4.1.0.linux-gcc-ia32.txt976
-rw-r--r--tests/auto/bic/data/QtSvg.4.1.0.win32-gcc-ia32.txt876
-rw-r--r--tests/auto/bic/data/QtSvg.4.2.0.linux-gcc-ia32.txt1242
-rw-r--r--tests/auto/bic/data/QtSvg.4.2.0.linux-gcc-ppc32.txt1238
-rw-r--r--tests/auto/bic/data/QtSvg.4.2.0.macx-gcc-ia32.txt1178
-rw-r--r--tests/auto/bic/data/QtSvg.4.2.0.macx-gcc-ppc32.txt1182
-rw-r--r--tests/auto/bic/data/QtSvg.4.2.0.win32-gcc-ia32.txt1142
-rw-r--r--tests/auto/bic/data/QtSvg.4.3.0.linux-gcc-ia32.txt1314
-rw-r--r--tests/auto/bic/data/QtSvg.4.3.1.linux-gcc-ia32.txt1314
-rw-r--r--tests/auto/bic/data/QtSvg.4.3.2.linux-gcc-ia32.txt1314
-rw-r--r--tests/auto/bic/data/QtSvg.4.4.0.linux-gcc-ia32.txt2519
-rw-r--r--tests/auto/bic/data/QtTest.4.1.0.linux-gcc-ia32.txt560
-rw-r--r--tests/auto/bic/data/QtTest.4.1.0.win32-gcc-ia32.txt460
-rw-r--r--tests/auto/bic/data/QtTest.4.2.0.linux-gcc-ia32.txt754
-rw-r--r--tests/auto/bic/data/QtTest.4.2.0.linux-gcc-ppc32.txt750
-rw-r--r--tests/auto/bic/data/QtTest.4.2.0.macx-gcc-ia32.txt674
-rw-r--r--tests/auto/bic/data/QtTest.4.2.0.macx-gcc-ppc32.txt678
-rw-r--r--tests/auto/bic/data/QtTest.4.2.0.win32-gcc-ia32.txt654
-rw-r--r--tests/auto/bic/data/QtTest.4.3.0.linux-gcc-ia32.txt758
-rw-r--r--tests/auto/bic/data/QtTest.4.3.1.linux-gcc-ia32.txt758
-rw-r--r--tests/auto/bic/data/QtTest.4.3.2.linux-gcc-ia32.txt758
-rw-r--r--tests/auto/bic/data/QtTest.4.4.0.linux-gcc-ia32.txt1945
-rw-r--r--tests/auto/bic/data/QtXml.4.0.0.aix-gcc-power32.txt411
-rw-r--r--tests/auto/bic/data/QtXml.4.0.0.linux-gcc-amd64.txt448
-rw-r--r--tests/auto/bic/data/QtXml.4.0.0.linux-gcc-ia32.txt448
-rw-r--r--tests/auto/bic/data/QtXml.4.0.0.linux-gcc-ppc32.txt412
-rw-r--r--tests/auto/bic/data/QtXml.4.0.0.macx-gcc-ppc32.txt428
-rw-r--r--tests/auto/bic/data/QtXml.4.1.0.linux-gcc-ia32.txt512
-rw-r--r--tests/auto/bic/data/QtXml.4.1.0.linux-gcc-ppc32.txt532
-rw-r--r--tests/auto/bic/data/QtXml.4.1.0.macx-gcc-ia32.txt456
-rw-r--r--tests/auto/bic/data/QtXml.4.1.0.macx-gcc-ppc32.txt456
-rw-r--r--tests/auto/bic/data/QtXml.4.1.0.win32-gcc-ia32.txt436
-rw-r--r--tests/auto/bic/data/QtXml.4.2.0.linux-gcc-ia32.txt734
-rw-r--r--tests/auto/bic/data/QtXml.4.2.0.linux-gcc-ppc32.txt730
-rw-r--r--tests/auto/bic/data/QtXml.4.2.0.macx-gcc-ia32.txt654
-rw-r--r--tests/auto/bic/data/QtXml.4.2.0.macx-gcc-ppc32.txt658
-rw-r--r--tests/auto/bic/data/QtXml.4.2.0.win32-gcc-ia32.txt634
-rw-r--r--tests/auto/bic/data/QtXml.4.3.0.linux-gcc-ia32.txt762
-rw-r--r--tests/auto/bic/data/QtXml.4.3.1.linux-gcc-ia32.txt762
-rw-r--r--tests/auto/bic/data/QtXml.4.3.2.linux-gcc-ia32.txt762
-rw-r--r--tests/auto/bic/data/QtXml.4.4.0.linux-gcc-ia32.txt1925
-rw-r--r--tests/auto/bic/data/QtXmlPatterns.4.4.0.linux-gcc-ia32.txt2021
-rw-r--r--tests/auto/bic/data/QtXmlPatterns.4.4.1.linux-gcc-ia32.txt2806
-rwxr-xr-xtests/auto/bic/gen.sh4
-rw-r--r--tests/auto/bic/tst_bic.cpp102
-rw-r--r--tests/auto/checkxmlfiles/checkxmlfiles.pro2
-rw-r--r--tests/auto/collections/collections.pro4
-rw-r--r--tests/auto/collections/tst_collections.cpp14
-rw-r--r--tests/auto/compilerwarnings/compilerwarnings.pro1
-rw-r--r--tests/auto/compilerwarnings/tst_compilerwarnings.cpp12
-rw-r--r--tests/auto/exceptionsafety/exceptionsafety.pro2
-rw-r--r--tests/auto/exceptionsafety/tst_exceptionsafety.cpp640
-rw-r--r--tests/auto/exceptionsafety_objects/3rdparty/memcheck.h319
-rw-r--r--tests/auto/exceptionsafety_objects/3rdparty/valgrind.h3924
-rw-r--r--tests/auto/exceptionsafety_objects/exceptionsafety_objects.pro3
-rw-r--r--tests/auto/exceptionsafety_objects/oomsimulator.h357
-rw-r--r--tests/auto/exceptionsafety_objects/tst_exceptionsafety_objects.cpp651
-rw-r--r--tests/auto/headers/headers.pro2
-rw-r--r--tests/auto/headers/tst_headers.cpp90
-rw-r--r--tests/auto/languagechange/tst_languagechange.cpp25
-rw-r--r--tests/auto/linguist/lconvert/.gitignore2
-rw-r--r--tests/auto/linguist/lrelease/.gitignore2
-rw-r--r--tests/auto/linguist/lrelease/testdata/idbased.ts21
-rw-r--r--tests/auto/linguist/lrelease/tst_lrelease.cpp13
-rw-r--r--tests/auto/linguist/lupdate/.gitignore4
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/backslashes/project.ts.result4
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/lacksqobject/expectedoutput.txt12
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/lacksqobject/main.cpp4
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.result8
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.result8
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/mergeui/project.ts.before8
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/mergeui/project.ts.result6
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/mergeui/project.ui7
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/mergeui_obsolete/project.ts.result2
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/mergeui_obsolete/project.ui2
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp/finddialog.cpp2
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp31
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result39
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp2/expectedoutput.txt7
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp2/main.cpp65
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp2/main2.cpp69
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp2/main3.cpp83
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp2/project.pro12
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp2/project.ts.result4
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parseui/project.ts.result4
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parseui/project.ui7
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/textsimilarity/project.ts.result2
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/textsimilarity/project.ui2
-rw-r--r--tests/auto/linguist/lupdate/testdata/recursivescan/project.ui6
-rw-r--r--tests/auto/linguist/lupdate/testdata/recursivescan/sub/finddialog.cpp105
-rw-r--r--tests/auto/linguist/lupdate/tst_lupdate.cpp25
-rw-r--r--tests/auto/mediaobject/dummy/README1
-rw-r--r--tests/auto/mediaobject/dummy/audiooutput.cpp94
-rw-r--r--tests/auto/mediaobject/dummy/audiooutput.h82
-rw-r--r--tests/auto/mediaobject/dummy/backend.cpp190
-rw-r--r--tests/auto/mediaobject/dummy/backend.h96
-rw-r--r--tests/auto/mediaobject/dummy/dummy.pro23
-rw-r--r--tests/auto/mediaobject/dummy/mediaobject.cpp438
-rw-r--r--tests/auto/mediaobject/dummy/mediaobject.h210
-rw-r--r--tests/auto/mediaobject/dummy/videowidget.cpp246
-rw-r--r--tests/auto/mediaobject/dummy/videowidget.h111
-rw-r--r--tests/auto/mediaobject/tst_mediaobject.cpp23
-rw-r--r--tests/auto/moc/moc.pro3
-rw-r--r--tests/auto/moc/no-keywords.h2
-rw-r--r--tests/auto/moc/os9-newlines.h2
-rw-r--r--tests/auto/moc/testproject/Plugin/Plugin.h2
-rw-r--r--tests/auto/moc/tst_moc.cpp49
-rw-r--r--tests/auto/modeltest/modeltest.cpp4
-rw-r--r--tests/auto/network-settings.h257
-rw-r--r--tests/auto/networkselftest/networkselftest.pro1
-rw-r--r--tests/auto/networkselftest/tst_networkselftest.cpp22
-rw-r--r--tests/auto/patternistexamplefiletree/patternistexamplefiletree.pro1
-rw-r--r--tests/auto/patternistexamples/patternistexamples.pro2
-rw-r--r--tests/auto/patternistheaders/patternistheaders.pro1
-rw-r--r--tests/auto/patternistheaders/tst_patternistheaders.cpp8
-rw-r--r--tests/auto/q3filedialog/tst_q3filedialog.cpp12
-rw-r--r--tests/auto/q3progressbar/tst_q3progressbar.cpp7
-rw-r--r--tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp18
-rw-r--r--tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp2
-rw-r--r--tests/auto/q3tabdialog/tst_q3tabdialog.cpp28
-rw-r--r--tests/auto/q3uridrag/tst_q3uridrag.cpp2
-rw-r--r--tests/auto/q3urloperator/copy.res/.gitattributes1
-rw-r--r--tests/auto/q_func_info/q_func_info.pro2
-rw-r--r--tests/auto/q_func_info/tst_q_func_info.cpp2
-rw-r--r--tests/auto/qabstractitemmodel/dynamictreemodel.cpp328
-rw-r--r--tests/auto/qabstractitemmodel/dynamictreemodel.h199
-rw-r--r--tests/auto/qabstractitemmodel/qabstractitemmodel.pro4
-rw-r--r--tests/auto/qabstractitemmodel/tst_qabstractitemmodel.cpp947
-rw-r--r--tests/auto/qabstractitemview/tst_qabstractitemview.cpp111
-rw-r--r--tests/auto/qabstractmessagehandler/qabstractmessagehandler.pro1
-rw-r--r--tests/auto/qabstractnetworkcache/qabstractnetworkcache.pro2
-rw-r--r--tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp6
-rw-r--r--tests/auto/qabstractscrollarea/tst_qabstractscrollarea.cpp35
-rw-r--r--tests/auto/qabstracturiresolver/qabstracturiresolver.pro1
-rw-r--r--tests/auto/qabstractvideobuffer/qabstractvideobuffer.pro5
-rw-r--r--tests/auto/qabstractvideobuffer/tst_qabstractvideobuffer.cpp132
-rw-r--r--tests/auto/qabstractvideosurface/qabstractvideosurface.pro5
-rw-r--r--tests/auto/qabstractvideosurface/tst_qabstractvideosurface.cpp292
-rw-r--r--tests/auto/qabstractxmlforwarditerator/qabstractxmlforwarditerator.pro1
-rw-r--r--tests/auto/qabstractxmlnodemodel/tst_qabstractxmlnodemodel.cpp8
-rw-r--r--tests/auto/qabstractxmlreceiver/qabstractxmlreceiver.pro1
-rw-r--r--tests/auto/qaccessibility/tst_qaccessibility.cpp13
-rw-r--r--tests/auto/qaccessibility_mac/qaccessibility_mac.pro2
-rw-r--r--tests/auto/qaccessibility_mac/tst_qaccessibility_mac.cpp18
-rw-r--r--tests/auto/qaction/tst_qaction.cpp59
-rw-r--r--tests/auto/qanimationgroup/qanimationgroup.pro5
-rw-r--r--tests/auto/qanimationgroup/tst_qanimationgroup.cpp413
-rw-r--r--tests/auto/qapplication/desktopsettingsaware/desktopsettingsaware.pro9
-rw-r--r--tests/auto/qapplication/test/test.pro8
-rw-r--r--tests/auto/qapplication/tst_qapplication.cpp225
-rw-r--r--tests/auto/qatomicint/qatomicint.pro3
-rw-r--r--tests/auto/qatomicint/tst_qatomicint.cpp44
-rw-r--r--tests/auto/qatomicpointer/qatomicpointer.pro2
-rw-r--r--tests/auto/qatomicpointer/tst_qatomicpointer.cpp48
-rw-r--r--tests/auto/qaudiodeviceid/qaudiodeviceid.pro7
-rw-r--r--tests/auto/qaudiodeviceid/tst_qaudiodeviceid.cpp118
-rw-r--r--tests/auto/qaudiodeviceinfo/qaudiodeviceinfo.pro7
-rw-r--r--tests/auto/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp205
-rw-r--r--tests/auto/qaudioformat/qaudioformat.pro7
-rw-r--r--tests/auto/qaudioformat/tst_qaudioformat.cpp180
-rw-r--r--tests/auto/qaudioinput/qaudioinput.pro7
-rw-r--r--tests/auto/qaudioinput/tst_qaudioinput.cpp137
-rw-r--r--tests/auto/qaudiooutput/4.wavbin0 -> 5538 bytes-rw-r--r--tests/auto/qaudiooutput/qaudiooutput.pro12
-rw-r--r--tests/auto/qaudiooutput/tst_qaudiooutput.cpp173
-rw-r--r--tests/auto/qautoptr/qautoptr.pro2
-rw-r--r--tests/auto/qbitarray/qbitarray.pro4
-rw-r--r--tests/auto/qbitarray/tst_qbitarray.cpp28
-rw-r--r--tests/auto/qboxlayout/tst_qboxlayout.cpp80
-rw-r--r--tests/auto/qbrush/tst_qbrush.cpp11
-rw-r--r--tests/auto/qbuffer/qbuffer.pro4
-rw-r--r--tests/auto/qbuttongroup/tst_qbuttongroup.cpp49
-rw-r--r--tests/auto/qbytearray/.gitattributes1
-rw-r--r--tests/auto/qbytearray/qbytearray.pro7
-rw-r--r--tests/auto/qbytearray/tst_qbytearray.cpp88
-rw-r--r--tests/auto/qcache/qcache.pro4
-rw-r--r--tests/auto/qcalendarwidget/tst_qcalendarwidget.cpp2
-rw-r--r--tests/auto/qchar/qchar.pro2
-rw-r--r--tests/auto/qchar/tst_qchar.cpp3
-rw-r--r--tests/auto/qclipboard/test/test.pro2
-rw-r--r--tests/auto/qclipboard/tst_qclipboard.cpp10
-rw-r--r--tests/auto/qcolor/tst_qcolor.cpp230
-rw-r--r--tests/auto/qcolumnview/qcolumnview.pro4
-rw-r--r--tests/auto/qcolumnview/tst_qcolumnview.cpp44
-rw-r--r--tests/auto/qcombobox/qcombobox.pro2
-rw-r--r--tests/auto/qcombobox/tst_qcombobox.cpp111
-rw-r--r--tests/auto/qcompleter/tst_qcompleter.cpp189
-rw-r--r--tests/auto/qcontiguouscache/qcontiguouscache.pro8
-rw-r--r--tests/auto/qcontiguouscache/tst_qcontiguouscache.cpp479
-rw-r--r--tests/auto/qcopchannel/tst_qcopchannel.cpp2
-rw-r--r--tests/auto/qcoreapplication/qcoreapplication.pro3
-rw-r--r--tests/auto/qcryptographichash/qcryptographichash.pro6
-rw-r--r--tests/auto/qcssparser/qcssparser.pro8
-rw-r--r--tests/auto/qcssparser/tst_qcssparser.cpp56
-rw-r--r--tests/auto/qdatastream/qdatastream.pro12
-rw-r--r--tests/auto/qdatastream/tst_qdatastream.cpp39
-rw-r--r--tests/auto/qdate/qdate.pro4
-rw-r--r--tests/auto/qdatetime/tst_qdatetime.cpp14
-rw-r--r--tests/auto/qdatetimeedit/tst_qdatetimeedit.cpp25
-rw-r--r--tests/auto/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp21
-rw-r--r--tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml30
-rw-r--r--tests/auto/qdbusabstractinterface/interface.cpp48
-rw-r--r--tests/auto/qdbusabstractinterface/interface.h113
-rw-r--r--tests/auto/qdbusabstractinterface/pinger.cpp67
-rw-r--r--tests/auto/qdbusabstractinterface/pinger.h145
-rw-r--r--tests/auto/qdbusabstractinterface/qdbusabstractinterface.pro15
-rw-r--r--tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp576
-rw-r--r--tests/auto/qdbusinterface/tst_qdbusinterface.cpp194
-rw-r--r--tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp121
-rw-r--r--tests/auto/qdebug/qdebug.pro4
-rw-r--r--tests/auto/qdesktopservices/qdesktopservices.pro23
-rw-r--r--tests/auto/qdesktopservices/tst_qdesktopservices.cpp205
-rw-r--r--tests/auto/qdesktopwidget/tst_qdesktopwidget.cpp12
-rw-r--r--tests/auto/qdir/qdir.pro10
-rw-r--r--tests/auto/qdir/tst_qdir.cpp271
-rw-r--r--tests/auto/qdirectpainter/tst_qdirectpainter.cpp4
-rw-r--r--tests/auto/qdiriterator/qdiriterator.pro2
-rw-r--r--tests/auto/qdiriterator/tst_qdiriterator.cpp35
-rw-r--r--tests/auto/qdirmodel/qdirmodel.pro12
-rw-r--r--tests/auto/qdirmodel/tst_qdirmodel.cpp28
-rw-r--r--tests/auto/qdockwidget/tst_qdockwidget.cpp21
-rw-r--r--tests/auto/qdom/qdom.pro8
-rw-r--r--tests/auto/qdom/tst_qdom.cpp58
-rw-r--r--tests/auto/qeasingcurve/qeasingcurve.pro3
-rw-r--r--tests/auto/qeasingcurve/tst_qeasingcurve.cpp493
-rw-r--r--tests/auto/qevent/qevent.pro3
-rw-r--r--tests/auto/qeventloop/tst_qeventloop.cpp398
-rw-r--r--tests/auto/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro2
-rw-r--r--tests/auto/qexplicitlyshareddatapointer/tst_qexplicitlyshareddatapointer.cpp20
-rw-r--r--tests/auto/qfile/test/test.pro42
-rw-r--r--tests/auto/qfile/tst_qfile.cpp251
-rw-r--r--tests/auto/qfiledialog/qfiledialog.pro5
-rw-r--r--tests/auto/qfiledialog/tst_qfiledialog.cpp120
-rw-r--r--tests/auto/qfileinfo/qfileinfo.pro6
-rw-r--r--tests/auto/qfileinfo/tst_qfileinfo.cpp347
-rw-r--r--tests/auto/qfilesystemmodel/qfilesystemmodel.pro12
-rw-r--r--tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp49
-rw-r--r--tests/auto/qfilesystemwatcher/qfilesystemwatcher.pro2
-rw-r--r--tests/auto/qfilesystemwatcher/tst_qfilesystemwatcher.cpp130
-rw-r--r--tests/auto/qflags/qflags.pro3
-rw-r--r--tests/auto/qfontcombobox/tst_qfontcombobox.cpp6
-rw-r--r--tests/auto/qfontdatabase/qfontdatabase.pro4
-rw-r--r--tests/auto/qfontdatabase/tst_qfontdatabase.cpp10
-rw-r--r--tests/auto/qfontdialog/tst_qfontdialog.cpp30
-rw-r--r--tests/auto/qfontmetrics/tst_qfontmetrics.cpp31
-rw-r--r--tests/auto/qftp/.gitattributes2
-rw-r--r--tests/auto/qftp/qftp.pro5
-rw-r--r--tests/auto/qftp/tst_qftp.cpp24
-rw-r--r--tests/auto/qgetputenv/qgetputenv.pro4
-rw-r--r--tests/auto/qgl/qgl.pro3
-rw-r--r--tests/auto/qgl/tst_qgl.cpp827
-rw-r--r--tests/auto/qglobal/qglobal.pro3
-rw-r--r--tests/auto/qglobal/tst_qglobal.cpp72
-rw-r--r--tests/auto/qgraphicsanchorlayout/qgraphicsanchorlayout.pro3
-rw-r--r--tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp1072
-rw-r--r--tests/auto/qgraphicseffect/qgraphicseffect.pro3
-rw-r--r--tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp347
-rw-r--r--tests/auto/qgraphicseffectsource/qgraphicseffectsource.pro3
-rw-r--r--tests/auto/qgraphicseffectsource/tst_qgraphicseffectsource.cpp323
-rw-r--r--tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp121
-rw-r--r--tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp1909
-rw-r--r--tests/auto/qgraphicslayout/tst_qgraphicslayout.cpp61
-rw-r--r--tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp116
-rw-r--r--tests/auto/qgraphicsobject/qgraphicsobject.pro2
-rw-r--r--tests/auto/qgraphicsobject/tst_qgraphicsobject.cpp255
-rw-r--r--tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp236
-rw-r--r--tests/auto/qgraphicsscene/qgraphicsscene.pro9
-rw-r--r--tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp235
-rw-r--r--tests/auto/qgraphicssceneindex/qgraphicssceneindex.pro4
-rw-r--r--tests/auto/qgraphicssceneindex/tst_qgraphicssceneindex.cpp305
-rw-r--r--tests/auto/qgraphicstransform/qgraphicstransform.pro2
-rw-r--r--tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp278
-rw-r--r--tests/auto/qgraphicsview/qgraphicsview.pro2
-rw-r--r--tests/auto/qgraphicsview/tst_qgraphicsview.cpp733
-rw-r--r--tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp540
-rw-r--r--tests/auto/qgroupbox/tst_qgroupbox.cpp95
-rw-r--r--tests/auto/qguard/qguard.pro2
-rw-r--r--tests/auto/qguard/tst_qguard.cpp350
-rw-r--r--tests/auto/qhash/qhash.pro7
-rw-r--r--tests/auto/qhash/tst_qhash.cpp8
-rw-r--r--tests/auto/qhelpcontentmodel/tst_qhelpcontentmodel.pro16
-rw-r--r--tests/auto/qhelpenginecore/data/collection.qhcbin10240 -> 10240 bytes-rw-r--r--tests/auto/qhelpenginecore/data/collection1.qhcbin10240 -> 10240 bytes-rw-r--r--tests/auto/qhelpenginecore/data/linguist-3.3.8.qchbin131072 -> 131072 bytes-rw-r--r--tests/auto/qhelpenginecore/data/qmake-3.3.8.qchbin61440 -> 61440 bytes-rw-r--r--tests/auto/qhelpenginecore/data/qmake-4.3.0.qchbin93184 -> 93184 bytes-rw-r--r--tests/auto/qhelpenginecore/data/test.qchbin22528 -> 22528 bytes-rw-r--r--tests/auto/qhelpenginecore/tst_qhelpenginecore.cpp42
-rw-r--r--tests/auto/qhelpenginecore/tst_qhelpenginecore.pro17
-rw-r--r--tests/auto/qhelpgenerator/data/test.qhp7
-rw-r--r--tests/auto/qhelpindexmodel/data/collection.qhcbin10240 -> 10240 bytes-rw-r--r--tests/auto/qhelpindexmodel/data/collection1.qhcbin10240 -> 10240 bytes-rw-r--r--tests/auto/qhelpindexmodel/data/linguist-3.3.8.qchbin131072 -> 131072 bytes-rw-r--r--tests/auto/qhelpindexmodel/data/qmake-3.3.8.qchbin61440 -> 61440 bytes-rw-r--r--tests/auto/qhelpindexmodel/data/qmake-4.3.0.qchbin93184 -> 93184 bytes-rw-r--r--tests/auto/qhelpindexmodel/data/test.qchbin22528 -> 22528 bytes-rw-r--r--tests/auto/qhelpindexmodel/tst_qhelpindexmodel.cpp6
-rw-r--r--tests/auto/qhostinfo/tst_qhostinfo.cpp26
-rw-r--r--tests/auto/qhttp/qhttp.pro10
-rw-r--r--tests/auto/qhttp/tst_qhttp.cpp273
-rw-r--r--tests/auto/qhttpnetworkconnection/qhttpnetworkconnection.pro3
-rw-r--r--tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp171
-rw-r--r--tests/auto/qhttpnetworkreply/qhttpnetworkreply.pro3
-rw-r--r--tests/auto/qhttpsocketengine/tst_qhttpsocketengine.cpp19
-rw-r--r--tests/auto/qicoimageformat/icons/valid/Qt.icobin0 -> 31371 bytes-rw-r--r--tests/auto/qicoimageformat/qicoimageformat.pro8
-rw-r--r--tests/auto/qicoimageformat/tst_qicoimageformat.cpp39
-rw-r--r--tests/auto/qicon/icons/testtheme/16x16/actions/appointment-new.pngbin0 -> 897 bytes-rw-r--r--tests/auto/qicon/icons/testtheme/22x22/actions/appointment-new.pngbin0 -> 1411 bytes-rw-r--r--tests/auto/qicon/icons/testtheme/32x32/actions/appointment-new.pngbin0 -> 2399 bytes-rw-r--r--tests/auto/qicon/icons/testtheme/index.theme492
-rw-r--r--tests/auto/qicon/icons/testtheme/scalable/actions/svg-only.svg425
-rw-r--r--tests/auto/qicon/icons/themeparent/16x16/actions/address-book-new.pngbin0 -> 796 bytes-rw-r--r--tests/auto/qicon/icons/themeparent/16x16/actions/appointment-new.pngbin0 -> 897 bytes-rw-r--r--tests/auto/qicon/icons/themeparent/22x22/actions/address-book-new.pngbin0 -> 924 bytes-rw-r--r--tests/auto/qicon/icons/themeparent/22x22/actions/appointment-new.pngbin0 -> 1411 bytes-rw-r--r--tests/auto/qicon/icons/themeparent/32x32/actions/address-book-new.pngbin0 -> 1897 bytes-rw-r--r--tests/auto/qicon/icons/themeparent/32x32/actions/appointment-new.pngbin0 -> 2399 bytes-rw-r--r--tests/auto/qicon/icons/themeparent/index.theme492
-rw-r--r--tests/auto/qicon/icons/themeparent/scalable/actions/address-book-new.svg389
-rw-r--r--tests/auto/qicon/icons/themeparent/scalable/actions/appointment-new.svg425
-rw-r--r--tests/auto/qicon/qicon.pro7
-rw-r--r--tests/auto/qicon/tst_qicon.cpp73
-rw-r--r--tests/auto/qicon/tst_qicon.qrc14
-rw-r--r--tests/auto/qimage/images/image.tifbin0 -> 2242 bytes-rw-r--r--tests/auto/qimage/qimage.pro7
-rw-r--r--tests/auto/qimage/tst_qimage.cpp51
-rw-r--r--tests/auto/qimagereader/baseline/35floppy.icobin0 -> 4286 bytes-rw-r--r--tests/auto/qimagereader/baseline/kde_favicon.icobin0 -> 1150 bytes-rw-r--r--tests/auto/qimagereader/baseline/semitransparent.icobin0 -> 9662 bytes-rw-r--r--tests/auto/qimagereader/images/image_100dpi.tifbin0 -> 2242 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/indexed_orientation_1.tiffbin0 -> 7740 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/indexed_orientation_2.tiffbin0 -> 9570 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/indexed_orientation_3.tiffbin0 -> 11392 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/indexed_orientation_4.tiffbin0 -> 11392 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/indexed_orientation_5.tiffbin0 -> 11392 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/indexed_orientation_6.tiffbin0 -> 11392 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/indexed_orientation_7.tiffbin0 -> 11392 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/indexed_orientation_8.tiffbin0 -> 11392 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/mono_orientation_1.tiffbin0 -> 2382 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/mono_orientation_2.tiffbin0 -> 1608 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/mono_orientation_3.tiffbin0 -> 1608 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/mono_orientation_4.tiffbin0 -> 1608 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/mono_orientation_5.tiffbin0 -> 1608 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/mono_orientation_6.tiffbin0 -> 1608 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/mono_orientation_7.tiffbin0 -> 1608 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/mono_orientation_8.tiffbin0 -> 1608 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/original_indexed.tiffbin0 -> 5922 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/original_mono.tiffbin0 -> 786 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/original_rgb.tiffbin0 -> 12608 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/rgb_orientation_1.tiffbin0 -> 15560 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/rgb_orientation_2.tiffbin0 -> 17972 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/rgb_orientation_3.tiffbin0 -> 17324 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/rgb_orientation_4.tiffbin0 -> 17324 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/rgb_orientation_5.tiffbin0 -> 17648 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/rgb_orientation_6.tiffbin0 -> 17324 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/rgb_orientation_7.tiffbin0 -> 17324 bytes-rw-r--r--tests/auto/qimagereader/images/tiff_oriented/rgb_orientation_8.tiffbin0 -> 17324 bytes-rw-r--r--tests/auto/qimagereader/qimagereader.pro11
-rw-r--r--tests/auto/qimagereader/qimagereader.qrc1
-rw-r--r--tests/auto/qimagereader/tst_qimagereader.cpp530
-rw-r--r--tests/auto/qimagewriter/qimagewriter.pro8
-rw-r--r--tests/auto/qimagewriter/tst_qimagewriter.cpp83
-rw-r--r--tests/auto/qinputcontext/qinputcontext.pro2
-rw-r--r--tests/auto/qinputcontext/tst_qinputcontext.cpp249
-rw-r--r--tests/auto/qiodevice/qiodevice.pro5
-rw-r--r--tests/auto/qiodevice/tst_qiodevice.cpp7
-rw-r--r--tests/auto/qitemdelegate/tst_qitemdelegate.cpp71
-rw-r--r--tests/auto/qitemmodel/qitemmodel.pro12
-rw-r--r--tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp89
-rw-r--r--tests/auto/qitemview/tst_qitemview.cpp11
-rw-r--r--tests/auto/qkeyevent/.gitignore1
-rw-r--r--tests/auto/qkeyevent/qkeyevent.pro5
-rw-r--r--tests/auto/qkeyevent/tst_qkeyevent.cpp228
-rw-r--r--tests/auto/qkeysequence/tst_qkeysequence.cpp29
-rw-r--r--tests/auto/qlabel/qlabel.pro7
-rw-r--r--tests/auto/qlabel/tst_qlabel.cpp3
-rw-r--r--tests/auto/qlayout/qlayout.pro2
-rw-r--r--tests/auto/qlibrary/lib/lib.pro3
-rw-r--r--tests/auto/qlibrary/lib/mylib.c4
-rw-r--r--tests/auto/qlibrary/lib2/lib2.pro20
-rw-r--r--tests/auto/qlibrary/lib2/mylib.c4
-rw-r--r--tests/auto/qlibrary/qlibrary.pro14
-rw-r--r--tests/auto/qlibrary/tst/tst.pro12
-rw-r--r--tests/auto/qlibrary/tst_qlibrary.cpp69
-rw-r--r--tests/auto/qline/qline.pro2
-rw-r--r--tests/auto/qlineedit/tst_qlineedit.cpp46
-rw-r--r--tests/auto/qlistview/tst_qlistview.cpp169
-rw-r--r--tests/auto/qlistwidget/tst_qlistwidget.cpp43
-rw-r--r--tests/auto/qlocale/test/test.pro8
-rw-r--r--tests/auto/qlocale/tst_qlocale.cpp87
-rw-r--r--tests/auto/qlocalsocket/lackey/lackey.pro4
-rw-r--r--tests/auto/qlocalsocket/lackey/main.cpp2
-rw-r--r--tests/auto/qlocalsocket/qlocalsocket.pro2
-rw-r--r--tests/auto/qlocalsocket/test/test.pro19
-rw-r--r--tests/auto/qlocalsocket/tst_qlocalsocket.cpp119
-rw-r--r--tests/auto/qmainwindow/qmainwindow.pro3
-rw-r--r--tests/auto/qmainwindow/tst_qmainwindow.cpp67
-rw-r--r--tests/auto/qmake/testcompiler.cpp14
-rw-r--r--tests/auto/qmake/testcompiler.h4
-rw-r--r--tests/auto/qmake/testdata/bundle-spaces/some-file6
-rw-r--r--tests/auto/qmake/testdata/findDeps/findDeps.pro7
-rw-r--r--tests/auto/qmake/testdata/findMocs/findMocs.pro7
-rw-r--r--tests/auto/qmake/testdata/functions/functions.pro2
-rw-r--r--tests/auto/qmake/testdata/include_function/existing_file.pri3
-rw-r--r--tests/auto/qmake/testdata/include_function/include_existing_file.pro7
-rw-r--r--tests/auto/qmake/testdata/include_function/include_missing_file.pro3
-rw-r--r--tests/auto/qmake/testdata/include_function/include_missing_file2.pro3
-rw-r--r--tests/auto/qmake/testdata/include_function/main.cpp45
-rw-r--r--tests/auto/qmake/tst_qmake.cpp23
-rw-r--r--tests/auto/qmap/qmap.pro4
-rw-r--r--tests/auto/qmap/tst_qmap.cpp17
-rw-r--r--tests/auto/qmargins/qmargins.pro3
-rw-r--r--tests/auto/qmargins/tst_qmargins.cpp108
-rw-r--r--tests/auto/qmatrixnxn/qmatrixnxn.pro2
-rw-r--r--tests/auto/qmatrixnxn/tst_qmatrixnxn.cpp3383
-rw-r--r--tests/auto/qmenu/tst_qmenu.cpp130
-rw-r--r--tests/auto/qmenubar/qmenubar.pro2
-rw-r--r--tests/auto/qmenubar/tst_qmenubar.cpp112
-rw-r--r--tests/auto/qmetaobject/qmetaobject.pro3
-rw-r--r--tests/auto/qmetaobject/tst_qmetaobject.cpp34
-rw-r--r--tests/auto/qmetatype/qmetatype.pro3
-rw-r--r--tests/auto/qmouseevent/tst_qmouseevent.cpp6
-rw-r--r--tests/auto/qmovie/qmovie.pro10
-rw-r--r--tests/auto/qmultiscreen/qmultiscreen.pro1
-rw-r--r--tests/auto/qmutex/qmutex.pro2
-rw-r--r--tests/auto/qmutexlocker/qmutexlocker.pro2
-rw-r--r--tests/auto/qnativesocketengine/qnativesocketengine.pro2
-rw-r--r--tests/auto/qnativesocketengine/tst_qnativesocketengine.cpp23
-rw-r--r--tests/auto/qnetworkaccessmanager_and_qprogressdialog/tst_qnetworkaccessmanager_and_qprogressdialog.cpp9
-rw-r--r--tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp54
-rw-r--r--tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp28
-rw-r--r--tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp9
-rw-r--r--tests/auto/qnetworkreply/.gitattributes5
-rw-r--r--tests/auto/qnetworkreply/echo/echo.pro2
-rw-r--r--tests/auto/qnetworkreply/qnetworkreply.pro2
-rw-r--r--tests/auto/qnetworkreply/test/test.pro14
-rw-r--r--tests/auto/qnetworkreply/tst_qnetworkreply.cpp1043
-rw-r--r--tests/auto/qnumeric/qnumeric.pro3
-rw-r--r--tests/auto/qnumeric/tst_qnumeric.cpp5
-rw-r--r--tests/auto/qobject/qobject.pro2
-rw-r--r--tests/auto/qobject/tst_qobject.cpp243
-rw-r--r--tests/auto/qobject/tst_qobject.pro7
-rw-r--r--tests/auto/qobjectrace/qobjectrace.pro3
-rw-r--r--tests/auto/qobjectrace/tst_qobjectrace.cpp64
-rw-r--r--tests/auto/qpainter/qpainter.pro9
-rw-r--r--tests/auto/qpainter/tst_qpainter.cpp58
-rw-r--r--tests/auto/qpainterpath/tst_qpainterpath.cpp45
-rw-r--r--tests/auto/qparallelanimationgroup/qparallelanimationgroup.pro5
-rw-r--r--tests/auto/qparallelanimationgroup/tst_qparallelanimationgroup.cpp865
-rw-r--r--tests/auto/qpathclipper/qpathclipper.pro4
-rw-r--r--tests/auto/qpen/tst_qpen.cpp12
-rw-r--r--tests/auto/qpicture/tst_qpicture.cpp38
-rw-r--r--tests/auto/qpixmap/images/designer.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_-10_dy_-10_50_50_100_100.pngbin0 -> 4385 bytes-rw-r--r--tests/auto/qpixmap/images/dx_-10_dy_-10_x_y_w_h.pngbin0 -> 4104 bytes-rw-r--r--tests/auto/qpixmap/images/dx_-10_dy_0_50_50_100_100.pngbin0 -> 4243 bytes-rw-r--r--tests/auto/qpixmap/images/dx_-10_dy_0_x_y_w_h.pngbin0 -> 4116 bytes-rw-r--r--tests/auto/qpixmap/images/dx_-128_dy_-128_x_y_w_h.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_-128_dy_0_x_y_w_h.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_-10_50_50_100_100.pngbin0 -> 4367 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_-10_x_y_w_h.pngbin0 -> 4157 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_-128_x_y_w_h.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_0_50_50_100_100.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_0_null.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_0_x_y_w_h.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_10_50_50_100_100.pngbin0 -> 4271 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_10_x_y_w_h.pngbin0 -> 4188 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_128_x_y_w_h.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_0_dy_1_null.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_10_dy_0_50_50_100_100.pngbin0 -> 4248 bytes-rw-r--r--tests/auto/qpixmap/images/dx_10_dy_0_x_y_w_h.pngbin0 -> 4196 bytes-rw-r--r--tests/auto/qpixmap/images/dx_10_dy_10_50_50_100_100.pngbin0 -> 4243 bytes-rw-r--r--tests/auto/qpixmap/images/dx_10_dy_10_x_y_w_h.pngbin0 -> 4220 bytes-rw-r--r--tests/auto/qpixmap/images/dx_128_dy_0_x_y_w_h.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_128_dy_128_64_64_128_128.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_128_dy_128_x_y_w_h.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/images/dx_1_dy_0_null.pngbin0 -> 4282 bytes-rw-r--r--tests/auto/qpixmap/qpixmap.pro11
-rw-r--r--tests/auto/qpixmap/qpixmap.qrc29
-rw-r--r--tests/auto/qpixmap/tst_qpixmap.cpp330
-rw-r--r--tests/auto/qpixmapcache/tst_qpixmapcache.cpp273
-rw-r--r--tests/auto/qpixmapfilter/tst_qpixmapfilter.cpp43
-rw-r--r--tests/auto/qplaintextedit/tst_qplaintextedit.cpp38
-rw-r--r--tests/auto/qplugin/debugplugin/debugplugin.pro4
-rw-r--r--tests/auto/qplugin/qplugin.pro1
-rw-r--r--tests/auto/qplugin/releaseplugin/releaseplugin.pro4
-rw-r--r--tests/auto/qplugin/tst_qplugin.pro8
-rw-r--r--tests/auto/qpluginloader/lib/lib.pro3
-rw-r--r--tests/auto/qpluginloader/qpluginloader.pro3
-rw-r--r--tests/auto/qpluginloader/theplugin/theplugin.pro4
-rw-r--r--tests/auto/qpluginloader/tst/tst.pro11
-rw-r--r--tests/auto/qpluginloader/tst_qpluginloader.cpp67
-rw-r--r--tests/auto/qpoint/qpoint.pro5
-rw-r--r--tests/auto/qpoint/tst_qpoint.cpp20
-rw-r--r--tests/auto/qpolygon/qpolygon.pro2
-rw-r--r--tests/auto/qprinterinfo/tst_qprinterinfo.cpp2
-rw-r--r--tests/auto/qprocess/qprocess.pro10
-rw-r--r--tests/auto/qprocess/test/test.pro21
-rw-r--r--tests/auto/qprocess/testDetached/testDetached.pro3
-rw-r--r--tests/auto/qprocess/testProcessEnvironment/main.cpp61
-rw-r--r--tests/auto/qprocess/testProcessEnvironment/testProcessEnvironment.pro12
-rw-r--r--tests/auto/qprocess/testProcessOutput/main.cpp18
-rw-r--r--tests/auto/qprocess/testProcessSpacesArgs/main.cpp12
-rw-r--r--tests/auto/qprocess/tst_qprocess.cpp422
-rw-r--r--tests/auto/qprogressbar/tst_qprogressbar.cpp32
-rw-r--r--tests/auto/qpropertyanimation/qpropertyanimation.pro5
-rw-r--r--tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp1180
-rw-r--r--tests/auto/qpushbutton/tst_qpushbutton.cpp77
-rw-r--r--tests/auto/qquaternion/qquaternion.pro2
-rw-r--r--tests/auto/qquaternion/tst_qquaternion.cpp891
-rw-r--r--tests/auto/qqueue/qqueue.pro3
-rw-r--r--tests/auto/qrand/qrand.pro2
-rw-r--r--tests/auto/qreadlocker/qreadlocker.pro2
-rw-r--r--tests/auto/qreadwritelock/qreadwritelock.pro2
-rw-r--r--tests/auto/qreadwritelock/tst_qreadwritelock.cpp2
-rw-r--r--tests/auto/qrect/qrect.pro2
-rw-r--r--tests/auto/qrect/tst_qrect.cpp320
-rw-r--r--tests/auto/qregexp/qregexp.pro4
-rw-r--r--tests/auto/qregexp/tst_qregexp.cpp4
-rw-r--r--tests/auto/qregion/tst_qregion.cpp17
-rw-r--r--tests/auto/qresourceengine/qresourceengine.pro23
-rw-r--r--tests/auto/qresourceengine/tst_qresourceengine.cpp6
-rw-r--r--tests/auto/qringbuffer/qringbuffer.pro6
-rw-r--r--tests/auto/qringbuffer/tst_qringbuffer.cpp200
-rw-r--r--tests/auto/qscopedpointer/.gitignore1
-rw-r--r--tests/auto/qscopedpointer/qscopedpointer.pro3
-rw-r--r--tests/auto/qscopedpointer/tst_qscopedpointer.cpp343
-rw-r--r--tests/auto/qscriptable/tst_qscriptable.cpp19
-rw-r--r--tests/auto/qscriptclass/tst_qscriptclass.cpp64
-rw-r--r--tests/auto/qscriptcontext/tst_qscriptcontext.cpp494
-rw-r--r--tests/auto/qscriptcontextinfo/tst_qscriptcontextinfo.cpp228
-rw-r--r--tests/auto/qscriptengine/qscriptengine.pro10
-rw-r--r--tests/auto/qscriptengine/script/com/__init__.js4
-rw-r--r--tests/auto/qscriptengine/script/com/trolltech/__init__.js4
-rw-r--r--tests/auto/qscriptengine/tst_qscriptengine.cpp1165
-rw-r--r--tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp678
-rw-r--r--tests/auto/qscriptenginedebugger/tst_qscriptenginedebugger.cpp26
-rw-r--r--tests/auto/qscriptextqobject/qscriptextqobject.pro6
-rw-r--r--tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp255
-rw-r--r--tests/auto/qscriptjstestsuite/qscriptjstestsuite.pro8
-rw-r--r--tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp181
-rw-r--r--tests/auto/qscriptstring/tst_qscriptstring.cpp4
-rw-r--r--tests/auto/qscriptv8testsuite/qscriptv8testsuite.pro5
-rw-r--r--tests/auto/qscriptv8testsuite/tst_qscriptv8testsuite.cpp86
-rw-r--r--tests/auto/qscriptvalue/qscriptvalue.pro2
-rw-r--r--tests/auto/qscriptvalue/tst_qscriptvalue.cpp697
-rw-r--r--tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp204
-rw-r--r--tests/auto/qsequentialanimationgroup/qsequentialanimationgroup.pro5
-rw-r--r--tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp1684
-rw-r--r--tests/auto/qset/qset.pro7
-rw-r--r--tests/auto/qset/tst_qset.cpp35
-rw-r--r--tests/auto/qsettings/.gitattributes5
-rw-r--r--tests/auto/qsettings/tst_qsettings.cpp58
-rw-r--r--tests/auto/qsharedmemory/lackey/scripts/producer.js8
-rw-r--r--tests/auto/qsharedmemory/src/qsystemlock_p.h1
-rw-r--r--tests/auto/qsharedmemory/src/qsystemlock_unix.cpp24
-rw-r--r--tests/auto/qsharedmemory/src/qsystemlock_win.cpp26
-rw-r--r--tests/auto/qsharedmemory/test/test.pro10
-rw-r--r--tests/auto/qsharedmemory/tst_qsharedmemory.cpp39
-rw-r--r--tests/auto/qsharedpointer/externaltests.cpp109
-rw-r--r--tests/auto/qsharedpointer/externaltests.h4
-rw-r--r--tests/auto/qsharedpointer/externaltests.pri4
-rw-r--r--tests/auto/qsharedpointer/forwarddeclaration.cpp52
-rw-r--r--tests/auto/qsharedpointer/forwarddeclared.cpp53
-rw-r--r--tests/auto/qsharedpointer/forwarddeclared.h54
-rw-r--r--tests/auto/qsharedpointer/qsharedpointer.pro11
-rw-r--r--tests/auto/qsharedpointer/tst_qsharedpointer.cpp808
-rw-r--r--tests/auto/qsharedpointer/wrapper.cpp60
-rw-r--r--tests/auto/qsharedpointer/wrapper.h58
-rw-r--r--tests/auto/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro3
-rw-r--r--tests/auto/qsharedpointer_and_qwidget/tst_qsharedpointer_and_qwidget.cpp152
-rw-r--r--tests/auto/qsidebar/qsidebar.pro2
-rw-r--r--tests/auto/qsignalspy/qsignalspy.pro3
-rw-r--r--tests/auto/qsize/qsize.pro4
-rw-r--r--tests/auto/qsizef/qsizef.pro3
-rw-r--r--tests/auto/qsocketnotifier/qsocketnotifier.pro2
-rw-r--r--tests/auto/qsocketnotifier/tst_qsocketnotifier.cpp90
-rw-r--r--tests/auto/qsocks5socketengine/qsocks5socketengine.pro3
-rw-r--r--tests/auto/qsocks5socketengine/tst_qsocks5socketengine.cpp26
-rw-r--r--tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp109
-rw-r--r--tests/auto/qsound/qsound.pro2
-rw-r--r--tests/auto/qspinbox/tst_qspinbox.cpp50
-rw-r--r--tests/auto/qsplitter/qsplitter.pro5
-rw-r--r--tests/auto/qsplitter/tst_qsplitter.cpp6
-rw-r--r--tests/auto/qsql/qsql.pro10
-rw-r--r--tests/auto/qsqldatabase/qsqldatabase.pro14
-rw-r--r--tests/auto/qsqldatabase/tst_databases.h79
-rw-r--r--tests/auto/qsqldatabase/tst_qsqldatabase.cpp170
-rw-r--r--tests/auto/qsqldriver/qsqldriver.pro17
-rw-r--r--tests/auto/qsqldriver/tst_qsqldriver.cpp218
-rw-r--r--tests/auto/qsqlerror/qsqlerror.pro8
-rw-r--r--tests/auto/qsqlfield/qsqlfield.pro8
-rw-r--r--tests/auto/qsqlquery/qsqlquery.pro11
-rw-r--r--tests/auto/qsqlquery/tst_qsqlquery.cpp69
-rw-r--r--tests/auto/qsqlquerymodel/qsqlquerymodel.pro7
-rw-r--r--tests/auto/qsqlrecord/qsqlrecord.pro10
-rw-r--r--tests/auto/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro9
-rw-r--r--tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp489
-rw-r--r--tests/auto/qsqltablemodel/qsqltablemodel.pro11
-rw-r--r--tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp22
-rw-r--r--tests/auto/qsqlthread/qsqlthread.pro11
-rw-r--r--tests/auto/qsslcertificate/qsslcertificate.pro11
-rw-r--r--tests/auto/qsslcertificate/tst_qsslcertificate.cpp12
-rw-r--r--tests/auto/qsslcipher/qsslcipher.pro2
-rw-r--r--tests/auto/qsslerror/qsslerror.pro2
-rw-r--r--tests/auto/qsslkey/qsslkey.pro9
-rw-r--r--tests/auto/qsslkey/tst_qsslkey.cpp8
-rw-r--r--tests/auto/qsslsocket/certs/aspiriniks.ca.crt22
-rw-r--r--tests/auto/qsslsocket/qsslsocket.pro26
-rw-r--r--tests/auto/qsslsocket/tst_qsslsocket.cpp190
-rw-r--r--tests/auto/qstandarditem/tst_qstandarditem.cpp4
-rw-r--r--tests/auto/qstandarditemmodel/tst_qstandarditemmodel.cpp57
-rw-r--r--tests/auto/qstate/qstate.pro5
-rw-r--r--tests/auto/qstate/tst_qstate.cpp375
-rw-r--r--tests/auto/qstatemachine/qstatemachine.pro4
-rw-r--r--tests/auto/qstatemachine/tst_qstatemachine.cpp3983
-rw-r--r--tests/auto/qstl/qstl.pro4
-rw-r--r--tests/auto/qstring/qstring.pro5
-rw-r--r--tests/auto/qstring/tst_qstring.cpp320
-rw-r--r--tests/auto/qstringbuilder1/qstringbuilder1.pro9
-rw-r--r--tests/auto/qstringbuilder1/stringbuilder.cpp133
-rw-r--r--tests/auto/qstringbuilder1/stringbuilder.h55
-rw-r--r--tests/auto/qstringbuilder1/tst_qstringbuilder1.cpp42
-rw-r--r--tests/auto/qstringbuilder2/qstringbuilder2.pro8
-rw-r--r--tests/auto/qstringbuilder2/tst_qstringbuilder2.cpp42
-rw-r--r--tests/auto/qstringbuilder3/qstringbuilder3.pro8
-rw-r--r--tests/auto/qstringbuilder3/tst_qstringbuilder3.cpp42
-rw-r--r--tests/auto/qstringbuilder4/qstringbuilder4.pro8
-rw-r--r--tests/auto/qstringbuilder4/tst_qstringbuilder4.cpp42
-rw-r--r--tests/auto/qstringlist/qstringlist.pro4
-rw-r--r--tests/auto/qstringlistmodel/tst_qstringlistmodel.cpp1
-rw-r--r--tests/auto/qstyle/qstyle.pro7
-rw-r--r--tests/auto/qstyle/tst_qstyle.cpp153
-rw-r--r--tests/auto/qstylesheetstyle/qstylesheetstyle.pro13
-rw-r--r--tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp59
-rw-r--r--tests/auto/qsvggenerator/qsvggenerator.pro7
-rw-r--r--tests/auto/qsvggenerator/tst_qsvggenerator.cpp4
-rw-r--r--tests/auto/qsvgrenderer/qsvgrenderer.pro2
-rw-r--r--tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp651
-rw-r--r--tests/auto/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp31
-rw-r--r--tests/auto/qsysinfo/qsysinfo.pro1
-rw-r--r--tests/auto/qsystemsemaphore/test/test.pro11
-rw-r--r--tests/auto/qsystemsemaphore/tst_qsystemsemaphore.cpp14
-rw-r--r--tests/auto/qtabbar/tst_qtabbar.cpp36
-rw-r--r--tests/auto/qtableview/qtableview.pro2
-rw-r--r--tests/auto/qtableview/tst_qtableview.cpp94
-rw-r--r--tests/auto/qtablewidget/qtablewidget.pro12
-rw-r--r--tests/auto/qtconcurrentfilter/tst_qtconcurrentfilter.cpp2
-rw-r--r--tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp2
-rw-r--r--tests/auto/qtcpserver/crashingServer/main.cpp8
-rw-r--r--tests/auto/qtcpserver/test/test.pro6
-rw-r--r--tests/auto/qtcpserver/tst_qtcpserver.cpp158
-rw-r--r--tests/auto/qtcpsocket/qtcpsocket.pro2
-rw-r--r--tests/auto/qtcpsocket/test/test.pro5
-rw-r--r--tests/auto/qtcpsocket/tst_qtcpsocket.cpp113
-rw-r--r--tests/auto/qtemporaryfile/qtemporaryfile.pro9
-rw-r--r--tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp8
-rw-r--r--tests/auto/qtextblock/tst_qtextblock.cpp2
-rw-r--r--tests/auto/qtextboundaryfinder/qtextboundaryfinder.pro5
-rw-r--r--tests/auto/qtextboundaryfinder/tst_qtextboundaryfinder.cpp3
-rw-r--r--tests/auto/qtextbrowser/qtextbrowser.pro4
-rw-r--r--tests/auto/qtextbrowser/tst_qtextbrowser.cpp13
-rw-r--r--tests/auto/qtextcodec/test/test.pro28
-rw-r--r--tests/auto/qtextcodec/tst_qtextcodec.cpp139
-rw-r--r--tests/auto/qtextdocument/tst_qtextdocument.cpp108
-rw-r--r--tests/auto/qtextdocumentfragment/tst_qtextdocumentfragment.cpp10
-rw-r--r--tests/auto/qtextdocumentlayout/tst_qtextdocumentlayout.cpp21
-rw-r--r--tests/auto/qtextedit/qtextedit.pro9
-rw-r--r--tests/auto/qtextedit/tst_qtextedit.cpp43
-rw-r--r--tests/auto/qtextlayout/qtextlayout.pro3
-rw-r--r--tests/auto/qtextlayout/tst_qtextlayout.cpp6
-rw-r--r--tests/auto/qtextlist/tst_qtextlist.cpp76
-rw-r--r--tests/auto/qtextodfwriter/qtextodfwriter.pro4
-rw-r--r--tests/auto/qtextodfwriter/tst_qtextodfwriter.cpp6
-rw-r--r--tests/auto/qtextpiecetable/qtextpiecetable.pro5
-rw-r--r--tests/auto/qtextpiecetable/tst_qtextpiecetable.cpp32
-rw-r--r--tests/auto/qtextstream/test/test.pro17
-rw-r--r--tests/auto/qtextstream/tst_qtextstream.cpp49
-rw-r--r--tests/auto/qthread/qthread.pro3
-rw-r--r--tests/auto/qthread/tst_qthread.cpp2
-rw-r--r--tests/auto/qthreadonce/tst_qthreadonce.cpp2
-rw-r--r--tests/auto/qthreadpool/tst_qthreadpool.cpp6
-rw-r--r--tests/auto/qthreadstorage/qthreadstorage.pro3
-rw-r--r--tests/auto/qtime/qtime.pro3
-rw-r--r--tests/auto/qtimeline/qtimeline.pro3
-rw-r--r--tests/auto/qtimeline/tst_qtimeline.cpp41
-rw-r--r--tests/auto/qtimer/qtimer.pro3
-rw-r--r--tests/auto/qtimer/tst_qtimer.cpp105
-rw-r--r--tests/auto/qtoolbar/tst_qtoolbar.cpp4
-rw-r--r--tests/auto/qtoolbutton/tst_qtoolbutton.cpp49
-rw-r--r--tests/auto/qtouchevent/qtouchevent.pro3
-rw-r--r--tests/auto/qtouchevent/tst_qtouchevent.cpp1064
-rw-r--r--tests/auto/qtransform/qtransform.pro2
-rw-r--r--tests/auto/qtransform/tst_qtransform.cpp9
-rw-r--r--tests/auto/qtransformedscreen/qtransformedscreen.pro1
-rw-r--r--tests/auto/qtranslator/qtranslator.pro2
-rw-r--r--tests/auto/qtreeview/tst_qtreeview.cpp199
-rw-r--r--tests/auto/qtreewidget/tst_qtreewidget.cpp217
-rw-r--r--tests/auto/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp10
-rw-r--r--tests/auto/qtwidgets/qtwidgets.pro1
-rw-r--r--tests/auto/qtwidgets/tst_qtwidgets.cpp13
-rw-r--r--tests/auto/qudpsocket/test/test.pro2
-rw-r--r--tests/auto/qudpsocket/tst_qudpsocket.cpp127
-rw-r--r--tests/auto/qudpsocket/udpServer/udpServer.pro1
-rw-r--r--tests/auto/qurl/qurl.pro5
-rw-r--r--tests/auto/qurl/tst_qurl.cpp143
-rw-r--r--tests/auto/quuid/quuid.pro3
-rw-r--r--tests/auto/qvariant/qvariant.pro1
-rw-r--r--tests/auto/qvariant/tst_qvariant.cpp232
-rw-r--r--tests/auto/qvarlengtharray/qvarlengtharray.pro3
-rw-r--r--tests/auto/qvector/qvector.pro5
-rw-r--r--tests/auto/qvectornd/qvectornd.pro2
-rw-r--r--tests/auto/qvectornd/tst_qvectornd.cpp2143
-rw-r--r--tests/auto/qvideoframe/qvideoframe.pro5
-rw-r--r--tests/auto/qvideoframe/tst_qvideoframe.cpp663
-rw-r--r--tests/auto/qvideosurfaceformat/qvideosurfaceformat.pro5
-rw-r--r--tests/auto/qvideosurfaceformat/tst_qvideosurfaceformat.cpp745
-rw-r--r--tests/auto/qwaitcondition/tst_qwaitcondition.cpp859
-rw-r--r--tests/auto/qwebelement/.gitignore1
-rw-r--r--tests/auto/qwebelement/dummy.cpp44
-rw-r--r--tests/auto/qwebelement/qwebelement.pro14
-rw-r--r--tests/auto/qwebhistory/.gitignore1
-rw-r--r--tests/auto/qwebhistory/dummy.cpp44
-rw-r--r--tests/auto/qwebhistory/qwebhistory.pro14
-rw-r--r--tests/auto/qwebhistoryinterface/.gitignore1
-rw-r--r--tests/auto/qwebhistoryinterface/dummy.cpp44
-rw-r--r--tests/auto/qwebhistoryinterface/qwebhistoryinterface.pro14
-rw-r--r--tests/auto/qwidget/qwidget.pro6
-rw-r--r--tests/auto/qwidget/tst_qwidget.cpp382
-rw-r--r--tests/auto/qwindowsurface/tst_qwindowsurface.cpp8
-rw-r--r--tests/auto/qwineventnotifier/qwineventnotifier.pro3
-rw-r--r--tests/auto/qwineventnotifier/tst_qwineventnotifier.cpp7
-rw-r--r--tests/auto/qwizard/qwizard.pro1
-rw-r--r--tests/auto/qwmatrix/qwmatrix.pro2
-rw-r--r--tests/auto/qwritelocker/qwritelocker.pro2
-rw-r--r--tests/auto/qwsembedwidget/qwsembedwidget.pro4
-rw-r--r--tests/auto/qwsinputmethod/qwsinputmethod.pro4
-rw-r--r--tests/auto/qwswindowsystem/qwswindowsystem.pro4
-rw-r--r--tests/auto/qxml/qxml.pro2
-rw-r--r--tests/auto/qxml/tst_qxml.cpp26
-rw-r--r--tests/auto/qxmlformatter/qxmlformatter.pro2
-rw-r--r--tests/auto/qxmlquery/qxmlquery.pro8
-rw-r--r--tests/auto/qxmlquery/tst_qxmlquery.cpp243
-rw-r--r--tests/auto/qxmlschema/.gitignore1
-rw-r--r--tests/auto/qxmlschema/qxmlschema.pro5
-rw-r--r--tests/auto/qxmlschema/tst_qxmlschema.cpp406
-rw-r--r--tests/auto/qxmlschemavalidator/.gitignore1
-rw-r--r--tests/auto/qxmlschemavalidator/qxmlschemavalidator.pro5
-rw-r--r--tests/auto/qxmlschemavalidator/tst_qxmlschemavalidator.cpp479
-rw-r--r--tests/auto/qxmlsimplereader/parser/main.cpp1
-rw-r--r--tests/auto/qxmlsimplereader/qxmlsimplereader.pro4
-rw-r--r--tests/auto/qxmlsimplereader/tst_qxmlsimplereader.cpp8
-rw-r--r--tests/auto/qxmlstream/qxmlstream.pro2
-rw-r--r--tests/auto/qxmlstream/tst_qxmlstream.cpp122
-rw-r--r--tests/auto/qzip/qzip.pro4
-rw-r--r--tests/auto/qzip/tst_qzip.cpp4
-rwxr-xr-xtests/auto/runQtXmlPatternsTests.sh100
-rw-r--r--tests/auto/selftests/badxml/badxml.pro11
-rw-r--r--tests/auto/selftests/badxml/tst_badxml.cpp206
-rw-r--r--tests/auto/selftests/benchlibwalltime/tst_benchlibwalltime.cpp11
-rw-r--r--tests/auto/selftests/cmptest/tst_cmptest.cpp46
-rw-r--r--tests/auto/selftests/exception/exception.pro9
-rw-r--r--tests/auto/selftests/exception/tst_exception.cpp69
-rw-r--r--tests/auto/selftests/exceptionthrow/exceptionthrow.pro9
-rw-r--r--tests/auto/selftests/exceptionthrow/tst_exceptionthrow.cpp69
-rw-r--r--tests/auto/selftests/expected_benchlibwalltime.txt5
-rw-r--r--tests/auto/selftests/expected_cmptest.txt20
-rw-r--r--tests/auto/selftests/expected_crashes_3.txt8
-rw-r--r--tests/auto/selftests/expected_exceptionthrow.txt (renamed from tests/auto/selftests/expected_exception.txt)0
-rw-r--r--tests/auto/selftests/expected_longstring.txt16
-rw-r--r--tests/auto/selftests/expected_maxwarnings.txt4
-rw-r--r--tests/auto/selftests/expected_skip.txt8
-rw-r--r--tests/auto/selftests/expected_xunit.txt40
-rw-r--r--tests/auto/selftests/longstring/longstring.pro10
-rw-r--r--tests/auto/selftests/longstring/tst_longstring.cpp72
-rw-r--r--tests/auto/selftests/selftests.pro4
-rw-r--r--tests/auto/selftests/selftests.qrc5
-rw-r--r--tests/auto/selftests/tst_selftests.cpp108
-rwxr-xr-xtests/auto/selftests/xunit/tst_xunitbin0 -> 11624 bytes-rw-r--r--tests/auto/selftests/xunit/tst_xunit.cpp115
-rw-r--r--tests/auto/selftests/xunit/xunit.pro8
-rw-r--r--tests/auto/symbian/orientationchange/orientationchange.pro7
-rw-r--r--tests/auto/symbian/orientationchange/tst_orientationchange.cpp165
-rw-r--r--tests/auto/symbian/qmainexceptions/qmainexceptions.pro3
-rw-r--r--tests/auto/symbian/qmainexceptions/tst_qmainexceptions.cpp468
-rw-r--r--tests/auto/symbian/qsymbiantests.pro4
-rw-r--r--tests/auto/symbols/tst_symbols.cpp10
-rwxr-xr-xtests/auto/test.pl4
-rw-r--r--tests/auto/tests.xml10
-rw-r--r--tests/auto/uic/baseline/Dialog_with_Buttons_Bottom.ui.h8
-rw-r--r--tests/auto/uic/baseline/Dialog_with_Buttons_Right.ui.h8
-rw-r--r--tests/auto/uic/baseline/Dialog_without_Buttons.ui.h8
-rw-r--r--tests/auto/uic/baseline/Main_Window.ui.h8
-rw-r--r--tests/auto/uic/baseline/Widget.ui.h8
-rw-r--r--tests/auto/uic/baseline/addlinkdialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/addtorrentform.ui.h14
-rw-r--r--tests/auto/uic/baseline/authenticationdialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/backside.ui.h8
-rw-r--r--tests/auto/uic/baseline/batchtranslation.ui2
-rw-r--r--tests/auto/uic/baseline/batchtranslation.ui.h28
-rw-r--r--tests/auto/uic/baseline/bookmarkdialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/bookwindow.ui.h12
-rw-r--r--tests/auto/uic/baseline/browserwidget.ui.h14
-rw-r--r--tests/auto/uic/baseline/calculator.ui.h8
-rw-r--r--tests/auto/uic/baseline/calculatorform.ui.h18
-rw-r--r--tests/auto/uic/baseline/certificateinfo.ui.h8
-rw-r--r--tests/auto/uic/baseline/chatdialog.ui.h14
-rw-r--r--tests/auto/uic/baseline/chatmainwindow.ui.h14
-rw-r--r--tests/auto/uic/baseline/chatsetnickname.ui.h14
-rw-r--r--tests/auto/uic/baseline/config.ui2
-rw-r--r--tests/auto/uic/baseline/config.ui.h24
-rw-r--r--tests/auto/uic/baseline/connectdialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/controller.ui.h10
-rw-r--r--tests/auto/uic/baseline/cookies.ui.h8
-rw-r--r--tests/auto/uic/baseline/cookiesexceptions.ui.h8
-rw-r--r--tests/auto/uic/baseline/default.ui.h10
-rw-r--r--tests/auto/uic/baseline/dialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/downloaditem.ui.h10
-rw-r--r--tests/auto/uic/baseline/downloads.ui.h10
-rw-r--r--tests/auto/uic/baseline/embeddeddialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/filespage.ui.h8
-rw-r--r--tests/auto/uic/baseline/filternamedialog.ui.h10
-rw-r--r--tests/auto/uic/baseline/filterpage.ui.h8
-rw-r--r--tests/auto/uic/baseline/finddialog.ui2
-rw-r--r--tests/auto/uic/baseline/finddialog.ui.h26
-rw-r--r--tests/auto/uic/baseline/form.ui.h16
-rw-r--r--tests/auto/uic/baseline/formwindowsettings.ui2
-rw-r--r--tests/auto/uic/baseline/formwindowsettings.ui.h30
-rw-r--r--tests/auto/uic/baseline/generalpage.ui.h8
-rw-r--r--tests/auto/uic/baseline/gridpanel.ui.h8
-rw-r--r--tests/auto/uic/baseline/helpdialog.ui2
-rw-r--r--tests/auto/uic/baseline/helpdialog.ui.h32
-rw-r--r--tests/auto/uic/baseline/history.ui.h8
-rw-r--r--tests/auto/uic/baseline/identifierpage.ui.h8
-rw-r--r--tests/auto/uic/baseline/imagedialog.ui.h14
-rw-r--r--tests/auto/uic/baseline/inputpage.ui.h8
-rw-r--r--tests/auto/uic/baseline/installdialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/languagesdialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/listwidgeteditor.ui2
-rw-r--r--tests/auto/uic/baseline/listwidgeteditor.ui.h18
-rw-r--r--tests/auto/uic/baseline/mainwindow.ui.h26
-rw-r--r--tests/auto/uic/baseline/mainwindowbase.ui2
-rw-r--r--tests/auto/uic/baseline/mainwindowbase.ui.h56
-rw-r--r--tests/auto/uic/baseline/mydialog.ui.h10
-rw-r--r--tests/auto/uic/baseline/myform.ui.h12
-rw-r--r--tests/auto/uic/baseline/newactiondialog.ui2
-rw-r--r--tests/auto/uic/baseline/newactiondialog.ui.h16
-rw-r--r--tests/auto/uic/baseline/newdynamicpropertydialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/newform.ui2
-rw-r--r--tests/auto/uic/baseline/newform.ui.h20
-rw-r--r--tests/auto/uic/baseline/orderdialog.ui2
-rw-r--r--tests/auto/uic/baseline/orderdialog.ui.h16
-rw-r--r--tests/auto/uic/baseline/outputpage.ui.h8
-rw-r--r--tests/auto/uic/baseline/pagefold.ui.h12
-rw-r--r--tests/auto/uic/baseline/paletteeditor.ui2
-rw-r--r--tests/auto/uic/baseline/paletteeditor.ui.h22
-rw-r--r--tests/auto/uic/baseline/paletteeditoradvancedbase.ui2
-rw-r--r--tests/auto/uic/baseline/paletteeditoradvancedbase.ui.h34
-rw-r--r--tests/auto/uic/baseline/passworddialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/pathpage.ui.h8
-rw-r--r--tests/auto/uic/baseline/phrasebookbox.ui2
-rw-r--r--tests/auto/uic/baseline/phrasebookbox.ui.h18
-rw-r--r--tests/auto/uic/baseline/plugindialog.ui2
-rw-r--r--tests/auto/uic/baseline/plugindialog.ui.h16
-rw-r--r--tests/auto/uic/baseline/preferencesdialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/previewconfigurationwidget.ui.h8
-rw-r--r--tests/auto/uic/baseline/previewdialogbase.ui.h16
-rw-r--r--tests/auto/uic/baseline/previewwidget.ui2
-rw-r--r--tests/auto/uic/baseline/previewwidget.ui.h26
-rw-r--r--tests/auto/uic/baseline/previewwidgetbase.ui4
-rw-r--r--tests/auto/uic/baseline/previewwidgetbase.ui.h32
-rw-r--r--tests/auto/uic/baseline/proxy.ui.h8
-rw-r--r--tests/auto/uic/baseline/qfiledialog.ui2
-rw-r--r--tests/auto/uic/baseline/qfiledialog.ui.h16
-rw-r--r--tests/auto/uic/baseline/qpagesetupwidget.ui.h10
-rw-r--r--tests/auto/uic/baseline/qprintpropertieswidget.ui.h10
-rw-r--r--tests/auto/uic/baseline/qprintsettingsoutput.ui.h14
-rw-r--r--tests/auto/uic/baseline/qprintwidget.ui.h10
-rw-r--r--tests/auto/uic/baseline/qsqlconnectiondialog.ui.h16
-rw-r--r--tests/auto/uic/baseline/qtgradientdialog.ui2
-rw-r--r--tests/auto/uic/baseline/qtgradientdialog.ui.h16
-rw-r--r--tests/auto/uic/baseline/qtgradienteditor.ui.h8
-rw-r--r--tests/auto/uic/baseline/qtgradientview.ui.h8
-rw-r--r--tests/auto/uic/baseline/qtgradientviewdialog.ui2
-rw-r--r--tests/auto/uic/baseline/qtgradientviewdialog.ui.h16
-rw-r--r--tests/auto/uic/baseline/qtresourceeditordialog.ui.h8
-rw-r--r--tests/auto/uic/baseline/qttoolbardialog.ui.h14
-rw-r--r--tests/auto/uic/baseline/querywidget.ui.h14
-rw-r--r--tests/auto/uic/baseline/remotecontrol.ui.h12
-rw-r--r--tests/auto/uic/baseline/saveformastemplate.ui2
-rw-r--r--tests/auto/uic/baseline/saveformastemplate.ui.h16
-rw-r--r--tests/auto/uic/baseline/settings.ui.h8
-rw-r--r--tests/auto/uic/baseline/signalslotdialog.ui.h14
-rw-r--r--tests/auto/uic/baseline/sslclient.ui.h8
-rw-r--r--tests/auto/uic/baseline/sslerrors.ui.h8
-rw-r--r--tests/auto/uic/baseline/statistics.ui2
-rw-r--r--tests/auto/uic/baseline/statistics.ui.h20
-rw-r--r--tests/auto/uic/baseline/stringlisteditor.ui2
-rw-r--r--tests/auto/uic/baseline/stringlisteditor.ui.h28
-rw-r--r--tests/auto/uic/baseline/stylesheeteditor.ui.h12
-rw-r--r--tests/auto/uic/baseline/tabbedbrowser.ui2
-rw-r--r--tests/auto/uic/baseline/tabbedbrowser.ui.h22
-rw-r--r--tests/auto/uic/baseline/tablewidgeteditor.ui2
-rw-r--r--tests/auto/uic/baseline/tablewidgeteditor.ui.h18
-rw-r--r--tests/auto/uic/baseline/tetrixwindow.ui.h12
-rw-r--r--tests/auto/uic/baseline/textfinder.ui.h12
-rw-r--r--tests/auto/uic/baseline/topicchooser.ui.h12
-rw-r--r--tests/auto/uic/baseline/translatedialog.ui2
-rw-r--r--tests/auto/uic/baseline/translatedialog.ui.h20
-rw-r--r--tests/auto/uic/baseline/translationsettings.ui.h12
-rw-r--r--tests/auto/uic/baseline/treewidgeteditor.ui2
-rw-r--r--tests/auto/uic/baseline/treewidgeteditor.ui.h16
-rw-r--r--tests/auto/uic/baseline/trpreviewtool.ui2
-rw-r--r--tests/auto/uic/baseline/trpreviewtool.ui.h18
-rw-r--r--tests/auto/uic/baseline/validators.ui.h30
-rw-r--r--tests/auto/uic/baseline/wateringconfigdialog.ui.h8
-rw-r--r--tests/auto/uic3/baseline/licenseagreementpage.ui3
-rw-r--r--tests/auto/uic3/baseline/licenseagreementpage.ui.42
-rw-r--r--tests/auto/uic3/baseline/listboxeditor.ui.42
-rw-r--r--tests/auto/uic3/baseline/listeditor.ui2
-rw-r--r--tests/auto/uic3/baseline/listeditor.ui.42
-rw-r--r--tests/auto/uic3/baseline/listvieweditor.ui2
-rw-r--r--tests/auto/uic3/baseline/listvieweditor.ui.42
-rw-r--r--tests/auto/uic3/baseline/mainfilesettings.ui2
-rw-r--r--tests/auto/uic3/baseline/mainfilesettings.ui.42
-rw-r--r--tests/auto/uic3/baseline/mainwindowbase.ui2
-rw-r--r--tests/auto/uic3/baseline/mainwindowbase.ui.42
-rw-r--r--tests/auto/uic3/baseline/mainwindowwizard.ui2
-rw-r--r--tests/auto/uic3/baseline/mainwindowwizard.ui.42
-rw-r--r--tests/auto/uic3/baseline/multilineeditor.ui2
-rw-r--r--tests/auto/uic3/baseline/multilineeditor.ui.42
-rw-r--r--tests/auto/uic3/baseline/newform.ui2
-rw-r--r--tests/auto/uic3/baseline/newform.ui.42
-rw-r--r--tests/auto/uic3/baseline/paletteeditor.ui2
-rw-r--r--tests/auto/uic3/baseline/paletteeditor.ui.42
-rw-r--r--tests/auto/uic3/baseline/paletteeditoradvanced.ui2
-rw-r--r--tests/auto/uic3/baseline/paletteeditoradvanced.ui.42
-rw-r--r--tests/auto/uic3/baseline/paletteeditoradvancedbase.ui2
-rw-r--r--tests/auto/uic3/baseline/paletteeditoradvancedbase.ui.42
-rw-r--r--tests/auto/uic3/baseline/pixmapcollectioneditor.ui2
-rw-r--r--tests/auto/uic3/baseline/pixmapcollectioneditor.ui.42
-rw-r--r--tests/auto/uic3/baseline/pixmapfunction.ui2
-rw-r--r--tests/auto/uic3/baseline/pixmapfunction.ui.42
-rw-r--r--tests/auto/uic3/baseline/preferences.ui2
-rw-r--r--tests/auto/uic3/baseline/preferences.ui.42
-rw-r--r--tests/auto/uic3/baseline/previewwidget.ui4
-rw-r--r--tests/auto/uic3/baseline/previewwidget.ui.44
-rw-r--r--tests/auto/uic3/baseline/previewwidgetbase.ui4
-rw-r--r--tests/auto/uic3/baseline/previewwidgetbase.ui.44
-rw-r--r--tests/auto/uic3/baseline/projectsettings.ui2
-rw-r--r--tests/auto/uic3/baseline/projectsettings.ui.42
-rw-r--r--tests/auto/uic3/baseline/qactivexselect.ui42
-rw-r--r--tests/auto/uic3/baseline/qactivexselect.ui.442
-rw-r--r--tests/auto/uic3/baseline/replacedialog.ui2
-rw-r--r--tests/auto/uic3/baseline/replacedialog.ui.42
-rw-r--r--tests/auto/uic3/baseline/richtextfontdialog.ui2
-rw-r--r--tests/auto/uic3/baseline/richtextfontdialog.ui.42
-rw-r--r--tests/auto/uic3/baseline/settingsdialog.ui2
-rw-r--r--tests/auto/uic3/baseline/settingsdialog.ui.42
-rw-r--r--tests/auto/uic3/baseline/sqlformwizard.ui2
-rw-r--r--tests/auto/uic3/baseline/sqlformwizard.ui.42
-rw-r--r--tests/auto/uic3/baseline/startdialog.ui2
-rw-r--r--tests/auto/uic3/baseline/startdialog.ui.42
-rw-r--r--tests/auto/uic3/baseline/statistics.ui2
-rw-r--r--tests/auto/uic3/baseline/statistics.ui.42
-rw-r--r--tests/auto/uic3/baseline/tabbedbrowser.ui2
-rw-r--r--tests/auto/uic3/baseline/tabbedbrowser.ui.42
-rw-r--r--tests/auto/uic3/baseline/tableeditor.ui2
-rw-r--r--tests/auto/uic3/baseline/tableeditor.ui.42
-rw-r--r--tests/auto/uic3/baseline/topicchooser.ui2
-rw-r--r--tests/auto/uic3/baseline/topicchooser.ui.42
-rw-r--r--tests/auto/uic3/baseline/variabledialog.ui2
-rw-r--r--tests/auto/uic3/baseline/variabledialog.ui.42
-rw-r--r--tests/auto/uic3/baseline/wizardeditor.ui.42
-rw-r--r--tests/auto/uiloader/baseline/batchtranslation.ui2
-rw-r--r--tests/auto/uiloader/baseline/config.ui2
-rw-r--r--tests/auto/uiloader/baseline/css_borderimage.ui125
-rw-r--r--tests/auto/uiloader/baseline/css_borderimage_allwidgets.ui247
-rw-r--r--tests/auto/uiloader/baseline/css_borderradius_allwidgets.ui458
-rw-r--r--tests/auto/uiloader/baseline/css_scrollarea_base.ui197
-rw-r--r--tests/auto/uiloader/baseline/css_splitter.ui63
-rw-r--r--tests/auto/uiloader/baseline/css_tab_closebutton.ui128
-rw-r--r--tests/auto/uiloader/baseline/css_task255849_downarrow.ui144
-rw-r--r--tests/auto/uiloader/baseline/css_task259226_spinboxes.ui83
-rw-r--r--tests/auto/uiloader/baseline/finddialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/formwindowsettings.ui2
-rw-r--r--tests/auto/uiloader/baseline/helpdialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/images/arrow-down.pngbin0 -> 1006 bytes-rw-r--r--tests/auto/uiloader/baseline/images/arrow-up.pngbin0 -> 927 bytes-rw-r--r--tests/auto/uiloader/baseline/images/borderimage.pngbin0 -> 1672 bytes-rw-r--r--tests/auto/uiloader/baseline/images/splitter_horizontal.pngbin0 -> 199 bytes-rw-r--r--tests/auto/uiloader/baseline/images/splitter_vertical.pngbin0 -> 193 bytes-rw-r--r--tests/auto/uiloader/baseline/listwidgeteditor.ui2
-rw-r--r--tests/auto/uiloader/baseline/mainwindowbase.ui2
-rw-r--r--tests/auto/uiloader/baseline/newactiondialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/newform.ui2
-rw-r--r--tests/auto/uiloader/baseline/orderdialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/paletteeditor.ui2
-rw-r--r--tests/auto/uiloader/baseline/paletteeditoradvancedbase.ui2
-rw-r--r--tests/auto/uiloader/baseline/phrasebookbox.ui2
-rw-r--r--tests/auto/uiloader/baseline/plugindialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/previewwidget.ui2
-rw-r--r--tests/auto/uiloader/baseline/previewwidgetbase.ui4
-rw-r--r--tests/auto/uiloader/baseline/qfiledialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/qtgradientdialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/qtgradienteditor.ui2
-rw-r--r--tests/auto/uiloader/baseline/qtgradientviewdialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/saveformastemplate.ui2
-rw-r--r--tests/auto/uiloader/baseline/statistics.ui2
-rw-r--r--tests/auto/uiloader/baseline/stringlisteditor.ui2
-rw-r--r--tests/auto/uiloader/baseline/tabbedbrowser.ui2
-rw-r--r--tests/auto/uiloader/baseline/tablewidgeteditor.ui2
-rw-r--r--tests/auto/uiloader/baseline/translatedialog.ui2
-rw-r--r--tests/auto/uiloader/baseline/treewidgeteditor.ui2
-rw-r--r--tests/auto/uiloader/baseline/trpreviewtool.ui2
-rw-r--r--tests/auto/uiloader/uiloader/tst_uiloader.cpp3
-rw-r--r--tests/auto/uiloader/uiloader/uiloader.pro4
-rw-r--r--tests/auto/utf8/tst_utf8.cpp11
-rw-r--r--tests/auto/windowsmobile/test/test.pro3
-rw-r--r--tests/auto/windowsmobile/test/tst_windowsmobile.cpp4
-rw-r--r--tests/auto/xmlpatterns.pri14
-rw-r--r--tests/auto/xmlpatterns/tst_xmlpatterns.cpp136
-rw-r--r--tests/auto/xmlpatterns/xmlpatterns.pro6
-rw-r--r--tests/auto/xmlpatternsdiagnosticsts/test/tst_xmlpatternsdiagnosticsts.cpp10
-rw-r--r--tests/auto/xmlpatternsdiagnosticsts/xmlpatternsdiagnosticsts.pro1
-rw-r--r--tests/auto/xmlpatternsschema/.gitignore1
-rw-r--r--tests/auto/xmlpatternsschema/tst_xmlpatternsschema.cpp1028
-rw-r--r--tests/auto/xmlpatternsschema/xmlpatternsschema.pro6
-rw-r--r--tests/auto/xmlpatternsschemats/.gitignore4
-rw-r--r--tests/auto/xmlpatternsschemats/Baseline.xml2
-rw-r--r--tests/auto/xmlpatternsschemats/TESTSUITE/.gitignore3
-rw-r--r--tests/auto/xmlpatternsschemats/TESTSUITE/unifyCatalog.xsl21
-rwxr-xr-xtests/auto/xmlpatternsschemats/TESTSUITE/updateSuite.sh20
-rw-r--r--tests/auto/xmlpatternsschemats/tst_xmlpatternsschemats.cpp78
-rw-r--r--tests/auto/xmlpatternsschemats/xmlpatternsschemats.pro23
-rw-r--r--tests/auto/xmlpatternsvalidator/files/instance.xml3
-rw-r--r--tests/auto/xmlpatternsvalidator/files/invalid_schema.xsd12
-rw-r--r--tests/auto/xmlpatternsvalidator/files/other_valid_schema.xsd12
-rw-r--r--tests/auto/xmlpatternsvalidator/files/sa_invalid_instance.xml3
-rw-r--r--tests/auto/xmlpatternsvalidator/files/sa_valid_instance.xml3
-rw-r--r--tests/auto/xmlpatternsvalidator/files/valid_schema.xsd12
-rw-r--r--tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp208
-rw-r--r--tests/auto/xmlpatternsvalidator/xmlpatternsvalidator.pro5
-rw-r--r--tests/auto/xmlpatternsview/view/MainWindow.cpp32
-rw-r--r--tests/auto/xmlpatternsview/view/MainWindow.h6
-rw-r--r--tests/auto/xmlpatternsview/view/ui_MainWindow.ui9
-rw-r--r--tests/auto/xmlpatternsview/xmlpatternsview.pro1
-rw-r--r--tests/auto/xmlpatternsxqts/lib/TestBaseLine.cpp7
-rw-r--r--tests/auto/xmlpatternsxqts/lib/TestBaseLine.h9
-rw-r--r--tests/auto/xmlpatternsxqts/lib/TestGroup.cpp6
-rw-r--r--tests/auto/xmlpatternsxqts/lib/TestSuite.cpp26
-rw-r--r--tests/auto/xmlpatternsxqts/lib/TestSuite.h14
-rw-r--r--tests/auto/xmlpatternsxqts/lib/TreeModel.cpp9
-rw-r--r--tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp375
-rw-r--r--tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.h159
-rw-r--r--tests/auto/xmlpatternsxqts/lib/XSDTestSuiteHandler.cpp910
-rw-r--r--tests/auto/xmlpatternsxqts/lib/XSDTestSuiteHandler.h119
-rw-r--r--tests/auto/xmlpatternsxqts/lib/lib.pro4
-rw-r--r--tests/auto/xmlpatternsxqts/test/tst_suitetest.cpp15
-rw-r--r--tests/auto/xmlpatternsxqts/test/tst_suitetest.h14
-rw-r--r--tests/auto/xmlpatternsxqts/test/tst_xmlpatternsxqts.cpp2
-rw-r--r--tests/auto/xmlpatternsxqts/xmlpatternsxqts.pro3
-rwxr-xr-xtests/auto/xmlpatternsxslts/XSLTS/updateSuite.sh4
-rw-r--r--tests/auto/xmlpatternsxslts/tst_xmlpatternsxslts.cpp2
-rw-r--r--tests/auto/xmlpatternsxslts/xmlpatternsxslts.pro1
-rw-r--r--tests/benchmarks/benchmarks.pro6
-rw-r--r--tests/benchmarks/qanimation/dummyanimation.cpp61
-rw-r--r--tests/benchmarks/qanimation/dummyanimation.h60
-rw-r--r--tests/benchmarks/qanimation/dummyobject.cpp66
-rw-r--r--tests/benchmarks/qanimation/dummyobject.h64
-rw-r--r--tests/benchmarks/qanimation/main.cpp191
-rw-r--r--tests/benchmarks/qanimation/qanimation.pro18
-rw-r--r--tests/benchmarks/qanimation/rectanimation.cpp99
-rw-r--r--tests/benchmarks/qanimation/rectanimation.h71
-rw-r--r--tests/benchmarks/qdir/qdir.pro8
-rw-r--r--tests/benchmarks/qdir/tst_qdir.cpp162
-rw-r--r--tests/benchmarks/qdiriterator/main.cpp2
-rw-r--r--tests/benchmarks/qdiriterator/qfilesystemiterator.cpp19
-rw-r--r--tests/benchmarks/qfile/main.cpp17
-rw-r--r--tests/benchmarks/qgraphicsanchorlayout/qgraphicsanchorlayout.pro6
-rw-r--r--tests/benchmarks/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp197
-rw-r--r--tests/benchmarks/qgraphicsitem/qgraphicsitem.pro5
-rw-r--r--tests/benchmarks/qgraphicsitem/tst_qgraphicsitem.cpp243
-rw-r--r--tests/benchmarks/qgraphicsscene/tst_qgraphicsscene.cpp5
-rw-r--r--tests/benchmarks/qgraphicsview/benchapps/scrolltest/main.cpp2
-rw-r--r--tests/benchmarks/qgraphicsview/images/wine-big.jpegbin0 -> 12249 bytes-rw-r--r--tests/benchmarks/qgraphicsview/images/wine.jpegbin0 -> 2265 bytes-rw-r--r--tests/benchmarks/qgraphicsview/qgraphicsview.qrc2
-rw-r--r--tests/benchmarks/qgraphicsview/tst_qgraphicsview.cpp210
-rw-r--r--tests/benchmarks/qiodevice/main.cpp2
-rwxr-xr-xtests/benchmarks/qiodevice/qiodevice.pro1
-rw-r--r--tests/benchmarks/qmatrix4x4/qmatrix4x4.pro6
-rw-r--r--tests/benchmarks/qmatrix4x4/tst_qmatrix4x4.cpp672
-rw-r--r--tests/benchmarks/qnetworkreply/main.cpp74
-rw-r--r--tests/benchmarks/qnetworkreply/qnetworkreply.pro13
-rw-r--r--tests/benchmarks/qpixmapcache/qpixmapcache.pro6
-rw-r--r--tests/benchmarks/qpixmapcache/tst_qpixmapcache.cpp226
-rw-r--r--tests/benchmarks/qquaternion/qquaternion.pro6
-rw-r--r--tests/benchmarks/qquaternion/tst_qquaternion.cpp124
-rw-r--r--tests/benchmarks/qscriptclass/qscriptclass.pro7
-rw-r--r--tests/benchmarks/qscriptclass/tst_qscriptclass.cpp511
-rw-r--r--tests/benchmarks/qscriptengine/qscriptengine.pro7
-rw-r--r--tests/benchmarks/qscriptengine/tst_qscriptengine.cpp246
-rw-r--r--tests/benchmarks/qscriptvalue/qscriptvalue.pro7
-rw-r--r--tests/benchmarks/qscriptvalue/tst_qscriptvalue.cpp205
-rw-r--r--tests/benchmarks/qstring/main.cpp141
-rw-r--r--tests/benchmarks/qstring/qstring.pro12
-rw-r--r--tests/benchmarks/qstring/utf-8.txt72
-rw-r--r--tests/benchmarks/qstringbuilder/main.cpp464
-rw-r--r--tests/benchmarks/qstringbuilder/qstringbuilder.pro12
-rw-r--r--tests/benchmarks/qstringlist/main.cpp112
-rw-r--r--tests/benchmarks/qsvgrenderer/data/tiger.svg730
-rw-r--r--tests/benchmarks/qsvgrenderer/qsvgrenderer.pro9
-rw-r--r--tests/benchmarks/qsvgrenderer/qsvgrenderer.qrc6
-rw-r--r--tests/benchmarks/qsvgrenderer/tst_qsvgrenderer.cpp103
-rw-r--r--tests/benchmarks/qtableview/qtableview.pro6
-rw-r--r--tests/benchmarks/qtableview/tst_qtableview.cpp193
-rw-r--r--tests/benchmarks/qvariant/qvariant.pro1
-rw-r--r--tests/benchmarks/qvariant/tst_qvariant.cpp115
-rw-r--r--tests/manual/gestures/pinch/main.cpp68
-rw-r--r--tests/manual/gestures/pinch/pinch.pro4
-rw-r--r--tests/manual/gestures/pinch/pinch.qrc5
-rw-r--r--tests/manual/gestures/pinch/pinchwidget.cpp118
-rw-r--r--tests/manual/gestures/pinch/pinchwidget.h78
-rw-r--r--tests/manual/gestures/pinch/qt-logo.pngbin0 -> 13923 bytes-rw-r--r--tests/manual/gestures/twopanwidgets/main.cpp135
-rw-r--r--tests/manual/gestures/twopanwidgets/twopanwidgets.pro1
-rw-r--r--tests/manual/qdesktopwidget/main.cpp219
-rw-r--r--tests/manual/qdesktopwidget/qdesktopwidget.pro2
-rw-r--r--tests/manual/qhttpnetworkconnection/main.cpp81
-rw-r--r--tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro13
-rw-r--r--tests/manual/qimagereader/Qt_logostrap_CMYK.jpgbin0 -> 252255 bytes-rw-r--r--tests/manual/qimagereader/main.cpp99
-rw-r--r--tests/manual/qimagereader/qimagereader.pro8
-rw-r--r--tests/manual/qtabletevent/device_information/main.cpp50
-rw-r--r--tests/manual/qtabletevent/device_information/qtabletevent.pro13
-rw-r--r--tests/manual/qtabletevent/device_information/tabletwidget.cpp191
-rw-r--r--tests/manual/qtabletevent/device_information/tabletwidget.h73
-rw-r--r--tests/manual/qtabletevent/event_compression/event_compression.pro7
-rw-r--r--tests/manual/qtabletevent/event_compression/main.cpp58
-rw-r--r--tests/manual/qtabletevent/event_compression/mousestatwidget.cpp99
-rw-r--r--tests/manual/qtabletevent/event_compression/mousestatwidget.h69
-rw-r--r--tests/manual/qtouchevent/form.ui1897
-rw-r--r--tests/manual/qtouchevent/main.cpp595
-rw-r--r--tests/manual/qtouchevent/multitouch.pro5
-rw-r--r--tests/manual/qtouchevent/touchwidget.cpp135
-rw-r--r--tests/manual/qtouchevent/touchwidget.h72
-rw-r--r--tests/manual/windowflags/controllerwindow.cpp263
-rw-r--r--tests/manual/windowflags/controllerwindow.h115
-rw-r--r--tests/manual/windowflags/main.cpp52
-rw-r--r--tests/manual/windowflags/previewwindow.cpp146
-rw-r--r--tests/manual/windowflags/previewwindow.h81
-rw-r--r--tests/manual/windowflags/windowflags.pro5
-rw-r--r--tools/activeqt/dumpcpp/main.cpp6
-rw-r--r--tools/assistant/compat/helpdialog.ui6
-rw-r--r--tools/assistant/compat/lib/lib.pro2
-rw-r--r--tools/assistant/compat/lib/qassistantclient.cpp1
-rw-r--r--tools/assistant/compat/mainwindow.cpp23
-rw-r--r--tools/assistant/lib/lib.pro96
-rw-r--r--tools/assistant/lib/qhelpenginecore.cpp8
-rw-r--r--tools/assistant/lib/qhelpprojectdata.cpp61
-rw-r--r--tools/assistant/lib/qhelpsearchengine.cpp14
-rw-r--r--tools/assistant/lib/qhelpsearchindexreader.cpp106
-rw-r--r--tools/assistant/lib/qhelpsearchindexreader_clucene.cpp60
-rw-r--r--tools/assistant/lib/qhelpsearchindexreader_clucene_p.h36
-rw-r--r--tools/assistant/lib/qhelpsearchindexreader_default.cpp49
-rw-r--r--tools/assistant/lib/qhelpsearchindexreader_default_p.h37
-rw-r--r--tools/assistant/lib/qhelpsearchindexreader_p.h108
-rw-r--r--tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp78
-rw-r--r--tools/assistant/lib/qhelpsearchindexwriter_clucene_p.h2
-rw-r--r--tools/assistant/lib/qhelpsearchquerywidget.cpp295
-rw-r--r--tools/assistant/tools/assistant/assistant.qchbin368640 -> 368640 bytes-rw-r--r--tools/assistant/tools/assistant/assistant.rc31
-rw-r--r--tools/assistant/tools/assistant/centralwidget.cpp22
-rw-r--r--tools/assistant/tools/assistant/centralwidget.h3
-rw-r--r--tools/assistant/tools/assistant/doc/assistant.qdocconf2
-rw-r--r--tools/assistant/tools/assistant/doc/assistant.qhp2
-rw-r--r--tools/assistant/tools/assistant/helpviewer.cpp4
-rw-r--r--tools/assistant/tools/assistant/main.cpp20
-rw-r--r--tools/assistant/tools/assistant/mainwindow.cpp43
-rw-r--r--tools/assistant/tools/assistant/preferencesdialog.cpp41
-rw-r--r--tools/assistant/tools/assistant/preferencesdialog.h12
-rw-r--r--tools/assistant/tools/assistant/preferencesdialog.ui118
-rw-r--r--tools/assistant/tools/assistant/remotecontrol.cpp6
-rw-r--r--tools/assistant/tools/qhelpconverter/adpreader.cpp20
-rw-r--r--tools/assistant/tools/qhelpconverter/adpreader.h6
-rw-r--r--tools/checksdk/cesdkhandler.cpp7
-rw-r--r--tools/checksdk/cesdkhandler.h4
-rw-r--r--tools/checksdk/checksdk.pro39
-rw-r--r--tools/checksdk/main.cpp46
-rw-r--r--tools/configure/configure.pro6
-rw-r--r--tools/configure/configureapp.cpp491
-rw-r--r--tools/configure/configureapp.h4
-rw-r--r--tools/configure/environment.cpp218
-rw-r--r--tools/configure/main.cpp6
-rw-r--r--tools/configure/tools.cpp6
-rw-r--r--tools/designer/data/generate_shared.xsl4
-rw-r--r--tools/designer/data/ui4.xsd13
-rw-r--r--tools/designer/src/components/buddyeditor/buddyeditor.cpp6
-rw-r--r--tools/designer/src/components/buddyeditor/buddyeditor_plugin.cpp9
-rw-r--r--tools/designer/src/components/buddyeditor/buddyeditor_tool.cpp4
-rw-r--r--tools/designer/src/components/formeditor/brushmanagerproxy.cpp4
-rw-r--r--tools/designer/src/components/formeditor/brushmanagerproxy.h2
-rw-r--r--tools/designer/src/components/formeditor/default_actionprovider.cpp15
-rw-r--r--tools/designer/src/components/formeditor/default_actionprovider.h4
-rw-r--r--tools/designer/src/components/formeditor/embeddedoptionspage.cpp4
-rw-r--r--tools/designer/src/components/formeditor/formwindow.cpp13
-rw-r--r--tools/designer/src/components/formeditor/formwindowcursor.cpp4
-rw-r--r--tools/designer/src/components/formeditor/formwindowmanager.cpp26
-rw-r--r--tools/designer/src/components/formeditor/qdesigner_resource.cpp127
-rw-r--r--tools/designer/src/components/formeditor/qtbrushmanager.cpp5
-rw-r--r--tools/designer/src/components/formeditor/qtbrushmanager.h6
-rw-r--r--tools/designer/src/components/formeditor/tool_widgeteditor.cpp4
-rw-r--r--tools/designer/src/components/lib/lib.pro7
-rw-r--r--tools/designer/src/components/objectinspector/objectinspector.cpp4
-rw-r--r--tools/designer/src/components/objectinspector/objectinspectormodel.cpp4
-rw-r--r--tools/designer/src/components/propertyeditor/designerpropertymanager.cpp3
-rw-r--r--tools/designer/src/components/propertyeditor/paletteeditor.cpp7
-rw-r--r--tools/designer/src/components/propertyeditor/paletteeditorbutton.cpp4
-rw-r--r--tools/designer/src/components/propertyeditor/previewframe.cpp16
-rw-r--r--tools/designer/src/components/propertyeditor/propertyeditor.cpp11
-rw-r--r--tools/designer/src/components/propertyeditor/stringlisteditorbutton.cpp4
-rw-r--r--tools/designer/src/components/signalsloteditor/connectdialog.ui8
-rw-r--r--tools/designer/src/components/signalsloteditor/signalsloteditor_plugin.cpp7
-rw-r--r--tools/designer/src/components/signalsloteditor/signalsloteditor_tool.cpp4
-rw-r--r--tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp4
-rw-r--r--tools/designer/src/components/tabordereditor/tabordereditor_plugin.cpp8
-rw-r--r--tools/designer/src/components/tabordereditor/tabordereditor_tool.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/button_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/combobox_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp5
-rw-r--r--tools/designer/src/components/taskmenu/groupbox_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/label_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/layouttaskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/lineedit_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/listwidget_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/listwidgeteditor.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/menutaskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/tablewidget_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/tablewidgeteditor.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/textedit_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/toolbar_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/treewidget_taskmenu.cpp4
-rw-r--r--tools/designer/src/components/taskmenu/treewidgeteditor.cpp4
-rw-r--r--tools/designer/src/components/widgetbox/widgetbox_dnditem.cpp10
-rw-r--r--tools/designer/src/designer/Info_mac.plist2
-rw-r--r--tools/designer/src/designer/designer.pro6
-rw-r--r--tools/designer/src/designer/designer.rc30
-rw-r--r--tools/designer/src/designer/main.cpp14
-rw-r--r--tools/designer/src/designer/mainwindow.cpp2
-rw-r--r--tools/designer/src/designer/qdesigner_actions.cpp9
-rw-r--r--tools/designer/src/designer/qdesigner_workbench.cpp2
-rw-r--r--tools/designer/src/designer/uifile.icnsbin0 -> 123696 bytes-rw-r--r--tools/designer/src/designer/versiondialog.cpp4
-rw-r--r--tools/designer/src/lib/lib.pro2
-rw-r--r--tools/designer/src/lib/sdk/abstractdnditem.qdoc112
-rw-r--r--tools/designer/src/lib/sdk/abstractformeditor.cpp12
-rw-r--r--tools/designer/src/lib/sdk/abstractformwindow.cpp14
-rw-r--r--tools/designer/src/lib/sdk/abstracticoncache.qdoc130
-rw-r--r--tools/designer/src/lib/sdk/dynamicpropertysheet.qdoc94
-rw-r--r--tools/designer/src/lib/sdk/layoutdecoration.qdoc163
-rw-r--r--tools/designer/src/lib/sdk/membersheet.qdoc263
-rw-r--r--tools/designer/src/lib/sdk/propertysheet.qdoc302
-rw-r--r--tools/designer/src/lib/sdk/script.cpp6
-rw-r--r--tools/designer/src/lib/sdk/taskmenu.qdoc152
-rw-r--r--tools/designer/src/lib/shared/actioneditor.cpp22
-rw-r--r--tools/designer/src/lib/shared/actionprovider_p.h2
-rw-r--r--tools/designer/src/lib/shared/codedialog.cpp4
-rw-r--r--tools/designer/src/lib/shared/csshighlighter.cpp4
-rw-r--r--tools/designer/src/lib/shared/formwindowbase.cpp4
-rw-r--r--tools/designer/src/lib/shared/iconselector.cpp5
-rw-r--r--tools/designer/src/lib/shared/iconselector_p.h4
-rw-r--r--tools/designer/src/lib/shared/newformwidget.cpp5
-rw-r--r--tools/designer/src/lib/shared/orderdialog.cpp4
-rw-r--r--tools/designer/src/lib/shared/plaintexteditor.cpp4
-rw-r--r--tools/designer/src/lib/shared/pluginmanager.cpp120
-rw-r--r--tools/designer/src/lib/shared/pluginmanager_p.h8
-rw-r--r--tools/designer/src/lib/shared/previewconfigurationwidget.cpp28
-rw-r--r--tools/designer/src/lib/shared/previewmanager.cpp173
-rw-r--r--tools/designer/src/lib/shared/promotionmodel.cpp4
-rw-r--r--tools/designer/src/lib/shared/qdesigner_command.cpp6
-rw-r--r--tools/designer/src/lib/shared/qdesigner_formbuilder.cpp20
-rw-r--r--tools/designer/src/lib/shared/qdesigner_formbuilder_p.h17
-rw-r--r--tools/designer/src/lib/shared/qdesigner_menu.cpp86
-rw-r--r--tools/designer/src/lib/shared/qdesigner_menu_p.h3
-rw-r--r--tools/designer/src/lib/shared/qdesigner_menubar.cpp58
-rw-r--r--tools/designer/src/lib/shared/qdesigner_menubar_p.h4
-rw-r--r--tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp4
-rw-r--r--tools/designer/src/lib/shared/qdesigner_propertyeditor.cpp104
-rw-r--r--tools/designer/src/lib/shared/qdesigner_stackedbox.cpp11
-rw-r--r--tools/designer/src/lib/shared/qdesigner_tabwidget.cpp12
-rw-r--r--tools/designer/src/lib/shared/qdesigner_taskmenu.cpp4
-rw-r--r--tools/designer/src/lib/shared/qdesigner_toolbar.cpp19
-rw-r--r--tools/designer/src/lib/shared/qdesigner_widgetbox.cpp4
-rw-r--r--tools/designer/src/lib/shared/qsimpleresource.cpp135
-rw-r--r--tools/designer/src/lib/shared/qsimpleresource_p.h17
-rw-r--r--tools/designer/src/lib/shared/qtresourceeditordialog.cpp5
-rw-r--r--tools/designer/src/lib/shared/qtresourceeditordialog_p.h3
-rw-r--r--tools/designer/src/lib/shared/qtresourcemodel.cpp2
-rw-r--r--tools/designer/src/lib/shared/qtresourcemodel_p.h5
-rw-r--r--tools/designer/src/lib/shared/qtresourceview.cpp203
-rw-r--r--tools/designer/src/lib/shared/qtresourceview_p.h5
-rw-r--r--tools/designer/src/lib/shared/richtexteditor.cpp4
-rw-r--r--tools/designer/src/lib/shared/scriptdialog.cpp10
-rw-r--r--tools/designer/src/lib/shared/scripterrordialog.cpp4
-rw-r--r--tools/designer/src/lib/shared/shared.pri2
-rw-r--r--tools/designer/src/lib/shared/stylesheeteditor.cpp4
-rw-r--r--tools/designer/src/lib/shared/widgetfactory.cpp4
-rw-r--r--tools/designer/src/lib/shared/zoomwidget.cpp22
-rw-r--r--tools/designer/src/lib/shared/zoomwidget_p.h9
-rw-r--r--tools/designer/src/lib/uilib/abstractformbuilder.cpp210
-rw-r--r--tools/designer/src/lib/uilib/container.qdoc186
-rw-r--r--tools/designer/src/lib/uilib/customwidget.qdoc309
-rw-r--r--tools/designer/src/lib/uilib/formbuilder.cpp29
-rw-r--r--tools/designer/src/lib/uilib/formbuilderextra.cpp18
-rw-r--r--tools/designer/src/lib/uilib/formbuilderextra_p.h8
-rw-r--r--tools/designer/src/lib/uilib/ui4.cpp245
-rw-r--r--tools/designer/src/lib/uilib/ui4_p.h97
-rw-r--r--tools/designer/src/lib/uilib/uilib.pri1
-rw-r--r--tools/designer/src/plugins/activeqt/qaxwidgettaskmenu.cpp2
-rw-r--r--tools/designer/src/src.pro1
-rw-r--r--tools/designer/src/uitools/quiloader.cpp12
-rw-r--r--tools/designer/src/uitools/quiloader.h3
-rw-r--r--tools/designer/src/uitools/uitools.pro2
-rw-r--r--tools/doxygen/config/header.html2
-rw-r--r--tools/doxygen/config/phonon.doxyfile2
-rw-r--r--tools/installer/nsis/includes/qtcommon.nsh22
-rw-r--r--tools/installer/nsis/modules/mingw.nsh3
-rw-r--r--tools/installer/nsis/opensource.ini8
-rw-r--r--tools/kmap2qmap/kmap2qmap.pro12
-rw-r--r--tools/kmap2qmap/main.cpp991
-rw-r--r--tools/linguist/lconvert/main.cpp53
-rw-r--r--tools/linguist/linguist/batchtranslation.ui4
-rw-r--r--tools/linguist/linguist/globals.cpp55
-rw-r--r--tools/linguist/linguist/globals.h50
-rw-r--r--tools/linguist/linguist/images/minus.pngbin0 -> 296 bytes-rw-r--r--tools/linguist/linguist/images/plus.pngbin0 -> 383 bytes-rw-r--r--tools/linguist/linguist/linguist.pro2
-rw-r--r--tools/linguist/linguist/linguist.qrc2
-rw-r--r--tools/linguist/linguist/linguist.rc31
-rw-r--r--tools/linguist/linguist/main.cpp18
-rw-r--r--tools/linguist/linguist/mainwindow.cpp89
-rw-r--r--tools/linguist/linguist/mainwindow.h8
-rw-r--r--tools/linguist/linguist/mainwindow.ui33
-rw-r--r--tools/linguist/linguist/messageeditor.cpp331
-rw-r--r--tools/linguist/linguist/messageeditor.h39
-rw-r--r--tools/linguist/linguist/messageeditorwidgets.cpp259
-rw-r--r--tools/linguist/linguist/messageeditorwidgets.h58
-rw-r--r--tools/linguist/linguist/phrase.cpp12
-rw-r--r--tools/linguist/linguist/phrasebookbox.cpp6
-rw-r--r--tools/linguist/linguist/phraseview.cpp3
-rw-r--r--tools/linguist/linguist/recentfiles.cpp5
-rw-r--r--tools/linguist/lrelease/lrelease.112
-rw-r--r--tools/linguist/lrelease/main.cpp30
-rw-r--r--tools/linguist/lupdate/cpp.cpp1979
-rw-r--r--tools/linguist/lupdate/java.cpp643
-rw-r--r--tools/linguist/lupdate/lupdate.114
-rw-r--r--tools/linguist/lupdate/lupdate.h85
-rw-r--r--tools/linguist/lupdate/lupdate.pro15
-rw-r--r--tools/linguist/lupdate/main.cpp125
-rw-r--r--tools/linguist/lupdate/merge.cpp505
-rw-r--r--tools/linguist/lupdate/qscript.cpp2391
-rw-r--r--tools/linguist/lupdate/qscript.g2023
-rw-r--r--tools/linguist/lupdate/ui.cpp205
-rw-r--r--tools/linguist/phrasebooks/french.qph227
-rw-r--r--tools/linguist/phrasebooks/polish.qph2
-rw-r--r--tools/linguist/qdoc.conf2
-rw-r--r--tools/linguist/shared/abstractproitemvisitor.h24
-rw-r--r--tools/linguist/shared/cpp.cpp1098
-rw-r--r--tools/linguist/shared/formats.pri4
-rw-r--r--tools/linguist/shared/java.cpp661
-rwxr-xr-xtools/linguist/shared/make-qscript.sh54
-rw-r--r--tools/linguist/shared/po.cpp10
-rw-r--r--tools/linguist/shared/profileevaluator.cpp1647
-rw-r--r--tools/linguist/shared/profileevaluator.h21
-rw-r--r--tools/linguist/shared/proitems.cpp84
-rw-r--r--tools/linguist/shared/proitems.h33
-rw-r--r--tools/linguist/shared/proparserutils.h49
-rw-r--r--tools/linguist/shared/qm.cpp64
-rw-r--r--tools/linguist/shared/qph.cpp29
-rw-r--r--tools/linguist/shared/qscript.cpp2408
-rw-r--r--tools/linguist/shared/qscript.g2036
-rw-r--r--tools/linguist/shared/translator.cpp20
-rw-r--r--tools/linguist/shared/translator.h20
-rw-r--r--tools/linguist/shared/translatortools.cpp505
-rw-r--r--tools/linguist/shared/translatortools.h77
-rw-r--r--tools/linguist/shared/translatortools.pri11
-rw-r--r--tools/linguist/shared/ts.cpp6
-rw-r--r--tools/linguist/shared/ts.dtd15
-rw-r--r--tools/linguist/shared/ui.cpp234
-rw-r--r--tools/linguist/shared/xliff.cpp7
-rw-r--r--tools/macdeployqt/macchangeqt/main.cpp32
-rw-r--r--tools/macdeployqt/macdeployqt/main.cpp39
-rw-r--r--tools/macdeployqt/shared/shared.cpp249
-rw-r--r--tools/macdeployqt/shared/shared.h20
-rw-r--r--tools/pixeltool/qpixeltool.cpp4
-rw-r--r--tools/porting/src/logger.cpp6
-rw-r--r--tools/qdbus/qdbusviewer/qdbusviewer.cpp11
-rw-r--r--tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp11
-rw-r--r--tools/qdoc3/atom.cpp2
-rw-r--r--tools/qdoc3/atom.h1
-rw-r--r--tools/qdoc3/codemarker.cpp145
-rw-r--r--tools/qdoc3/codemarker.h20
-rw-r--r--tools/qdoc3/codeparser.cpp27
-rw-r--r--tools/qdoc3/codeparser.h1
-rw-r--r--tools/qdoc3/command.cpp44
-rw-r--r--tools/qdoc3/config.cpp2
-rw-r--r--tools/qdoc3/config.h2
-rw-r--r--tools/qdoc3/cppcodemarker.cpp218
-rw-r--r--tools/qdoc3/cppcodemarker.h5
-rw-r--r--tools/qdoc3/cppcodeparser.cpp335
-rw-r--r--tools/qdoc3/cppcodeparser.h15
-rw-r--r--tools/qdoc3/doc.cpp2015
-rw-r--r--tools/qdoc3/doc.h177
-rw-r--r--tools/qdoc3/generator.cpp384
-rw-r--r--tools/qdoc3/generator.h17
-rw-r--r--tools/qdoc3/helpprojectwriter.cpp35
-rw-r--r--tools/qdoc3/htmlgenerator.cpp1790
-rw-r--r--tools/qdoc3/htmlgenerator.h63
-rw-r--r--tools/qdoc3/jambiapiparser.cpp5
-rw-r--r--tools/qdoc3/javadocgenerator.cpp3
-rw-r--r--tools/qdoc3/javadocgenerator.h2
-rw-r--r--tools/qdoc3/main.cpp76
-rw-r--r--tools/qdoc3/node.cpp118
-rw-r--r--tools/qdoc3/node.h148
-rw-r--r--tools/qdoc3/pagegenerator.cpp59
-rw-r--r--tools/qdoc3/qdoc3.pro8
-rw-r--r--tools/qdoc3/separator.cpp36
-rw-r--r--tools/qdoc3/separator.h1
-rw-r--r--tools/qdoc3/test/assistant.qdocconf6
-rw-r--r--tools/qdoc3/test/classic.css158
-rw-r--r--tools/qdoc3/test/designer.qdocconf6
-rw-r--r--tools/qdoc3/test/linguist.qdocconf6
-rw-r--r--tools/qdoc3/test/macros.qdocconf5
-rw-r--r--tools/qdoc3/test/qmake.qdocconf6
-rw-r--r--tools/qdoc3/test/qt-build-docs.qdocconf10
-rw-r--r--tools/qdoc3/test/qt-cpp-ignore.qdocconf6
-rw-r--r--tools/qdoc3/test/qt-html-templates.qdocconf36
-rw-r--r--tools/qdoc3/test/qt-inc.qdocconf8
-rw-r--r--tools/qdoc3/test/qt.qdocconf10
-rw-r--r--tools/qdoc3/tree.cpp139
-rw-r--r--tools/qdoc3/webxmlgenerator.cpp4
-rw-r--r--tools/qdoc3/yyindent.cpp2
-rw-r--r--tools/qtconfig/mainwindow.cpp4
-rw-r--r--tools/qtconfig/paletteeditoradvanced.cpp2
-rw-r--r--tools/qtestlib/chart/3rdparty/excanvas.js14
-rw-r--r--tools/qtestlib/chart/3rdparty/flotr.js2
-rw-r--r--tools/qtestlib/chart/3rdparty/prototype.js8
-rw-r--r--tools/qtestlib/chart/benchmark_template.html202
-rw-r--r--tools/qtestlib/chart/chart.pro16
-rw-r--r--tools/qtestlib/chart/chart.qrc9
-rw-r--r--tools/qtestlib/chart/chart_template.html110
-rw-r--r--tools/qtestlib/chart/database.cpp321
-rw-r--r--tools/qtestlib/chart/database.h99
-rw-r--r--tools/qtestlib/chart/main.cpp82
-rw-r--r--tools/qtestlib/chart/reportgenerator.cpp561
-rw-r--r--tools/qtestlib/chart/reportgenerator.h63
-rw-r--r--tools/qtestlib/qtestlib.pro2
-rw-r--r--tools/qtestlib/wince/cetcpsync/cetcpsync.pro22
-rw-r--r--tools/qtestlib/wince/cetcpsync/main.cpp191
-rw-r--r--tools/qtestlib/wince/cetcpsync/qtcesterconnection.cpp552
-rw-r--r--tools/qtestlib/wince/cetcpsync/qtcesterconnection.h86
-rw-r--r--tools/qtestlib/wince/cetcpsync/remoteconnection.cpp65
-rw-r--r--tools/qtestlib/wince/cetcpsync/remoteconnection.h81
-rw-r--r--tools/qtestlib/wince/cetcpsyncserver/cetcpsyncserver.pro17
-rw-r--r--tools/qtestlib/wince/cetcpsyncserver/commands.cpp686
-rw-r--r--tools/qtestlib/wince/cetcpsyncserver/commands.h292
-rw-r--r--tools/qtestlib/wince/cetcpsyncserver/connectionmanager.cpp138
-rw-r--r--tools/qtestlib/wince/cetcpsyncserver/connectionmanager.h83
-rw-r--r--tools/qtestlib/wince/cetcpsyncserver/main.cpp63
-rw-r--r--tools/qtestlib/wince/cetcpsyncserver/transfer_global.h159
-rw-r--r--tools/qtestlib/wince/cetest/activesyncconnection.cpp42
-rw-r--r--tools/qtestlib/wince/cetest/bootstrapped.pri8
-rw-r--r--tools/qtestlib/wince/cetest/cetcpsyncconnection.cpp200
-rw-r--r--tools/qtestlib/wince/cetest/cetcpsyncconnection.h82
-rw-r--r--tools/qtestlib/wince/cetest/cetest.pro22
-rw-r--r--tools/qtestlib/wince/cetest/deployment.cpp36
-rw-r--r--tools/qtestlib/wince/cetest/main.cpp12
-rw-r--r--tools/qtestlib/wince/cetest/qmake_include.pri4
-rw-r--r--tools/qtestlib/wince/cetest/remoteconnection.cpp32
-rw-r--r--tools/qtestlib/wince/cetest/remoteconnection.h2
-rw-r--r--tools/qtestlib/wince/remotelib/commands.cpp10
-rw-r--r--tools/qtestlib/wince/remotelib/commands.h2
-rw-r--r--tools/qvfb/PDAPhone.skin/pda_up.pngbin100615 -> 0 bytes-rw-r--r--tools/qvfb/config.ui1665
-rw-r--r--tools/qvfb/pda.qrc5
-rw-r--r--tools/qvfb/pda.skin14
-rw-r--r--tools/qvfb/pda_down.pngbin102655 -> 0 bytes-rw-r--r--tools/qvfb/qtopiakeysym.h2
-rw-r--r--tools/qvfb/qvfb.cpp14
-rw-r--r--tools/qvfb/qvfb.pro12
-rw-r--r--tools/qvfb/qvfbview.cpp66
-rw-r--r--tools/qvfb/qvfbview.h5
-rw-r--r--tools/qvfb/qvfbx11view.cpp2
-rw-r--r--tools/qvfb/qvfbx11view.h2
-rw-r--r--tools/qvfb/x11keyfaker.cpp2
-rw-r--r--tools/shared/deviceskin/deviceskin.pri12
-rw-r--r--tools/shared/deviceskin/skins/ClamshellPhone.qrc (renamed from tools/qvfb/ClamshellPhone.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/ClamshellPhone.skin/ClamshellPhone.skin (renamed from tools/qvfb/ClamshellPhone.skin/ClamshellPhone.skin)0
-rw-r--r--tools/shared/deviceskin/skins/ClamshellPhone.skin/ClamshellPhone1-5-closed.png (renamed from tools/qvfb/ClamshellPhone.skin/ClamshellPhone1-5-closed.png)bin68200 -> 68200 bytes-rw-r--r--tools/shared/deviceskin/skins/ClamshellPhone.skin/ClamshellPhone1-5-pressed.png (renamed from tools/qvfb/ClamshellPhone.skin/ClamshellPhone1-5-pressed.png)bin113907 -> 113907 bytes-rw-r--r--tools/shared/deviceskin/skins/ClamshellPhone.skin/ClamshellPhone1-5.png (renamed from tools/qvfb/ClamshellPhone.skin/ClamshellPhone1-5.png)bin113450 -> 113450 bytes-rw-r--r--tools/shared/deviceskin/skins/ClamshellPhone.skin/defaultbuttons.conf (renamed from tools/qvfb/ClamshellPhone.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/DualScreenPhone.skin/DualScreen-pressed.png (renamed from tools/qvfb/DualScreenPhone.skin/DualScreen-pressed.png)bin115575 -> 115575 bytes-rw-r--r--tools/shared/deviceskin/skins/DualScreenPhone.skin/DualScreen.png (renamed from tools/qvfb/DualScreenPhone.skin/DualScreen.png)bin104711 -> 104711 bytes-rw-r--r--tools/shared/deviceskin/skins/DualScreenPhone.skin/DualScreenPhone.skin (renamed from tools/qvfb/DualScreenPhone.skin/DualScreenPhone.skin)0
-rw-r--r--tools/shared/deviceskin/skins/DualScreenPhone.skin/defaultbuttons.conf (renamed from tools/qvfb/SmartPhone.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/PDAPhone.qrc (renamed from tools/qvfb/PDAPhone.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/PDAPhone.skin/PDAPhone.skin (renamed from tools/qvfb/PDAPhone.skin/PDAPhone.skin)0
-rw-r--r--tools/shared/deviceskin/skins/PDAPhone.skin/defaultbuttons.conf (renamed from tools/qvfb/PDAPhone.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/PDAPhone.skin/finger.png (renamed from tools/qvfb/PDAPhone.skin/finger.png)bin40343 -> 40343 bytes-rw-r--r--tools/shared/deviceskin/skins/PDAPhone.skin/pda_down.png (renamed from tools/qvfb/PDAPhone.skin/pda_down.png)bin52037 -> 52037 bytes-rw-r--r--tools/shared/deviceskin/skins/PDAPhone.skin/pda_up.png (renamed from tools/qvfb/pda_up.png)bin100615 -> 100615 bytes-rw-r--r--tools/shared/deviceskin/skins/PortableMedia.qrc (renamed from tools/qvfb/PortableMedia.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/PortableMedia.skin/PortableMedia.skin (renamed from tools/qvfb/PortableMedia.skin/PortableMedia.skin)0
-rw-r--r--tools/shared/deviceskin/skins/PortableMedia.skin/defaultbuttons.conf (renamed from tools/qvfb/PortableMedia.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/PortableMedia.skin/portablemedia-pressed.png (renamed from tools/qvfb/PortableMedia.skin/portablemedia-pressed.png)bin6183 -> 6183 bytes-rw-r--r--tools/shared/deviceskin/skins/PortableMedia.skin/portablemedia.png (renamed from tools/qvfb/PortableMedia.skin/portablemedia.png)bin6182 -> 6182 bytes-rw-r--r--tools/shared/deviceskin/skins/PortableMedia.skin/portablemedia.xcf (renamed from tools/qvfb/PortableMedia.skin/portablemedia.xcf)bin41592 -> 41592 bytes-rw-r--r--tools/shared/deviceskin/skins/S60-QVGA-Candybar.qrc5
-rw-r--r--tools/shared/deviceskin/skins/S60-QVGA-Candybar.skin/S60-QVGA-Candybar-down.pngbin0 -> 161184 bytes-rw-r--r--tools/shared/deviceskin/skins/S60-QVGA-Candybar.skin/S60-QVGA-Candybar.pngbin0 -> 156789 bytes-rw-r--r--tools/shared/deviceskin/skins/S60-QVGA-Candybar.skin/S60-QVGA-Candybar.skin15
-rw-r--r--tools/shared/deviceskin/skins/S60-QVGA-Candybar.skin/defaultbuttons.conf78
-rw-r--r--tools/shared/deviceskin/skins/S60-nHD-Touchscreen.qrc5
-rw-r--r--tools/shared/deviceskin/skins/S60-nHD-Touchscreen.skin/S60-nHD-Touchscreen-down.pngbin0 -> 241501 bytes-rw-r--r--tools/shared/deviceskin/skins/S60-nHD-Touchscreen.skin/S60-nHD-Touchscreen.pngbin0 -> 240615 bytes-rw-r--r--tools/shared/deviceskin/skins/S60-nHD-Touchscreen.skin/S60-nHD-Touchscreen.skin10
-rw-r--r--tools/shared/deviceskin/skins/S60-nHD-Touchscreen.skin/defaultbuttons.conf (renamed from tools/qvfb/Trolltech-Touchscreen.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhone.qrc (renamed from tools/qvfb/SmartPhone.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhone.skin/SmartPhone-pressed.png (renamed from tools/qvfb/SmartPhone.skin/SmartPhone-pressed.png)bin111515 -> 111515 bytes-rw-r--r--tools/shared/deviceskin/skins/SmartPhone.skin/SmartPhone.png (renamed from tools/qvfb/SmartPhone.skin/SmartPhone.png)bin101750 -> 101750 bytes-rw-r--r--tools/shared/deviceskin/skins/SmartPhone.skin/SmartPhone.skin (renamed from tools/qvfb/SmartPhone.skin/SmartPhone.skin)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhone.skin/defaultbuttons.conf (renamed from tools/qvfb/DualScreenPhone.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhone2.qrc (renamed from tools/qvfb/SmartPhone2.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhone2.skin/SmartPhone2-pressed.png (renamed from tools/qvfb/SmartPhone2.skin/SmartPhone2-pressed.png)bin134749 -> 134749 bytes-rw-r--r--tools/shared/deviceskin/skins/SmartPhone2.skin/SmartPhone2.png (renamed from tools/qvfb/SmartPhone2.skin/SmartPhone2.png)bin121915 -> 121915 bytes-rw-r--r--tools/shared/deviceskin/skins/SmartPhone2.skin/SmartPhone2.skin (renamed from tools/qvfb/SmartPhone2.skin/SmartPhone2.skin)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhone2.skin/defaultbuttons.conf (renamed from tools/qvfb/SmartPhone2.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhoneWithButtons.qrc (renamed from tools/qvfb/SmartPhoneWithButtons.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhoneWithButtons.skin/SmartPhoneWithButtons-pressed.png (renamed from tools/qvfb/SmartPhoneWithButtons.skin/SmartPhoneWithButtons-pressed.png)bin103838 -> 103838 bytes-rw-r--r--tools/shared/deviceskin/skins/SmartPhoneWithButtons.skin/SmartPhoneWithButtons.png (renamed from tools/qvfb/SmartPhoneWithButtons.skin/SmartPhoneWithButtons.png)bin88470 -> 88470 bytes-rw-r--r--tools/shared/deviceskin/skins/SmartPhoneWithButtons.skin/SmartPhoneWithButtons.skin (renamed from tools/qvfb/SmartPhoneWithButtons.skin/SmartPhoneWithButtons.skin)0
-rw-r--r--tools/shared/deviceskin/skins/SmartPhoneWithButtons.skin/defaultbuttons.conf (renamed from tools/qvfb/SmartPhoneWithButtons.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/TouchscreenPhone.qrc (renamed from tools/qvfb/TouchscreenPhone.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/TouchscreenPhone.skin/TouchscreenPhone-pressed.png (renamed from tools/qvfb/TouchscreenPhone.skin/TouchscreenPhone-pressed.png)bin88599 -> 88599 bytes-rw-r--r--tools/shared/deviceskin/skins/TouchscreenPhone.skin/TouchscreenPhone.png (renamed from tools/qvfb/TouchscreenPhone.skin/TouchscreenPhone.png)bin61809 -> 61809 bytes-rw-r--r--tools/shared/deviceskin/skins/TouchscreenPhone.skin/TouchscreenPhone.skin (renamed from tools/qvfb/TouchscreenPhone.skin/TouchscreenPhone.skin)0
-rw-r--r--tools/shared/deviceskin/skins/TouchscreenPhone.skin/defaultbuttons.conf (renamed from tools/qvfb/TouchscreenPhone.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Keypad.qrc (renamed from tools/qvfb/Trolltech-Keypad.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Keypad.skin/Trolltech-Keypad-closed.png (renamed from tools/qvfb/Trolltech-Keypad.skin/Trolltech-Keypad-closed.png)bin69447 -> 69447 bytes-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Keypad.skin/Trolltech-Keypad-down.png (renamed from tools/qvfb/Trolltech-Keypad.skin/Trolltech-Keypad-down.png)bin242107 -> 242107 bytes-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Keypad.skin/Trolltech-Keypad.png (renamed from tools/qvfb/Trolltech-Keypad.skin/Trolltech-Keypad.png)bin230638 -> 230638 bytes-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Keypad.skin/Trolltech-Keypad.skin (renamed from tools/qvfb/Trolltech-Keypad.skin/Trolltech-Keypad.skin)0
-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Keypad.skin/defaultbuttons.conf (renamed from tools/qvfb/Trolltech-Keypad.skin/defaultbuttons.conf)0
-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Touchscreen.qrc (renamed from tools/qvfb/Trolltech-Touchscreen.qrc)0
-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Touchscreen.skin/Trolltech-Touchscreen-down.png (renamed from tools/qvfb/Trolltech-Touchscreen.skin/Trolltech-Touchscreen-down.png)bin133117 -> 133117 bytes-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Touchscreen.skin/Trolltech-Touchscreen.png (renamed from tools/qvfb/Trolltech-Touchscreen.skin/Trolltech-Touchscreen.png)bin133180 -> 133180 bytes-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Touchscreen.skin/Trolltech-Touchscreen.skin (renamed from tools/qvfb/Trolltech-Touchscreen.skin/Trolltech-Touchscreen.skin)0
-rw-r--r--tools/shared/deviceskin/skins/Trolltech-Touchscreen.skin/defaultbuttons.conf53
-rw-r--r--tools/shared/qtgradienteditor/qtcolorbutton.cpp4
-rw-r--r--tools/shared/qtgradienteditor/qtcolorbutton.h2
-rw-r--r--tools/shared/qtgradienteditor/qtcolorline.cpp4
-rw-r--r--tools/shared/qtgradienteditor/qtcolorline.h2
-rw-r--r--tools/shared/qtgradienteditor/qtgradientdialog.cpp8
-rw-r--r--tools/shared/qtgradienteditor/qtgradientdialog.h2
-rw-r--r--tools/shared/qtgradienteditor/qtgradienteditor.cpp8
-rw-r--r--tools/shared/qtgradienteditor/qtgradienteditor.h2
-rw-r--r--tools/shared/qtgradienteditor/qtgradientstopscontroller.cpp8
-rw-r--r--tools/shared/qtgradienteditor/qtgradientstopscontroller.h2
-rw-r--r--tools/shared/qtgradienteditor/qtgradientstopsmodel.cpp7
-rw-r--r--tools/shared/qtgradienteditor/qtgradientstopsmodel.h4
-rw-r--r--tools/shared/qtgradienteditor/qtgradientstopswidget.cpp4
-rw-r--r--tools/shared/qtgradienteditor/qtgradientstopswidget.h2
-rw-r--r--tools/shared/qtgradienteditor/qtgradientwidget.cpp4
-rw-r--r--tools/shared/qtgradienteditor/qtgradientwidget.h2
-rw-r--r--tools/shared/qtpropertybrowser/qtbuttonpropertybrowser.cpp4
-rw-r--r--tools/shared/qtpropertybrowser/qtbuttonpropertybrowser.h2
-rw-r--r--tools/shared/qtpropertybrowser/qteditorfactory.cpp54
-rw-r--r--tools/shared/qtpropertybrowser/qteditorfactory.h30
-rw-r--r--tools/shared/qtpropertybrowser/qtgroupboxpropertybrowser.cpp4
-rw-r--r--tools/shared/qtpropertybrowser/qtgroupboxpropertybrowser.h2
-rw-r--r--tools/shared/qtpropertybrowser/qtpropertybrowser.cpp14
-rw-r--r--tools/shared/qtpropertybrowser/qtpropertybrowser.h8
-rw-r--r--tools/shared/qtpropertybrowser/qtpropertymanager.cpp128
-rw-r--r--tools/shared/qtpropertybrowser/qtpropertymanager.h44
-rw-r--r--tools/shared/qtpropertybrowser/qttreepropertybrowser.cpp4
-rw-r--r--tools/shared/qtpropertybrowser/qttreepropertybrowser.h2
-rw-r--r--tools/shared/qtpropertybrowser/qtvariantproperty.cpp12
-rw-r--r--tools/shared/qtpropertybrowser/qtvariantproperty.h6
-rw-r--r--tools/shared/qttoolbardialog/qttoolbardialog.cpp20
-rw-r--r--tools/shared/qttoolbardialog/qttoolbardialog.h4
-rw-r--r--tools/tools.pro5
-rw-r--r--tools/xmlpatterns/main.cpp4
-rw-r--r--tools/xmlpatterns/main.h2
-rw-r--r--tools/xmlpatterns/qcoloringmessagehandler_p.h2
-rw-r--r--tools/xmlpatterns/qcoloroutput.cpp2
-rw-r--r--tools/xmlpatterns/qcoloroutput_p.h2
-rw-r--r--tools/xmlpatterns/xmlpatterns.pro2
-rw-r--r--tools/xmlpatternsvalidator/main.cpp133
-rw-r--r--tools/xmlpatternsvalidator/main.h76
-rw-r--r--tools/xmlpatternsvalidator/xmlpatternsvalidator.pro17
-rw-r--r--translations/assistant_adp_de.ts34
-rw-r--r--translations/assistant_de.ts424
-rw-r--r--translations/designer_de.ts669
-rw-r--r--translations/linguist_de.ts1402
-rw-r--r--translations/linguist_ja.ts466
-rw-r--r--translations/qt_ar.ts2
-rw-r--r--translations/qt_da.ts2
-rw-r--r--translations/qt_de.ts192
-rw-r--r--translations/qt_fr.ts2
-rw-r--r--translations/qt_help_de.ts128
-rw-r--r--translations/qt_ja_JP.ts3560
-rw-r--r--translations/qt_ru.ts1022
-rw-r--r--translations/qt_uk.ts4
-rw-r--r--translations/qt_zh_CN.ts2
-rw-r--r--translations/translations.pri1
-rw-r--r--util/lexgen/css2-simplified.lexgen3
-rwxr-xr-xutil/local_database/qlocalexml2cpp.py18
-rw-r--r--util/normalize/main.cpp22
-rw-r--r--util/qlalr/compress.cpp2
-rw-r--r--util/qlalr/cppgenerator.cpp23
-rw-r--r--util/qlalr/dotgraph.cpp2
-rw-r--r--util/qlalr/grammar.cpp2
-rw-r--r--util/qlalr/lalr.cpp2
-rw-r--r--util/qlalr/main.cpp12
-rw-r--r--util/qlalr/parsetable.cpp2
-rw-r--r--util/qlalr/recognizer.cpp2
-rw-r--r--util/s60pixelmetrics/bld.inf45
-rw-r--r--util/s60pixelmetrics/pixel_metrics.cpp1223
-rw-r--r--util/s60pixelmetrics/pixel_metrics.h216
-rw-r--r--util/s60pixelmetrics/pm_mapper.hrh73
-rw-r--r--util/s60pixelmetrics/pm_mapper.mmp91
-rw-r--r--util/s60pixelmetrics/pm_mapper.pkg32
-rw-r--r--util/s60pixelmetrics/pm_mapper.rss162
-rw-r--r--util/s60pixelmetrics/pm_mapper_reg.rss57
-rw-r--r--util/s60pixelmetrics/pm_mapperapp.cpp1044
-rw-r--r--util/s60pixelmetrics/pm_mapperapp.h198
-rw-r--r--util/s60pixelmetrics/pm_mapperview.cpp375
-rw-r--r--util/s60pixelmetrics/pm_mapperview.h228
-rw-r--r--util/s60theme/README31
-rw-r--r--util/s60theme/main.cpp78
-rw-r--r--util/s60theme/s60theme.pro12
-rw-r--r--util/s60theme/s60themeconvert.cpp301
-rw-r--r--util/s60theme/s60themeconvert.h54
-rwxr-xr-xutil/scripts/make_qfeatures_dot_h7
-rwxr-xr-xutil/webkit/mkdist-webkit83
9199 files changed, 965231 insertions, 587037 deletions
diff --git a/.gitignore b/.gitignore
index f088c69..282c8bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,8 @@ tags
.DS_Store
*.debug
Makefile*
+!qmake/Makefile.win32*
+!qmake/Makefile.unix
*.prl
*.app
*.pro.user
@@ -52,6 +54,7 @@ bin/lconvert*
bin/moc*
bin/pixeltool*
bin/qmake*
+bin/qdoc3*
bin/qt3to4*
bin/qtdemo*
bin/rcc*
@@ -64,6 +67,7 @@ bin/qhelpconverter*
bin/qhelpgenerator*
bin/qtconfig*
bin/xmlpatterns*
+bin/cetest*
bin/collectiongenerator
bin/helpconverter
bin/helpgenerator
@@ -170,6 +174,32 @@ doc/qch
doc-build
.rcc
.pch
+
+# Symbian build system generated files
+# ---------------------
+
+ABLD.BAT
+bld.inf
+*.mmp
+*.mk
+*.rss
+*.loc
+!s60main.rss
+*.pkg
+plugin_commonU.def
+*.qtplugin
+*.sis
+*.sisx
+
+# Generated by abldfast.bat from devtools.
+.abldsteps.*
+
+# Carbide project files
+# ---------------------
+.project
+.cproject
+.make.cache
+
qtc-debugging-helper
src/corelib/lib
src/network/lib
diff --git a/.hgignore b/.hgignore
index eb6ff05..ba5a1b0 100755
--- a/.hgignore
+++ b/.hgignore
@@ -41,6 +41,7 @@ bin/lupdate*
bin/moc*
bin/pixeltool*
bin/qmake*
+bin/qdoc3*
bin/qt3to4*
bin/qtdemo*
bin/rcc*
diff --git a/FAQ.txt b/FAQ.txt
deleted file mode 100644
index 1d2266d..0000000
--- a/FAQ.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-This is a list of Frequently Asked Questions regarding this Qt release.
-
-Q: I'm using a Unix system and I downloaded the Zip package. However, when I try
-to run the configure script, I get the following error message:
-"bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory"
-A: The problem here is converting files from Windows style line endings (CRLF)
-to Unix style line endings (LF). To avoid this problem, uncompress the file
-again and give the option "-a" to unzip, which will then add the correct line
-endings.
-
-Q: I'm running Windows XP and I downloaded the qt-win-eval-%VERSION%-vs2008.exe
-version of Qt. However, when I try to run the examples I get an error saying:
-"The application failed to start because the application configuration is
-incorrect. Reinstalling the application may fix this problem.". I reinstalled
-the package but the error persists. What am I doing wrong?
-A: The problem is an incorrect version of the CRT. Visual studio requires CRT90
-while Windows XP comes with CRT80. To solve this problem, please install the
-2008 CRT redistributable package from Microsoft.
diff --git a/bin/createpackage.bat b/bin/createpackage.bat
new file mode 100644
index 0000000..b5ede18
--- /dev/null
+++ b/bin/createpackage.bat
@@ -0,0 +1,3 @@
+@echo off
+set scriptpath=%~dp0
+perl %scriptpath%createpackage.pl %* \ No newline at end of file
diff --git a/bin/createpackage.pl b/bin/createpackage.pl
new file mode 100644
index 0000000..a180864
--- /dev/null
+++ b/bin/createpackage.pl
@@ -0,0 +1,169 @@
+#!\usr\bin\perl
+############################################################################################
+#
+# Convenience script for creating signed packages you can install on your phone.
+#
+# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Contact: Qt Software Information (qt-info@nokia.com)
+#
+############################################################################################
+
+use strict;
+
+# use a command-line parsing module
+use Getopt::Long;
+# Use file name parsing module
+use File::Basename;
+
+sub Usage() {
+ print "\n";
+ print "==========================================================================================\n";
+ print "Convenience script for creating signed packages you can install on your phone.\n";
+ print "\n";
+ print "Usage: createpackage.pl [-i] templatepkg target-platform [certificate key [passphrase]]\n";
+ print "\n";
+ print "Where parameters are as follows:\n";
+ print " [-i|install] = Install the package right away using PC suite\n";
+ print " [-p|preprocess] = Only preprocess the template .pkg file.\n";
+ print " templatepkg = Name of .pkg file template\n";
+ print " target = Either debug or release\n";
+ print " platform = One of the supported platform\n";
+ print " winscw | gcce | armv5 | armv6 | armv7\n";
+ print " certificate = The certificate file used for signing\n";
+ print " key = The certificate's private key file\n";
+ print " passphrase = The certificate's private key file's passphrase\n";
+ print "\n";
+ print "For example:\n";
+ print " createpackage.pl fluidlauncher_template.pkg release-armv5\n";
+ print "\n";
+ print "If no certificate and key files are provided, either a RnD certificate or\n";
+ print "a self-signed certificate from Qt installation root directory is used.\n";
+ print "\n";
+ print "==========================================================================================\n";
+ exit();
+}
+
+# Read given options
+my $install = "";
+my $preprocessonly = "";
+unless (GetOptions('i|install' => \$install, 'p|preprocess' => \$preprocessonly)){
+ Usage();
+}
+
+# Read params to variables
+my $templatepkg = $ARGV[0];
+my $targetplatform = lc $ARGV[1];
+
+my @tmpvalues = split('-', $targetplatform);
+my $target = $tmpvalues[0];
+my $platform = $tmpvalues[1];;
+
+# Convert visual target to real target (debug->udeb and release->urel)
+$target =~ s/debug/udeb/i;
+$target =~ s/release/urel/i;
+
+my $certificate = $ARGV[2];
+my $key = $ARGV[3];
+my $passphrase = $ARGV[4];
+
+# Generate output pkg basename (i.e. file name without extension)
+my $pkgoutputbasename = $templatepkg;
+$pkgoutputbasename =~ s/_template\.pkg/_$targetplatform/g;
+$pkgoutputbasename = lc($pkgoutputbasename);
+
+# Store output file names to variables
+my $pkgoutput = lc($pkgoutputbasename.".pkg");
+my $unsigned_sis_name = $pkgoutputbasename."_unsigned.sis";
+my $signed_sis_name = $pkgoutputbasename.".sis";
+
+# Store some utility variables
+my $scriptpath = dirname(__FILE__);
+my $certtext = $certificate;
+my $certpath = $scriptpath;
+$certpath =~ s-^(.*[^\\])$-$1\\-o; # ensure path ends with a backslash
+$certpath = $certpath."../"; # certificates are one step up in hierarcy
+$certpath =~ s-/-\\-go; # for those working with UNIX shells
+
+# Check some pre-conditions and print error messages if needed
+unless (length($templatepkg) && length($platform) && length($target)) {
+ print "\nError: Template PKG filename, platform or target is not defined!\n";
+ Usage();
+}
+
+# Check template exist
+stat($templatepkg);
+unless( -e _ ) {
+ print "\nError: Package description file '$templatepkg' does not exist!\n";
+ Usage();
+}
+
+# Check certifcate preconditions and set default certificate variables if needed
+if (length($certificate)) {
+ unless(length($key)) {
+ print "\nError: Custom certificate key file parameter missing.!\n";
+ Usage();
+ }
+} else {
+ #If no certificate is given, check default options
+ $certtext = "RnD";
+ $certificate = $certpath."rd.cer";
+ $key = $certpath."rd-key.pem";
+
+ stat($certificate);
+ unless( -e _ ) {
+ $certtext = "Self Signed";
+ $certificate = $certpath."selfsigned.cer";
+ $key = $certpath."selfsigned.key";
+ }
+}
+
+# Remove any existing .sis packages
+unlink $unsigned_sis_name;
+unlink $signed_sis_name;
+unlink $pkgoutput;
+
+# Preprocess PKG
+local $/;
+# read template file
+open( TEMPLATE, $templatepkg) or die "Error '$templatepkg': $!\n";
+$_=<TEMPLATE>;
+close (TEMPLATE);
+
+# replace the PKG variables
+s/\$\(PLATFORM\)/$platform/gm;
+s/\$\(TARGET\)/$target/gm;
+
+#write the output
+open( OUTPUT, ">$pkgoutput" ) or die "Error '$pkgoutput' $!\n";
+print OUTPUT $_;
+close OUTPUT;
+
+if ($preprocessonly) {
+ exit;
+}
+
+# Create and sign SIS
+system ("makesis $pkgoutput $unsigned_sis_name");
+system ("signsis $unsigned_sis_name $signed_sis_name $certificate $key $passphrase");
+
+# Check if creating signed SIS Succeeded
+stat($signed_sis_name);
+if( -e _ ) {
+ print ("\nSuccessfully created $signed_sis_name using certificate $certtext!\n");
+
+ # remove temporary pkg and unsigned sis
+ unlink $pkgoutput;
+ unlink $unsigned_sis_name;
+
+ # Install the sis if requested
+ if ($install) {
+ print ("\nInstalling $signed_sis_name...\n");
+ system ("$signed_sis_name");
+ }
+} else {
+ # Lets leave the generated PKG for problem solving purposes
+ print ("\nSIS creation failed!\n");
+}
+
+
+#end of file
diff --git a/bin/patch_capabilities.pl b/bin/patch_capabilities.pl
new file mode 100644
index 0000000..cf8353e
--- /dev/null
+++ b/bin/patch_capabilities.pl
@@ -0,0 +1,143 @@
+#######################################################################
+#
+# A script for setting binary capabilities based on .pkg file contents.
+#
+# Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+# Contact: Nokia Corporation (qt-info@nokia.com)
+#
+#######################################################################
+
+sub Usage() {
+ print("This script can be used to set capabilities of all binaries\n");
+ print("specified for deployment in a .pkg file.\n");
+ print("If no capabilities are given, the binaries will be given the\n");
+ print("capabilities supported by self-signed certificates.\n");
+ print("\nUsage: patch_capabilities.pl pkg_filename [target-platform] [capability list]\n");
+ print(" If template .pkg file is given, next agrument must be 'target-platform'.\n");
+ print("\nE.g. patch_capabilities.pl myapp_template.pkg release-armv5 \"All -TCB\"\n");
+ exit();
+}
+
+my @capabilitiesToSet = ("LocalServices", "NetworkServices", "ReadUserData", "UserEnvironment", "WriteUserData");
+
+# If arguments were given to the script,
+if (@ARGV)
+{
+ # Parse the first given script argument as a ".pkg" file name.
+ my $pkgFileName = shift(@ARGV);
+
+ # These variables will only be set for template .pkg files.
+ my $target;
+ my $platform;
+
+ # Check if using template .pkg and set target/platform variables
+ if (($pkgFileName =~ m|_template\.pkg$|i) && -r($pkgFileName))
+ {
+ my $targetplatform;
+ unless ($targetplatform = shift(@ARGV))
+ {
+ Usage();
+ }
+
+ my @tmpvalues = split('-', $targetplatform);
+ $target = $tmpvalues[0];
+ $platform = $tmpvalues[1];
+
+ # Convert visual target to real target (debug->udeb and release->urel)
+ $target =~ s/debug/udeb/i;
+ $target =~ s/release/urel/i;
+ }
+
+ # If the specified ".pkg" file exists (and can be read),
+ if (($pkgFileName =~ m|\.pkg$|i) && -r($pkgFileName))
+ {
+ # If there are more arguments given, parse them as capabilities.
+ if (@ARGV)
+ {
+ @capabilitiesToSet = ();
+ while (@ARGV)
+ {
+ push (@capabilitiesToSet, pop(@ARGV));
+ }
+ }
+
+ # Start with no binaries listed.
+ my @binaries = ();
+
+ my $tempPkgFileName = $pkgFileName."_@@TEMP@@";
+ unlink($tempPkgFileName);
+ open (NEW_PKG, ">>".$tempPkgFileName);
+ open (PKG, "<".$pkgFileName);
+
+ # Parse each line.
+ while (<PKG>)
+ {
+ my $line = $_;
+ my $newLine = $line;
+ if ( $line =~ m/^\#.*\(0x[0-9|a-f|A-F]*\).*$/)
+ {
+ $newLine =~ s/\(0x./\(0xE/;
+ }
+ print NEW_PKG $newLine;
+
+ chomp ($line);
+
+ # If the line specifies a file, parse the source and destination locations.
+ if ($line =~ m|\"([^\"]+)\"\s*\-\s*\"([^\"]+)\"|)
+ {
+ my $sourcePath = $1;
+ my $destinationPath = $2;
+
+ # If the given file is a binary, check the target and binary type (+ the actual filename) from its path.
+ if ($sourcePath =~ m:/epoc32/release/([^/]+)/(udeb|urel|\$\(TARGET\))/(\w+(\.dll|\.exe)):i)
+ {
+ # Do preprocessing for template pkg,
+ # In case of template pkg target and platform variables are set
+ if(length($target) && length($platform))
+ {
+ $sourcePath =~ s/\$\(PLATFORM\)/$platform/gm;
+ $sourcePath =~ s/\$\(TARGET\)/$target/gm;
+ }
+
+ push (@binaries, $sourcePath);
+ }
+ }
+ }
+
+ close (PKG);
+ close (NEW_PKG);
+
+ unlink($pkgFileName);
+ rename($tempPkgFileName, $pkgFileName);
+
+ print ("\n");
+
+ my $baseCommandToExecute = "elftran -vid 0x0 -capability \"";
+ if (@capabilitiesToSet)
+ {
+ $baseCommandToExecute .= join(" ", @capabilitiesToSet);
+ }
+ $baseCommandToExecute .= "\" ";
+
+ # Actually set the capabilities of the listed binaries.
+ foreach my $binaryPath(@binaries)
+ {
+ # Create the command line for setting the capabilities.
+ my $commandToExecute = $baseCommandToExecute;
+ $commandToExecute .= $binaryPath;
+
+ # Actually execute the elftran command to set the capabilities.
+ system ($commandToExecute." > NUL");
+ print ("Executed ".$commandToExecute."\n");
+
+ ## Create another command line to check that the set capabilities are correct.
+ #$commandToExecute = "elftran -dump s ".$binaryPath;
+ }
+
+ print ("\n");
+ }
+}
+else
+{
+ Usage();
+}
diff --git a/bin/syncqt b/bin/syncqt
index a3addd8..01c519e 100755
--- a/bin/syncqt
+++ b/bin/syncqt
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w
######################################################################
#
-# Synchronizes Qt header files - internal Qt development tool.
+# Synchronizes Qt header files - internal development tool.
#
# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# Contact: Nokia Corporation (qt-info@nokia.com)
@@ -24,6 +24,7 @@ $basedir =~ s=\\=/=g;
my %modules = ( # path to module name map
"QtGui" => "$basedir/src/gui",
"QtOpenGL" => "$basedir/src/opengl",
+ "QtOpenVG" => "$basedir/src/openvg",
"QtCore" => "$basedir/src/corelib",
"QtXml" => "$basedir/src/xml",
"QtXmlPatterns" => "$basedir/src/xmlpatterns",
@@ -42,6 +43,7 @@ my %modules = ( # path to module name map
"QtDBus" => "$basedir/src/dbus",
"QtWebKit" => "$basedir/src/3rdparty/webkit/WebCore",
"phonon" => "$basedir/src/phonon",
+ "QtMultimedia" => "$basedir/src/multimedia",
);
my %moduleheaders = ( # restrict the module headers to those found in relative path
"QtWebKit" => "../WebKit/qt/Api",
@@ -687,6 +689,7 @@ foreach (@modules_to_sync) {
$master_contents .= "#include <QtXml/QtXml>\n" if("$_" eq "xml");
$master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if("$_" eq "xmlpatterns");
$master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if("$_" eq "opengl");
+ $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if("$_" eq "openvg");
}
}
}
diff --git a/config.tests/mac/crc.test b/config.tests/mac/crc.test
index 1a16204..644ff75 100755
--- a/config.tests/mac/crc.test
+++ b/config.tests/mac/crc.test
@@ -52,13 +52,13 @@ test -d "$OUTDIR/$TEST" || mkdir -p "$OUTDIR/$TEST"
cd "$OUTDIR/$TEST"
-make distclean >/dev/null 2>&1
+$MAKE distclean >/dev/null 2>&1
"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "LIBS*=$LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
if [ "$VERBOSE" = "yes" ]; then
- make
+ $MAKE
else
- make >/dev/null 2>&1
+ $MAKE >/dev/null 2>&1
fi
diff --git a/config.tests/mac/defaultarch.test b/config.tests/mac/defaultarch.test
index 4502af7..80f244a 100755
--- a/config.tests/mac/defaultarch.test
+++ b/config.tests/mac/defaultarch.test
@@ -3,7 +3,7 @@
COMPILER=$1
VERBOSE=$2
WORKDIR=$3
-QT_MAC_DEFUALT_ARCH=
+QT_MAC_DEFAULT_ARCH=
touch defaultarch.c
@@ -17,17 +17,17 @@ rm -f defaultarch.c defaultarch.o
# detect our known archs.
if echo "$FIlE_OUTPUT" | grep '\<i386\>' > /dev/null 2>&1; then
- QT_MAC_DEFUALT_ARCH=x86 # configure knows it as "x86" not "i386"
+ QT_MAC_DEFAULT_ARCH=x86 # configure knows it as "x86" not "i386"
fi
if echo "$FIlE_OUTPUT" | grep '\<x86_64\>' > /dev/null 2>&1; then
- QT_MAC_DEFUALT_ARCH=x86_64
+ QT_MAC_DEFAULT_ARCH=x86_64
fi
if echo "$FIlE_OUTPUT" | grep '\<ppc\>' > /dev/null 2>&1; then
- QT_MAC_DEFUALT_ARCH=ppc
+ QT_MAC_DEFAULT_ARCH=ppc
fi
if echo "$FIlE_OUTPUT" | grep '\<ppc64\>' > /dev/null 2>&1; then
- QT_MAC_DEFUALT_ARCH=ppc64
+ QT_MAC_DEFAULT_ARCH=ppc64
fi
-[ "$VERBOSE" = "yes" ] && echo "setting QT_MAC_DEFUALT_ARCH to \"$QT_MAC_DEFUALT_ARCH\""
-export QT_MAC_DEFUALT_ARCH
+[ "$VERBOSE" = "yes" ] && echo "setting QT_MAC_DEFAULT_ARCH to \"$QT_MAC_DEFAULT_ARCH\""
+export QT_MAC_DEFAULT_ARCH
diff --git a/config.tests/unix/alsa/alsa.pro b/config.tests/unix/alsa/alsa.pro
new file mode 100644
index 0000000..4931d38
--- /dev/null
+++ b/config.tests/unix/alsa/alsa.pro
@@ -0,0 +1,4 @@
+SOURCES = alsatest.cpp
+LIBS+=-lasound
+CONFIG -= qt dylib
+mac:CONFIG -= app_bundle
diff --git a/config.tests/unix/alsa/alsatest.cpp b/config.tests/unix/alsa/alsatest.cpp
new file mode 100644
index 0000000..f791a44
--- /dev/null
+++ b/config.tests/unix/alsa/alsatest.cpp
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <alsa/asoundlib.h>
+int main(int argc,char **argv)
+{
+ return 0;
+}
+
diff --git a/config.tests/unix/clock-gettime/clock-gettime.pri b/config.tests/unix/clock-gettime/clock-gettime.pri
index 2a6160b..65b49fb 100644
--- a/config.tests/unix/clock-gettime/clock-gettime.pri
+++ b/config.tests/unix/clock-gettime/clock-gettime.pri
@@ -1,2 +1,2 @@
# clock_gettime() is implemented in librt on these systems
-linux-*|hpux-*|solaris-*:LIBS *= -lrt
+linux-*|hpux-*|solaris-*:LIBS_PRIVATE *= -lrt
diff --git a/config.tests/unix/compile.test b/config.tests/unix/compile.test
index a50f49d..67a4636 100755
--- a/config.tests/unix/compile.test
+++ b/config.tests/unix/compile.test
@@ -28,6 +28,11 @@ while [ "$#" -gt 0 ]; do
MAC_ARCH_LFLAGS="$MAC_ARCH_LFLAGS -arch $2"
shift
;;
+ -sdk)
+ LFLAGS="$LFLAGS -Wl,-syslibroot,$2"
+ CXXFLAGS="$CXXFLAGS -isysroot $2"
+ shift
+ ;;
-F*|-m*|-x*)
LFLAGS="$LFLAGS $PARAM"
CXXFLAGS="$CXXFLAGS $PARAM"
@@ -59,14 +64,14 @@ test -d "$OUTDIR/$TEST" || mkdir -p "$OUTDIR/$TEST"
cd "$OUTDIR/$TEST"
-test -r Makefile && make distclean >/dev/null 2>&1
+test -r Makefile && $MAKE distclean >/dev/null 2>&1
"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
if [ "$VERBOSE" = "yes" ]; then
- make
+ $MAKE
else
- make >/dev/null 2>&1
+ $MAKE >/dev/null 2>&1
fi
[ -x "$EXE" ] && SUCCESS=yes
diff --git a/config.tests/unix/doubleformat.test b/config.tests/unix/doubleformat.test
index 3e707c5..953efd8 100755
--- a/config.tests/unix/doubleformat.test
+++ b/config.tests/unix/doubleformat.test
@@ -14,7 +14,7 @@ test -d "$OUTDIR/config.tests/unix/doubleformat" || mkdir -p "$OUTDIR/config.tes
cd "$OUTDIR/config.tests/unix/doubleformat"
DOUBLEFORMAT="UNKNOWN"
-[ "$VERBOSE" = "yes" ] && make || make >/dev/null 2>&1
+[ "$VERBOSE" = "yes" ] && $MAKE || $MAKE >/dev/null 2>&1
if [ -f ./doubleformattest ]; then
: # nop
diff --git a/config.tests/unix/egl/egl.cpp b/config.tests/unix/egl/egl.cpp
new file mode 100644
index 0000000..240a039
--- /dev/null
+++ b/config.tests/unix/egl/egl.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <EGL/egl.h>
+
+int main(int, char **)
+{
+ EGLint x = 0;
+ EGLDisplay dpy = 0;
+ EGLContext ctx = 0;
+ eglDestroyContext(dpy, ctx);
+ return 0;
+}
diff --git a/config.tests/unix/egl/egl.pro b/config.tests/unix/egl/egl.pro
new file mode 100644
index 0000000..f04d053
--- /dev/null
+++ b/config.tests/unix/egl/egl.pro
@@ -0,0 +1,10 @@
+SOURCES = egl.cpp
+
+for(p, QMAKE_LIBDIR_EGL) {
+ exists($$p):LIBS += -L$$p
+}
+
+!isEmpty(QMAKE_INCDIR_EGL): INCLUDEPATH += $$QMAKE_INCDIR_EGL
+!isEmpty(QMAKE_LIBS_EGL): LIBS += $$QMAKE_LIBS_EGL
+
+CONFIG -= qt
diff --git a/config.tests/unix/egl4gles1/egl4gles1.cpp b/config.tests/unix/egl4gles1/egl4gles1.cpp
new file mode 100644
index 0000000..639f119
--- /dev/null
+++ b/config.tests/unix/egl4gles1/egl4gles1.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <GLES/egl.h>
+
+int main(int, char **)
+{
+ EGLint x = 0;
+ EGLDisplay dpy = 0;
+ EGLContext ctx = 0;
+ eglDestroyContext(dpy, ctx);
+ return 0;
+}
diff --git a/config.tests/unix/egl4gles1/egl4gles1.pro b/config.tests/unix/egl4gles1/egl4gles1.pro
new file mode 100644
index 0000000..667ea8e
--- /dev/null
+++ b/config.tests/unix/egl4gles1/egl4gles1.pro
@@ -0,0 +1,10 @@
+SOURCES = egl4gles1.cpp
+
+for(p, QMAKE_LIBDIR_EGL) {
+ exists($$p):LIBS += -L$$p
+}
+
+!isEmpty(QMAKE_INCDIR_EGL): INCLUDEPATH += $$QMAKE_INCDIR_EGL
+!isEmpty(QMAKE_LIBS_EGL): LIBS += $$QMAKE_LIBS_EGL
+
+CONFIG -= qt
diff --git a/config.tests/unix/endian.test b/config.tests/unix/endian.test
index 2c21652..4755b1f 100755
--- a/config.tests/unix/endian.test
+++ b/config.tests/unix/endian.test
@@ -15,7 +15,7 @@ cd "$OUTDIR/config.tests/unix/endian"
ENDIAN="UNKNOWN"
-[ "$VERBOSE" = "yes" ] && make || make >/dev/null 2>&1
+[ "$VERBOSE" = "yes" ] && $MAKE || $MAKE >/dev/null 2>&1
if [ -f ./endiantest.exe ]; then
binary=./endiantest.exe
@@ -40,7 +40,7 @@ elif strings $binary | grep MostSignificantByteFirst >/dev/null 2>&1; then
fi
# make clean as this tests is compiled for both the host and the target
-make distclean
+$MAKE distclean
# done
if [ "$ENDIAN" = "LITTLE" ]; then
diff --git a/config.tests/unix/iodbc/iodbc.cpp b/config.tests/unix/iodbc/iodbc.cpp
new file mode 100644
index 0000000..15db106
--- /dev/null
+++ b/config.tests/unix/iodbc/iodbc.cpp
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <sql.h>
+#include <sqlext.h>
+
+int main(int, char **)
+{
+ return 0;
+}
diff --git a/config.tests/unix/iodbc/iodbc.pro b/config.tests/unix/iodbc/iodbc.pro
new file mode 100644
index 0000000..465a9a7
--- /dev/null
+++ b/config.tests/unix/iodbc/iodbc.pro
@@ -0,0 +1,4 @@
+SOURCES = iodbc.cpp
+CONFIG -= qt dylib
+mac:CONFIG -= app_bundle
+LIBS += -liodbc
diff --git a/config.tests/unix/makeabs b/config.tests/unix/makeabs
index 9d66108..c415cc7 100755
--- a/config.tests/unix/makeabs
+++ b/config.tests/unix/makeabs
@@ -3,7 +3,13 @@
FILE="$1"
RES="$FILE"
-if [ `echo $FILE | cut -b1` = "/" ]; then
+CUT_ARG="-b1"
+if [ `uname -s` = "QNX" ]; then
+ # QNX does not understand "-b1"
+ CUT_ARG="-c1"
+fi
+
+if [ `echo $FILE | cut $CUT_ARG` = "/" ]; then
true
else
RES="$PWD/$FILE"
diff --git a/config.tests/unix/objcopy.test b/config.tests/unix/objcopy.test
index eb2173d..e2051a7 100755
--- a/config.tests/unix/objcopy.test
+++ b/config.tests/unix/objcopy.test
@@ -1,6 +1,6 @@
#!/bin/sh
-TEST_PATH=`dirname $0`
+TEST_PATH=`dirname "$0"`
SEP_DEBUG_SUPPORT=no
COMPILER=$1
QMAKE_OBJCOPY=$2
diff --git a/config.tests/unix/opengles1/opengles1.cpp b/config.tests/unix/opengles1/opengles1.cpp
index 56ad56c..392f96f 100644
--- a/config.tests/unix/opengles1/opengles1.cpp
+++ b/config.tests/unix/opengles1/opengles1.cpp
@@ -40,12 +40,10 @@
****************************************************************************/
#include <GLES/gl.h>
-#include <GLES/egl.h>
int main(int, char **)
{
GLfloat a = 1.0f;
- eglInitialize(0, 0, 0);
glColor4f(a, a, a, a);
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/config.tests/unix/opengles1cl/opengles1cl.cpp b/config.tests/unix/opengles1cl/opengles1cl.cpp
index c562aec..4aa702b 100644
--- a/config.tests/unix/opengles1cl/opengles1cl.cpp
+++ b/config.tests/unix/opengles1cl/opengles1cl.cpp
@@ -40,12 +40,10 @@
****************************************************************************/
#include <GLES/gl.h>
-#include <GLES/egl.h>
int main(int, char **)
{
GLfixed a = 0;
- eglInitialize(0, 0, 0);
glColor4x(a, a, a, a);
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/config.tests/unix/opengles2/opengles2.cpp b/config.tests/unix/opengles2/opengles2.cpp
index 42cfffa..13e603c 100644
--- a/config.tests/unix/opengles2/opengles2.cpp
+++ b/config.tests/unix/opengles2/opengles2.cpp
@@ -39,12 +39,10 @@
**
****************************************************************************/
-#include <EGL/egl.h>
#include <GLES2/gl2.h>
int main(int, char **)
{
- eglInitialize(0, 0, 0);
glUniform1f(1, GLfloat(1.0));
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/config.tests/unix/openssl/openssl.pri b/config.tests/unix/openssl/openssl.pri
index f069396..377d630 100644
--- a/config.tests/unix/openssl/openssl.pri
+++ b/config.tests/unix/openssl/openssl.pri
@@ -1,3 +1,10 @@
# Empty file since Qt 4.6
# I'm too lazy to find all places where this file is included
+symbian{
+ TRY_INCLUDEPATHS = $${EPOCROOT}epoc32 $${EPOCROOT}epoc32/include $${EPOCROOT}epoc32/include/stdapis $${EPOCROOT}epoc32/include/stdapis/sys $$OS_LAYER_LIBC_SYSTEMINCLUDE $$QMAKE_INCDIR $$INCLUDEPATH
+ for(p, TRY_INCLUDEPATHS) {
+ pp = $$join(p, "", "", "/openssl")
+ exists($$pp):INCLUDEPATH *= $$pp
+ }
+}
diff --git a/config.tests/unix/openvg/openvg.cpp b/config.tests/unix/openvg/openvg.cpp
new file mode 100644
index 0000000..56cc8f6
--- /dev/null
+++ b/config.tests/unix/openvg/openvg.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// There is some variation in OpenVG engines as to what case
+// the VG includes use. The Khronos reference implementation
+// for OpenVG 1.1 uses upper case, so we treat that as canonical.
+#if defined(QT_LOWER_CASE_VG_INCLUDES)
+#include <vg/openvg.h>
+#else
+#include <VG/openvg.h>
+#endif
+
+int main(int, char **)
+{
+ VGint i;
+ i = 2;
+ vgFlush();
+ return 0;
+}
diff --git a/config.tests/unix/openvg/openvg.pro b/config.tests/unix/openvg/openvg.pro
new file mode 100644
index 0000000..4bbde99
--- /dev/null
+++ b/config.tests/unix/openvg/openvg.pro
@@ -0,0 +1,19 @@
+SOURCES += openvg.cpp
+
+!isEmpty(QMAKE_INCDIR_OPENVG): INCLUDEPATH += $$QMAKE_INCDIR_OPENVG
+!isEmpty(QMAKE_LIBDIR_OPENVG): LIBS += -L$$QMAKE_LIBDIR_OPENVG
+!isEmpty(QMAKE_LIBS_OPENVG): LIBS += $$QMAKE_LIBS_OPENVG
+
+# Some OpenVG engines (e.g. ShivaVG) are implemented on top of OpenGL.
+# Add the extra includes and libraries for that case.
+openvg_on_opengl {
+ !isEmpty(QMAKE_INCDIR_OPENGL): INCLUDEPATH += $$QMAKE_INCDIR_OPENGL
+ !isEmpty(QMAKE_LIBDIR_OPENGL): LIBS += -L$$QMAKE_LIBDIR_OPENGL
+ !isEmpty(QMAKE_LIBS_OPENGL): LIBS += $$QMAKE_LIBS_OPENGL
+}
+
+lower_case_includes {
+ DEFINES += QT_LOWER_CASE_VG_INCLUDES
+}
+
+CONFIG -= qt
diff --git a/config.tests/unix/ptrsize.test b/config.tests/unix/ptrsize.test
index 1307cec..c1d80ee 100755
--- a/config.tests/unix/ptrsize.test
+++ b/config.tests/unix/ptrsize.test
@@ -14,9 +14,9 @@ test -d "$OUTDIR/config.tests/unix/ptrsize" || mkdir -p "$OUTDIR/config.tests/un
cd "$OUTDIR/config.tests/unix/ptrsize"
if [ "$VERBOSE" = "yes" ]; then
- (make clean && make)
+ ($MAKE clean && $MAKE)
else
- (make clean && make) >/dev/null 2>&1
+ ($MAKE clean && $MAKE) >/dev/null 2>&1
fi
RETVAL=$?
diff --git a/config.tests/unix/shivavg/shivavg.cpp b/config.tests/unix/shivavg/shivavg.cpp
new file mode 100644
index 0000000..ef3292d
--- /dev/null
+++ b/config.tests/unix/shivavg/shivavg.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <vg/openvg.h>
+
+int main(int, char **)
+{
+ VGint i;
+ i = 2;
+ vgFlush();
+ vgDestroyContextSH();
+ return 0;
+}
diff --git a/config.tests/unix/shivavg/shivavg.pro b/config.tests/unix/shivavg/shivavg.pro
new file mode 100644
index 0000000..39d7bcc
--- /dev/null
+++ b/config.tests/unix/shivavg/shivavg.pro
@@ -0,0 +1,11 @@
+SOURCES += shivavg.cpp
+
+!isEmpty(QMAKE_INCDIR_OPENVG): INCLUDEPATH += $$QMAKE_INCDIR_OPENVG
+!isEmpty(QMAKE_LIBDIR_OPENVG): LIBS += -L$$QMAKE_LIBDIR_OPENVG
+!isEmpty(QMAKE_LIBS_OPENVG): LIBS += $$QMAKE_LIBS_OPENVG
+
+!isEmpty(QMAKE_INCDIR_OPENGL): INCLUDEPATH += $$QMAKE_INCDIR_OPENGL
+!isEmpty(QMAKE_LIBDIR_OPENGL): LIBS += -L$$QMAKE_LIBDIR_OPENGL
+!isEmpty(QMAKE_LIBS_OPENGL): LIBS += $$QMAKE_LIBS_OPENGL
+
+CONFIG -= qt
diff --git a/config.tests/unix/stl/stltest.cpp b/config.tests/unix/stl/stltest.cpp
index cf5c5b8..603a41a 100644
--- a/config.tests/unix/stl/stltest.cpp
+++ b/config.tests/unix/stl/stltest.cpp
@@ -50,6 +50,53 @@ templates for common STL container classes.
#include <algorithm>
#include <iostream>
+// something mean to see if the compiler and C++ standard lib are good enough
+template<class K, class T>
+class DummyClass
+{
+ // everything in std namespace ?
+ typedef std::bidirectional_iterator_tag i;
+ typedef std::ptrdiff_t d;
+ // typename implemented ?
+ typedef typename std::map<K,T>::iterator MyIterator;
+};
+
+// extracted from QVector's strict iterator
+template<class T>
+class DummyIterator
+{
+ typedef DummyIterator<int> iterator;
+public:
+ T *i;
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef ptrdiff_t difference_type;
+ typedef T value_type;
+ typedef T *pointer;
+ typedef T &reference;
+
+ inline DummyIterator() : i(0) {}
+ inline DummyIterator(T *n) : i(n) {}
+ inline DummyIterator(const DummyIterator &o): i(o.i){}
+ inline T &operator*() const { return *i; }
+ inline T *operator->() const { return i; }
+ inline T &operator[](int j) const { return *(i + j); }
+ inline bool operator==(const DummyIterator &o) const { return i == o.i; }
+ inline bool operator!=(const DummyIterator &o) const { return i != o.i; }
+ inline bool operator<(const DummyIterator& other) const { return i < other.i; }
+ inline bool operator<=(const DummyIterator& other) const { return i <= other.i; }
+ inline bool operator>(const DummyIterator& other) const { return i > other.i; }
+ inline bool operator>=(const DummyIterator& other) const { return i >= other.i; }
+ inline DummyIterator &operator++() { ++i; return *this; }
+ inline DummyIterator operator++(int) { T *n = i; ++i; return n; }
+ inline DummyIterator &operator--() { i--; return *this; }
+ inline DummyIterator operator--(int) { T *n = i; i--; return n; }
+ inline DummyIterator &operator+=(int j) { i+=j; return *this; }
+ inline DummyIterator &operator-=(int j) { i-=j; return *this; }
+ inline DummyIterator operator+(int j) const { return DummyIterator(i+j); }
+ inline DummyIterator operator-(int j) const { return DummyIterator(i-j); }
+ inline int operator-(DummyIterator j) const { return i - j.i; }
+};
+
int main()
{
std::vector<int> v1;
@@ -94,16 +141,10 @@ int main()
int m2size = m2.size();
m2size = 0;
+ DummyIterator<int> it1, it2;
+ int n = std::distance(it1, it2);
+ std::advance(it1, 3);
+
return 0;
}
-// something mean to see if the compiler and C++ standard lib are good enough
-template<class K, class T>
-class DummyClass
-{
- // everything in std namespace ?
- typedef std::bidirectional_iterator_tag i;
- typedef std::ptrdiff_t d;
- // typename implemented ?
- typedef typename std::map<K,T>::iterator MyIterator;
-};
diff --git a/config.tests/x11/notype.test b/config.tests/x11/notype.test
index a522491..3a01d8f 100755
--- a/config.tests/x11/notype.test
+++ b/config.tests/x11/notype.test
@@ -31,9 +31,9 @@ if [ $XPLATFORM = "solaris-g++" -o $XPLATFORM = "hpux-g++" -o $XPLATFORM = "aix-
cd "$OUTDIR/config.tests/x11/notype"
if [ "$VERBOSE" = "yes" ]; then
- make
+ $MAKE
else
- make >/dev/null 2>&1
+ $MAKE >/dev/null 2>&1
fi
[ -x notypetest ] && NOTYPE=no
diff --git a/configure b/configure
index af8c209..9ef0b45 100755
--- a/configure
+++ b/configure
@@ -78,6 +78,11 @@ QMAKE_VARS_FILE=.qmake.vars
# utility functions
#-------------------------------------------------------------------------------
+shellEscape()
+{
+ echo "$@" | sed 's/ /\ /g'
+}
+
# Adds a new qmake variable to the cache
# Usage: QMakeVar mode varname contents
# where mode is one of: set, add, del
@@ -120,6 +125,30 @@ getQMakeConf()
{ print }' "$tmpSPEC/qmake.conf"
}
+# relies on $TEST_COMPILER being set correctly
+compilerSupportsFlag()
+{
+ cat >conftest.cpp <<EOF
+int main() { return 0; }
+EOF
+ "$TEST_COMPILER" "$@" -o /dev/null conftest.cpp
+ ret=$?
+ rm -f conftest.cpp conftest.o
+ return $ret
+}
+
+# relies on $TEST_COMPILER being set correctly
+linkerSupportsFlag()
+{
+ lflags=-Wl
+ for flag
+ do
+ safe_flag=`shellEscape "$flag"`
+ lflags=$lflags,$safe_flag
+ done
+ compilerSupportsFlag "$lflags" >/dev/null 2>&1
+}
+
#-------------------------------------------------------------------------------
# operating system detection
#-------------------------------------------------------------------------------
@@ -573,9 +602,12 @@ cp "$QMAKE_VARS_FILE" "$outpath/config.tests/.qmake.cache"
QMakeVar add styles "cde mac motif plastique cleanlooks windows"
QMakeVar add decorations "default windows styled"
-QMakeVar add gfx-drivers "linuxfb"
+QMakeVar add mouse-drivers "pc"
+if [ "$UNAME_SYSTEM" = "Linux" ] ; then
+ QMakeVar add gfx-drivers "linuxfb"
+ QMakeVar add mouse-drivers "linuxtp"
+fi
QMakeVar add kbd-drivers "tty"
-QMakeVar add mouse-drivers "pc linuxtp"
if [ "$CFG_DEV" = "yes" ]; then
QMakeVar add kbd-drivers "um"
@@ -591,6 +623,7 @@ MIN_DBUS_1_VERSION=0.62
CFG_CONFIGURE_EXIT_ON_ERROR=yes
CFG_PROFILE=no
CFG_EXCEPTIONS=unspecified
+CFG_SCRIPT=auto # (yes|no|auto)
CFG_SCRIPTTOOLS=auto # (yes|no|auto)
CFG_XMLPATTERNS=auto # (yes|no|auto)
CFG_INCREMENTAL=auto
@@ -620,6 +653,12 @@ CFG_XRANDR=runtime
CFG_XRENDER=auto
CFG_MITSHM=auto
CFG_OPENGL=auto
+CFG_OPENVG=no
+CFG_OPENVG_LC_INCLUDES=no
+CFG_OPENVG_SHIVA=no
+CFG_OPENVG_ON_OPENGL=no
+CFG_EGL=no
+CFG_EGL_GLES_INCLUDES=no
CFG_SSE=auto
CFG_FONTCONFIG=auto
CFG_QWS_FREETYPE=auto
@@ -631,19 +670,26 @@ CFG_NOBUILD_PARTS=""
CFG_RELEASE_QMAKE=no
CFG_PHONON=auto
CFG_PHONON_BACKEND=yes
+CFG_MULTIMEDIA=yes
CFG_SVG=yes
CFG_WEBKIT=auto # (yes|no|auto)
-CFG_GFX_AVAILABLE="linuxfb transformed qvfb vnc multiscreen"
+CFG_GFX_AVAILABLE="linuxfb transformed qvfb vnc multiscreen directfb"
CFG_GFX_ON="linuxfb multiscreen"
CFG_GFX_PLUGIN_AVAILABLE=
CFG_GFX_PLUGIN=
CFG_GFX_OFF=
-CFG_KBD_AVAILABLE="tty usb sl5000 yopy vr41xx qvfb"
+CFG_KBD_AVAILABLE="tty linuxinput qvfb"
CFG_KBD_ON="tty" #default, see QMakeVar above
-CFG_MOUSE_AVAILABLE="pc bus linuxtp yopy vr41xx tslib qvfb"
+CFG_MOUSE_AVAILABLE="pc linuxtp linuxinput tslib qvfb"
CFG_MOUSE_ON="pc linuxtp" #default, see QMakeVar above
+if [ -f "$relpath/src/gui/embedded/qscreenqnx_qws.cpp" ]; then
+ CFG_KBD_AVAILABLE="${CFG_KBD_AVAILABLE} qnx"
+ CFG_MOUSE_AVAILABLE="${CFG_MOUSE_AVAILABLE} qnx"
+ CFG_GFX_AVAILABLE="${CFG_GFX_AVAILABLE} qnx"
+fi
+
CFG_ARCH=
CFG_HOST_ARCH=
CFG_KBD_PLUGIN_AVAILABLE=
@@ -700,7 +746,7 @@ CFG_INOTIFY=auto
CFG_RPATH=yes
CFG_FRAMEWORK=auto
CFG_MAC_ARCHS=
-MAC_ARCHS_COMMANDLINE=
+MAC_CONFIG_TEST_COMMANDLINE= # used to make the configure tests run with the correct arch's and SDK settings
CFG_MAC_DWARF2=auto
CFG_MAC_XARCH=auto
CFG_MAC_CARBON=yes
@@ -725,6 +771,7 @@ OPT_VERBOSE=no
OPT_HELP=
CFG_SILENT=no
CFG_GRAPHICS_SYSTEM=default
+CFG_ALSA=auto
# initalize variables used for installation
QT_INSTALL_PREFIX=
@@ -748,6 +795,7 @@ QT_LFLAGS_MYSQL=
QT_LFLAGS_MYSQL_R=
QT_CFLAGS_SQLITE=
QT_LFLAGS_SQLITE=
+QT_LFLAGS_ODBC="-lodbc"
# flags for libdbus-1
QT_CFLAGS_DBUS=
@@ -774,7 +822,7 @@ CFG_SQL_AVAILABLE=
if [ -d "$relpath/src/plugins/sqldrivers" ]; then
for a in "$relpath/src/plugins/sqldrivers/"*; do
if [ -d "$a" ]; then
- base_a=`basename $a`
+ base_a=`basename "$a"`
CFG_SQL_AVAILABLE="${CFG_SQL_AVAILABLE} ${base_a}"
eval "CFG_SQL_${base_a}=auto"
fi
@@ -785,7 +833,7 @@ CFG_DECORATION_PLUGIN_AVAILABLE=
if [ -d "$relpath/src/plugins/decorations" ]; then
for a in "$relpath/src/plugins/decorations/"*; do
if [ -d "$a" ]; then
- base_a=`basename $a`
+ base_a=`basename "$a"`
CFG_DECORATION_PLUGIN_AVAILABLE="${CFG_DECORATION_PLUGIN_AVAILABLE} ${base_a}"
fi
done
@@ -795,7 +843,7 @@ CFG_KBD_PLUGIN_AVAILABLE=
if [ -d "$relpath/src/plugins/kbddrivers" ]; then
for a in "$relpath/src/plugins/kbddrivers/"*; do
if [ -d "$a" ]; then
- base_a=`basename $a`
+ base_a=`basename "$a"`
CFG_KBD_PLUGIN_AVAILABLE="${CFG_KBD_PLUGIN_AVAILABLE} ${base_a}"
fi
done
@@ -805,7 +853,7 @@ CFG_MOUSE_PLUGIN_AVAILABLE=
if [ -d "$relpath/src/plugins/mousedrivers" ]; then
for a in "$relpath/src/plugins/mousedrivers/"*; do
if [ -d "$a" ]; then
- base_a=`basename $a`
+ base_a=`basename "$a"`
CFG_MOUSE_PLUGIN_AVAILABLE="${CFG_MOUSE_PLUGIN_AVAILABLE} ${base_a}"
fi
done
@@ -815,7 +863,7 @@ CFG_GFX_PLUGIN_AVAILABLE=
if [ -d "$relpath/src/plugins/gfxdrivers" ]; then
for a in "$relpath/src/plugins/gfxdrivers/"*; do
if [ -d "$a" ]; then
- base_a=`basename $a`
+ base_a=`basename "$a"`
CFG_GFX_PLUGIN_AVAILABLE="${CFG_GFX_PLUGIN_AVAILABLE} ${base_a}"
fi
done
@@ -863,20 +911,21 @@ while [ "$#" -gt 0 ]; do
VAL=no
;;
#Qt style yes options
- -incremental|-qvfb|-profile|-shared|-static|-sm|-xinerama|-xshape|-xshape|-xinput|-reduce-exports|-pch|-separate-debug-info|-stl|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-nis|-qdbus|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-qt3support|-debug-and-release|-exceptions|-cocoa|-universal|-prefix-install|-silent|-armfpa|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-ptmalloc|-xmlpatterns|-phonon|-phonon-backend|-svg|-webkit|-scripttools|-rpath|-force-pkg-config)
+ -incremental|-qvfb|-profile|-shared|-static|-sm|-xinerama|-xshape|-xinput|-reduce-exports|-pch|-separate-debug-info|-stl|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-nis|-qdbus|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-qt3support|-debug-and-release|-exceptions|-cocoa|-universal|-prefix-install|-silent|-armfpa|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-ptmalloc|-xmlpatterns|-phonon|-phonon-backend|-multimedia|-svg|-webkit|-script|-scripttools|-rpath|-force-pkg-config)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
VAL=yes
;;
#Qt style options that pass an argument
-qconfig)
- if [ "$PLATFORM_QWS" = "yes" ]; then
- CFG_QCONFIG="$VAL"
- VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
- shift
- VAL=$1
- else
- UNKNOWN_ARG=yes
+ if [ "$PLATFORM_QWS" != "yes" ]; then
+ echo
+ echo "WARNING: -qconfig is only tested and supported on Qt for Embedded Linux."
+ echo
fi
+ CFG_QCONFIG="$VAL"
+ VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
+ shift
+ VAL=$1
;;
-prefix|-docdir|-headerdir|-plugindir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-demosdir|-depths|-make|-nomake|-platform|-xplatform|-buildkey|-sdk|-arch|-host-arch|-mysql_config)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
@@ -918,6 +967,16 @@ while [ "$#" -gt 0 ]; do
VAL=$1
fi
;;
+ -openvg)
+ VAR=openvg
+ # this option may or may not be followed by an argument
+ if [ -z "$2" ] || echo "$2" | grep '^-' >/dev/null 2>&1; then
+ VAL=yes
+ else
+ shift;
+ VAL=$1
+ fi
+ ;;
-hostprefix)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
# this option may or may not be followed by an argument
@@ -1162,6 +1221,13 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ openvg)
+ if [ "$VAL" = "auto" ] || [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+ CFG_OPENVG="$VAL"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
graphicssystem)
if [ "$PLATFORM_QWS" = "yes" ]; then
echo "Error: Graphics System plugins are not supported on QWS."
@@ -1172,6 +1238,8 @@ while [ "$#" -gt 0 ]; do
else
if [ "$VAL" = "opengl" ]; then
CFG_GRAPHICS_SYSTEM="opengl"
+ elif [ "$VAL" = "openvg" ]; then
+ CFG_GRAPHICS_SYSTEM="openvg"
elif [ "$VAL" = "raster" ]; then
CFG_GRAPHICS_SYSTEM="raster"
else
@@ -1179,7 +1247,7 @@ while [ "$#" -gt 0 ]; do
fi
fi
;;
-
+
qvfb) # left for commandline compatibility, not documented
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
if [ "$VAL" = "yes" ]; then
@@ -1742,6 +1810,17 @@ while [ "$#" -gt 0 ]; do
fi
fi
;;
+ script)
+ if [ "$VAL" = "yes" ] || [ "$VAL" = "auto" ]; then
+ CFG_SCRIPT="yes"
+ else
+ if [ "$VAL" = "no" ]; then
+ CFG_SCRIPT="no"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ fi
+ ;;
scripttools)
if [ "$VAL" = "yes" ] || [ "$VAL" = "auto" ]; then
CFG_SCRIPTTOOLS="yes"
@@ -1971,6 +2050,13 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ multimedia)
+ if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+ CFG_MULTIMEDIA="$VAL"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
*)
UNKNOWN_OPT=yes
;;
@@ -2025,6 +2111,12 @@ for e in gawk nawk awk; do
fi
done
+# find perl
+PERL="/usr/bin/perl"
+if "$WHICH" perl >/dev/null 2>&1 && ( perl /dev/null ) >/dev/null 2>&1; then
+ PERL=`$WHICH perl`
+fi
+
### skip this if the user just needs help...
if [ "$OPT_HELP" != "yes" ]; then
@@ -2142,8 +2234,9 @@ fi
# symlink files from src/gui/embedded neccessary to build qvfb
if [ "$CFG_DEV" = "yes" ]; then
+ mkdir -p "$outpath/tools/qvfb"
for f in qvfbhdr.h qlock_p.h qlock.cpp qwssignalhandler_p.h qwssignalhandler.cpp; do
- dest="${relpath}/tools/qvfb/${f}"
+ dest="${outpath}/tools/qvfb/${f}"
rm -f "$dest"
ln -s "${relpath}/src/gui/embedded/${f}" "${dest}"
done
@@ -2170,7 +2263,7 @@ if [ -z "$MAKE" ]; then
MAKE=
for mk in gmake make; do
if "$WHICH" $mk >/dev/null 2>&1; then
- MAKE=`$WHICH $mk`
+ MAKE=`"$WHICH" $mk`
break
fi
done
@@ -2179,6 +2272,8 @@ if [ -z "$MAKE" ]; then
echo >&2 "Cannot proceed."
exit 1
fi
+ # export MAKE, we need it later in the config.tests
+ export MAKE
fi
fi ### help
@@ -2252,6 +2347,13 @@ if [ "$CFG_EMBEDDED" != "no" ]; then
XPLATFORM="qws/linux-$CFG_EMBEDDED-g++"
fi
;;
+ QNX:*)
+ [ -z "$PLATFORM" ] && PLATFORM=unsupported/qws/qnx-generic-g++
+ if [ -z "$XPLATFORM" ]; then
+ [ "$CFG_EMBEDDED" = "auto" ] && CFG_EMBEDDED=generic
+ XPLATFORM="unsupported/qws/qnx-$CFG_EMBEDDED-g++"
+ fi
+ ;;
CYGWIN*:*)
CFG_EMBEDDED=x86
;;
@@ -2403,6 +2505,9 @@ if [ -z "$PLATFORM" ]; then
UNIX_SV:*)
PLATFORM=unixware-g++
;;
+ QNX:*)
+ PLATFORM=unsupported/qnx-g++
+ ;;
*)
if [ "$OPT_HELP" != "yes" ]; then
echo
@@ -2628,6 +2733,16 @@ if [ -z "${CFG_HOST_ARCH}" ]; then
fi
CFG_HOST_ARCH=sparc
;;
+ QNX:*:*)
+ case "$UNAME_MACHINE" in
+ x86pc)
+ if [ "$OPT_VERBOSE" = "yes" ]; then
+ echo " QNX on Intel 80x86 (i386)"
+ fi
+ CFG_HOST_ARCH=i386
+ ;;
+ esac
+ ;;
*:*:*)
if [ "$OPT_VERBOSE" = "yes" ]; then
echo " Trying '$UNAME_MACHINE'..."
@@ -2708,7 +2823,7 @@ if [ -z "$PKG_CONFIG" ]; then
PKG_CONFIG=`getQMakeConf "$XQMAKESPEC" | sed -n -e 's%PKG_CONFIG[^_].*=%%p' | tr '\n' ' '`
fi
if [ -z "$PKG_CONFIG" ]; then
- PKG_CONFIG=`$WHICH pkg-config 2>/dev/null`
+ PKG_CONFIG=`"$WHICH" pkg-config 2>/dev/null`
fi
# Work out if we can use pkg-config
@@ -2755,14 +2870,20 @@ if [ "$PLATFORM_MAC" = "yes" ]; then
# These are synonymous values
# CFG_MAC_ARCHS requires x86 while GCC requires i386
CFG_MAC_ARCHS="$CFG_MAC_ARCHS x86"
- MAC_ARCHS_COMMANDLINE="$MAC_ARCHS_COMMANDLINE -arch i386"
+ MAC_CONFIG_TEST_COMMANDLINE="$MAC_CONFIG_TEST_COMMANDLINE -arch i386"
else
CFG_MAC_ARCHS="$CFG_MAC_ARCHS $i"
- MAC_ARCHS_COMMANDLINE="$MAC_ARCHS_COMMANDLINE -arch $i"
+ MAC_CONFIG_TEST_COMMANDLINE="$MAC_CONFIG_TEST_COMMANDLINE -arch $i"
fi
done
fi
+# pass on $CFG_SDK to the configure tests.
+if [ '!' -z "$CFG_SDK" ]; then
+ MAC_CONFIG_TEST_COMMANDLINE="-sdk $CFG_SDK"
+ echo "tests command line: $MAC_CONFIG_TEST_COMMANDLINE"
+fi
+
# find the default framework value
if [ "$PLATFORM_MAC" = "yes" ] && [ "$PLATFORM" != "macx-xlc" ]; then
if [ "$CFG_FRAMEWORK" = "auto" ]; then
@@ -2921,7 +3042,7 @@ fi
#prefix
if [ -z "$QT_INSTALL_PREFIX" ]; then
if [ "$CFG_DEV" = "yes" ]; then
- QT_INSTALL_PREFIX="$outpath" # In Qt Development, we use sandboxed builds by default
+ QT_INSTALL_PREFIX="$outpath" # In Development, we use sandboxed builds by default
elif [ "$PLATFORM_QWS" = "yes" ]; then
QT_INSTALL_PREFIX="/usr/local/Trolltech/QtEmbedded-${QT_VERSION}"
if [ "$PLATFORM" != "$XPLATFORM" ]; then
@@ -3112,10 +3233,10 @@ Usage: $relconf [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir
[-no-separate-debug-info] [-no-mmx] [-no-3dnow] [-no-sse] [-no-sse2]
[-qtnamespace <namespace>] [-qtlibinfix <infix>] [-separate-debug-info] [-armfpa]
[-no-optimized-qmake] [-optimized-qmake] [-no-xmlpatterns] [-xmlpatterns]
- [-no-phonon] [-phonon] [-no-phonon-backend] [-phonon-backend]
+ [-no-multimedia] [-multimedia] [-no-phonon] [-phonon] [-no-phonon-backend] [-phonon-backend]
[-no-openssl] [-openssl] [-openssl-linked]
[-no-gtkstyle] [-gtkstyle] [-no-svg] [-svg] [-no-webkit] [-webkit]
- [-no-scripttools] [-scripttools]
+ [-no-script] [-script] [-no-scripttools] [-scripttools]
[additional platform specific options (see below)]
@@ -3248,6 +3369,9 @@ fi
QtXmlPatterns is built if a decent C++ compiler
is used and exceptions are enabled.
+ -no-multimedia ..... Do not build the QtMultimedia module.
+ + -multimedia ........ Build the QtMultimedia module.
+
-no-phonon ......... Do not build the Phonon module.
+ -phonon ............ Build the Phonon module.
Phonon is built if a decent C++ compiler is used.
@@ -3261,6 +3385,9 @@ fi
+ -webkit ............ Build the WebKit module.
WebKit is built if a decent C++ compiler is used.
+ -no-script ......... Do not build the QtScript module.
+ + -script ............ Build the QtScript module.
+
-no-scripttools .... Do not build the QtScriptTools module.
+ -scripttools ....... Build the QtScriptTools module.
@@ -3510,7 +3637,12 @@ Qt/X11 only:
to force the use of the Desktop (OpenGL 1.x or 2.x),
OpenGL ES 1.x Common profile, 1.x Common Lite profile
or 2.x APIs instead. On X11, the EGL API will be used
- to manage GL contexts in the case of OpenGL ES.
+ to manage GL contexts in the case of OpenGL ES
+
+ -no-openvg ........ Do not support OpenVG.
+ + -openvg ........... Enable OpenVG support.
+ Requires EGL support, typically supplied by an OpenGL
+ or other graphics implementation.
$SMN -no-sm ............. Do not support X Session Management.
$SMY -sm ................ Support X Session Management, links in -lSM -lICE.
@@ -3769,7 +3901,7 @@ elif [ "$Edition" = "OpenSource" ]; then
read acceptance
fi
echo
- if [ "$acceptance" = "yes" ]; then
+ if [ "$acceptance" = "yes" ] || [ "$acceptance" = "y" ]; then
break
elif [ "$acceptance" = "no" ]; then
echo "You are not licensed to use this software."
@@ -4118,9 +4250,9 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
fi
[ -f "$in_mkfile" ] || continue
- echo "########################################################################" >$mkfile
- echo "## This file was autogenerated by configure, all changes will be lost ##" >>$mkfile
- echo "########################################################################" >>$mkfile
+ echo "########################################################################" > "$mkfile"
+ echo "## This file was autogenerated by configure, all changes will be lost ##" >> "$mkfile"
+ echo "########################################################################" >> "$mkfile"
EXTRA_OBJS=
EXTRA_SRCS=
EXTRA_CFLAGS="\$(QMAKE_CFLAGS)"
@@ -4131,8 +4263,8 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
EXTRA_LFLAGS="$EXTRA_LFLAGS -lm"
fi
- [ -n "$CC" ] && echo "CC = $CC" >>$mkfile
- [ -n "$CXX" ] && echo "CXX = $CXX" >>$mkfile
+ [ -n "$CC" ] && echo "CC = $CC" >> "$mkfile"
+ [ -n "$CXX" ] && echo "CXX = $CXX" >> "$mkfile"
if [ "$CFG_SILENT" = "yes" ]; then
[ -z "$CC" ] && setBootstrapVariable QMAKE_CC 's,QMAKE_CC.*=,CC=\@,'
[ -z "$CXX" ] && setBootstrapVariable QMAKE_CXX 's,QMAKE_CXX.*=,CXX=\@,'
@@ -4167,11 +4299,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
done
fi
if [ "$PLATFORM_MAC" = "yes" ]; then
- if [ "$PLATFORM" = "macx-icc" ]; then
- echo "export MACOSX_DEPLOYMENT_TARGET = 10.4" >>"$mkfile"
- else
- echo "export MACOSX_DEPLOYMENT_TARGET = 10.3" >>"$mkfile"
- fi
+ echo "export MACOSX_DEPLOYMENT_TARGET = 10.4" >> "$mkfile"
echo "CARBON_LFLAGS =-framework ApplicationServices" >>"$mkfile"
echo "CARBON_CFLAGS =-fconstant-cfstrings" >>"$mkfile"
EXTRA_LFLAGS="$EXTRA_LFLAGS \$(CARBON_LFLAGS)"
@@ -4214,18 +4342,20 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
echo >>"$mkfile"
adjrelpath=`echo "$relpath" | sed 's/ /\\\\\\\\ /g'`
adjoutpath=`echo "$outpath" | sed 's/ /\\\\\\\\ /g'`
+ adjqmakespec=`echo "$QMAKESPEC" | sed 's/ /\\\\\\\\ /g'`
sed -e "s,@SOURCE_PATH@,$adjrelpath,g" -e "s,@BUILD_PATH@,$adjoutpath,g" \
-e "s,@QMAKE_CFLAGS@,$EXTRA_CFLAGS,g" -e "s,@QMAKE_LFLAGS@,$EXTRA_LFLAGS,g" \
-e "s,@QMAKE_CXXFLAGS@,$EXTRA_CXXFLAGS,g" \
-e "s,@QT_INSTALL_BINS@,\$(INSTALL_ROOT)$QMAKE_BIN_DIR,g" \
-e "s,@QT_INSTALL_DATA@,\$(INSTALL_ROOT)$QMAKE_DATA_DIR,g" \
-e "s,@QMAKE_QTOBJS@,$EXTRA_OBJS,g" -e "s,@QMAKE_QTSRCS@,$EXTRA_SRCS,g" \
- -e "s,@QMAKESPEC@,$QMAKESPEC,g" "$in_mkfile" >>"$mkfile"
+ -e "s,@QMAKESPEC@,$adjqmakespec,g" "$in_mkfile" >>"$mkfile"
if "$WHICH" makedepend >/dev/null 2>&1 && grep 'depend:' "$mkfile" >/dev/null 2>&1; then
(cd "$outpath/qmake" && "$MAKE" -f "$mkfile" depend) >/dev/null 2>&1
- sed "s,^.*/\([^/]*.o\):,\1:,g" "$mkfile" >"${mkfile}.tmp"
- mv "${mkfile}.tmp" "${mkfile}"
+ sed "s,^.*/\([^/]*.o\):,\1:,g" "$mkfile" >"$mkfile.tmp"
+ sed "s,$outpath,$adjoutpath,g" "$mkfile.tmp" >"$mkfile"
+ rm "$mkfile.tmp"
fi
done
@@ -4285,7 +4415,8 @@ fi
# check iWMMXt support
if [ "$CFG_IWMMXT" = "yes" ]; then
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/iwmmxt "iwmmxt" $L_FLAGS $I_FLAGS $l_FLAGS "-mcpu=iwmmxt"; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/iwmmxt "iwmmxt" $L_FLAGS $I_FLAGS $l_FLAGS "-mcpu=iwmmxt"
+ if [ $? != "0" ]; then
echo "The iWMMXt functionality test failed!"
echo " Please make sure your compiler supports iWMMXt intrinsics!"
exit 1
@@ -4307,7 +4438,7 @@ if [ "$CFG_ZLIB" = "no" ]; then
ZLIB_FORCED=yes
fi
if [ "$CFG_ZLIB" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/zlib "zlib" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/zlib "zlib" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_ZLIB=system
else
CFG_ZLIB=yes
@@ -4324,7 +4455,7 @@ if [ "$CFG_JPEG" = "auto" ]; then
fi
# detect jpeg
if [ "$CFG_LIBJPEG" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libjpeg "libjpeg" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libjpeg "libjpeg" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_LIBJPEG=system
else
CFG_LIBJPEG=qt
@@ -4351,7 +4482,7 @@ fi
# detect tiff
if [ "$CFG_LIBTIFF" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libtiff "libtiff" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libtiff "libtiff" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_LIBTIFF=system
else
CFG_LIBTIFF=qt
@@ -4368,7 +4499,7 @@ if [ "$CFG_MNG" = "auto" ]; then
fi
# detect mng
if [ "$CFG_LIBMNG" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libmng "libmng" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libmng "libmng" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_LIBMNG=system
else
CFG_LIBMNG=qt
@@ -4377,7 +4508,7 @@ fi
# detect png
if [ "$CFG_LIBPNG" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libpng "libpng" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/libpng "libpng" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_LIBPNG=system
else
CFG_LIBPNG=qt
@@ -4394,7 +4525,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
case $_SQLDR in
mysql)
if [ "$CFG_SQL_mysql" != "no" ]; then
- [ -z "$CFG_MYSQL_CONFIG" ] && CFG_MYSQL_CONFIG=`$WHICH mysql_config`
+ [ -z "$CFG_MYSQL_CONFIG" ] && CFG_MYSQL_CONFIG=`"$WHICH" mysql_config`
if [ -x "$CFG_MYSQL_CONFIG" ]; then
QT_CFLAGS_MYSQL=`$CFG_MYSQL_CONFIG --include 2>/dev/null`
QT_LFLAGS_MYSQL_R=`$CFG_MYSQL_CONFIG --libs_r 2>/dev/null`
@@ -4416,13 +4547,13 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
QT_CFLAGS_MYSQL=""
fi
else
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mysql_r "MySQL (thread-safe)" $QT_LFLAGS_MYSQL_R $L_FLAGS $QT_CFLAGS_MYSQL $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mysql_r "MySQL (thread-safe)" $QT_LFLAGS_MYSQL_R $L_FLAGS $QT_CFLAGS_MYSQL $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
QMakeVar add CONFIG use_libmysqlclient_r
if [ "$CFG_SQL_mysql" = "auto" ]; then
CFG_SQL_mysql=plugin
fi
QT_LFLAGS_MYSQL="$QT_LFLAGS_MYSQL_R"
- elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mysql "MySQL (thread-unsafe)" $QT_LFLAGS_MYSQL $L_FLAGS $QT_CFLAGS_MYSQL $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mysql "MySQL (thread-unsafe)" $QT_LFLAGS_MYSQL $L_FLAGS $QT_CFLAGS_MYSQL $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_mysql" = "auto" ]; then
CFG_SQL_mysql=plugin
fi
@@ -4451,7 +4582,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
fi
[ -z "$QT_CFLAGS_PSQL" ] || QT_CFLAGS_PSQL="-I$QT_CFLAGS_PSQL"
[ -z "$QT_LFLAGS_PSQL" ] || QT_LFLAGS_PSQL="-L$QT_LFLAGS_PSQL"
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/psql "PostgreSQL" $QT_LFLAGS_PSQL $L_FLAGS $QT_CFLAGS_PSQL $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/psql "PostgreSQL" $QT_LFLAGS_PSQL $L_FLAGS $QT_CFLAGS_PSQL $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_psql" = "auto" ]; then
CFG_SQL_psql=plugin
fi
@@ -4472,26 +4603,33 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
;;
odbc)
if [ "$CFG_SQL_odbc" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/odbc "ODBC" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if [ "$PLATFORM_MAC" != "yes" ] && "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/odbc "ODBC" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_odbc" = "auto" ]; then
CFG_SQL_odbc=plugin
fi
else
- if [ "$CFG_SQL_odbc" != "auto" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
- echo "ODBC support cannot be enabled due to functionality tests!"
- echo " Turn on verbose messaging (-v) to $0 to see the final report."
- echo " If you believe this message is in error you may use the continue"
- echo " switch (-continue) to $0 to continue."
- exit 101
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/iodbc "iODBC" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
+ QT_LFLAGS_ODBC="-liodbc"
+ if [ "$CFG_SQL_odbc" = "auto" ]; then
+ CFG_SQL_odbc=plugin
+ fi
else
- CFG_SQL_odbc=no
+ if [ "$CFG_SQL_odbc" != "auto" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+ echo "ODBC support cannot be enabled due to functionality tests!"
+ echo " Turn on verbose messaging (-v) to $0 to see the final report."
+ echo " If you believe this message is in error you may use the continue"
+ echo " switch (-continue) to $0 to continue."
+ exit 101
+ else
+ CFG_SQL_odbc=no
+ fi
fi
fi
fi
;;
oci)
if [ "$CFG_SQL_oci" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/oci "OCI" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/oci "OCI" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_oci" = "auto" ]; then
CFG_SQL_oci=plugin
fi
@@ -4510,7 +4648,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
;;
tds)
if [ "$CFG_SQL_tds" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/tds "TDS" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/tds "TDS" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_tds" = "auto" ]; then
CFG_SQL_tds=plugin
fi
@@ -4529,7 +4667,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
;;
db2)
if [ "$CFG_SQL_db2" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/db2 "DB2" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/db2 "DB2" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_db2" = "auto" ]; then
CFG_SQL_db2=plugin
fi
@@ -4548,7 +4686,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
;;
ibase)
if [ "$CFG_SQL_ibase" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/ibase "InterBase" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/ibase "InterBase" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_ibase" = "auto" ]; then
CFG_SQL_ibase=plugin
fi
@@ -4567,7 +4705,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
;;
sqlite2)
if [ "$CFG_SQL_sqlite2" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/sqlite2 "SQLite2" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/sqlite2 "SQLite2" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_sqlite2" = "auto" ]; then
CFG_SQL_sqlite2=plugin
fi
@@ -4592,7 +4730,7 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
QT_CFLAGS_SQLITE=`$PKG_CONFIG --cflags sqlite3 2>/dev/null`
QT_LFLAGS_SQLITE=`$PKG_CONFIG --libs sqlite3 2>/dev/null`
fi
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/sqlite "SQLite" $QT_LFLAGS_SQLITE $L_FLAGS $QT_CFLAGS_SQLITE $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/sqlite "SQLite" $QT_LFLAGS_SQLITE $L_FLAGS $QT_CFLAGS_SQLITE $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_SQL_sqlite" = "auto" ]; then
CFG_SQL_sqlite=plugin
fi
@@ -4629,7 +4767,7 @@ done
# auto-detect NIS support
if [ "$CFG_NIS" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/nis "NIS" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/nis "NIS" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_NIS=yes
else
if [ "$CFG_NIS" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
@@ -4646,7 +4784,7 @@ fi
# auto-detect CUPS support
if [ "$CFG_CUPS" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/cups "Cups" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/cups "Cups" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_CUPS=yes
else
if [ "$CFG_CUPS" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
@@ -4665,9 +4803,9 @@ fi
if [ "$CFG_ICONV" != "no" ]; then
if [ "$PLATFORM_QWS" = "yes" ]; then
CFG_ICONV=no
- elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" "$OPT_VERBOSE" "$relpath" "$outpath" "config.tests/unix/iconv" "POSIX iconv" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" "$OPT_VERBOSE" "$relpath" "$outpath" "config.tests/unix/iconv" "POSIX iconv" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_ICONV=yes
- elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" "$OPT_VERBOSE" "$relpath" "$outpath" "config.tests/unix/gnu-libiconv" "GNU libiconv" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" "$OPT_VERBOSE" "$relpath" "$outpath" "config.tests/unix/gnu-libiconv" "GNU libiconv" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_ICONV=gnu
else
if [ "$CFG_ICONV" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
@@ -4688,7 +4826,7 @@ if [ "$CFG_DBUS" != "no" ]; then
QT_CFLAGS_DBUS=`$PKG_CONFIG --cflags dbus-1 2>/dev/null`
QT_LIBS_DBUS=`$PKG_CONFIG --libs dbus-1 2>/dev/null`
fi
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/dbus "D-Bus" $L_FLAGS $I_FLAGS $l_FLAGS $QT_CFLAGS_DBUS $QT_LIBS_DBUS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/dbus "D-Bus" $L_FLAGS $I_FLAGS $l_FLAGS $QT_CFLAGS_DBUS $QT_LIBS_DBUS $MAC_CONFIG_TEST_COMMANDLINE; then
[ "$CFG_DBUS" = "auto" ] && CFG_DBUS=yes
QMakeVar set QT_CFLAGS_DBUS "$QT_CFLAGS_DBUS"
QMakeVar set QT_LIBS_DBUS "$QT_LIBS_DBUS"
@@ -4715,6 +4853,27 @@ if [ "$PLATFORM_MAC" = "yes" -a ! -z "$QT_NAMESPACE" ]; then
fi
if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then
+
+ # detect EGL support
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl" "EGL (EGL/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ # EGL specified by QMAKE_*_EGL, included with <EGL/egl.h>
+ CFG_EGL=yes
+ CFG_EGL_GLES_INCLUDES=no
+ elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/egl4gles1" "EGL (GLES/egl.h)" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ # EGL specified by QMAKE_*_EGL, included with <GLES/egl.h>
+ CFG_EGL=yes
+ CFG_EGL_GLES_INCLUDES=yes
+ fi
+ if ( [ "$CFG_OPENGL" = "es1" ] || [ "$CFG_OPENGL" = "es1cl" ] || [ "$CFG_OPENGL" = "es2" ] ) && [ "$CFG_EGL" != "yes" ] && [ "$PLATFORM_X11" = "yes" ]; then
+ echo "The EGL functionality test failed!"
+ echo " EGL is required for OpenGL ES on X11 to manage contexts & surfaces."
+ echo " You might need to modify the include and library search paths by editing"
+ echo " QMAKE_INCDIR_EGL, QMAKE_LIBDIR_EGL and QMAKE_LIBS_EGL in"
+ echo " ${XQMAKESPEC}."
+ exit 1
+ fi
+
+
# auto-detect Glib support
if [ "$CFG_GLIB" != "no" ]; then
if [ -n "$PKG_CONFIG" ]; then
@@ -4797,7 +4956,8 @@ if [ "$PLATFORM_X11" = "yes" ]; then
fi
# Check we actually have X11 :-)
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/xlib "XLib" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/xlib "XLib" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS
+ if [ $? != "0" ]; then
echo "Basic XLib functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
echo " QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in ${XQMAKESPEC}."
@@ -4828,7 +4988,8 @@ if [ "$PLATFORM_X11" = "yes" ]; then
hpux*)
# HP-UX have buggy glx headers; check if we really need to define the GLXFBConfig struct.
if [ "$CFG_OPENGL" = "desktop" ]; then
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/glxfbconfig "OpenGL" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/glxfbconfig "OpenGL" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS
+ if [ $? != "0" ]; then
QMakeVar add DEFINES QT_DEFINE_GLXFBCONFIG_STRUCT
fi
fi
@@ -4838,44 +4999,49 @@ if [ "$PLATFORM_X11" = "yes" ]; then
esac
elif [ "$CFG_OPENGL" = "es1cl" ]; then
# OpenGL ES 1.x common lite
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles1cl "OpenGL ES 1.x Lite" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles1cl "OpenGL ES 1.x Lite" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
echo "The OpenGL ES 1.x Common Lite Profile functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
- echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
- echo " ${XQMAKESPEC}."
+ echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
+ echo " ${XQMAKESPEC}."
exit 1
fi
elif [ "$CFG_OPENGL" = "es1" ]; then
# OpenGL ES 1.x
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles1 "OpenGL ES 1.x" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles1 "OpenGL ES 1.x" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
echo "The OpenGL ES 1.x functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
- echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
- echo " ${XQMAKESPEC}."
+ echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
+ echo " ${XQMAKESPEC}."
exit 1
fi
elif [ "$CFG_OPENGL" = "es2" ]; then
#OpenGL ES 2.x
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles2 "OpenGL ES 2.x" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles2 "OpenGL ES 2.x" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
echo "The OpenGL ES 2.0 functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
- echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
- echo " ${XQMAKESPEC}."
+ echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
+ echo " ${XQMAKESPEC}."
exit 1
fi
elif [ "$CFG_OPENGL" = "desktop" ]; then
# Desktop OpenGL support
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/opengl "OpenGL" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/opengl "OpenGL" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS
+ if [ $? != "0" ]; then
echo "The OpenGL functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
- echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
- echo " ${XQMAKESPEC}."
+ echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
+ echo " ${XQMAKESPEC}."
exit 1
fi
case "$PLATFORM" in
hpux*)
# HP-UX have buggy glx headers; check if we really need to define the GLXFBConfig struct.
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/glxfbconfig "OpenGL" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/x11/glxfbconfig "OpenGL" $L_FLAGS $I_FLAGS $l_FLAGS $X11TESTS_FLAGS
+ if [ $? != "0" ]; then
QMakeVar add DEFINES QT_DEFINE_GLXFBCONFIG_STRUCT
fi
;;
@@ -5167,7 +5333,8 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
fi
elif [ "$CFG_OPENGL" = "es1" ]; then
# OpenGL ES 1.x
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles1 "OpenGL ES 1.x" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles1 "OpenGL ES 1.x" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
echo "The OpenGL ES 1.x functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
@@ -5176,7 +5343,8 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
fi
elif [ "$CFG_OPENGL" = "es2" ]; then
#OpenGL ES 2.x
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles2 "OpenGL ES 2.x" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/opengles2 "OpenGL ES 2.x" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
echo "The OpenGL ES 2.0 functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
echo " QMAKE_INCDIR_OPENGL, QMAKE_LIBDIR_OPENGL and QMAKE_LIBS_OPENGL in"
@@ -5192,7 +5360,8 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
# screen drivers
for screen in ${CFG_GFX_ON} ${CFG_GFX_PLUGIN}; do
if [ "${screen}" = "ahi" ] && [ "${CFG_CONFIGURE_EXIT_ON_ERROR}" = "yes" ]; then
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qws/ahi "Ahi" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qws/ahi "Ahi" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
echo "The Ahi screen driver functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
echo " QMAKE_INCDIR and QMAKE_LIBDIR in"
@@ -5202,7 +5371,8 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
fi
if [ "${screen}" = "svgalib" ] && [ "${CFG_CONFIGURE_EXIT_ON_ERROR}" = "yes" ]; then
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qws/svgalib "SVGAlib" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qws/svgalib "SVGAlib" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
echo "The SVGAlib screen driver functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
echo " QMAKE_INCDIR and QMAKE_LIBDIR in"
@@ -5231,7 +5401,8 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
QMakeVar set QT_DEFINES_DIRECTFB "QT3_SUPPORT"
fi
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qws/directfb "DirectFB" $L_FLAGS $I_FLAGS $l_FLAGS $QT_CFLAGS_DIRECTFB $QT_LIBS_DIRECTFB; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qws/directfb "DirectFB" $L_FLAGS $I_FLAGS $l_FLAGS $QT_CFLAGS_DIRECTFB $QT_LIBS_DIRECTFB
+ if [ $? != "0" ]; then
echo "The DirectFB screen driver functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
echo " QT_CFLAGS_DIRECTFB and QT_LIBS_DIRECTFB in"
@@ -5245,7 +5416,8 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
# mouse drivers
for mouse in ${CFG_MOUSE_ON} ${CFG_MOUSE_PLUGIN}; do
if [ "${mouse}" = "tslib" ] && [ "${CFG_CONFIGURE_EXIT_ON_ERROR}" = "yes" ]; then
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/tslib "tslib" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/tslib "tslib" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
echo "The tslib functionality test failed!"
echo " You might need to modify the include and library search paths by editing"
echo " QMAKE_INCDIR and QMAKE_LIBDIR in"
@@ -5258,7 +5430,8 @@ if [ "$PLATFORM_QWS" = "yes" ]; then
CFG_QGTKSTYLE=no
# sound
- if ! "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qws/sound "sound" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/qws/sound "sound" $L_FLAGS $I_FLAGS $l_FLAGS
+ if [ $? != "0" ]; then
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SOUND"
fi
@@ -5268,7 +5441,7 @@ fi # QWS
[ "x$CFG_EMBEDDED" != "xno" ] && CFG_LIBFREETYPE="$CFG_QWS_FREETYPE"
[ "x$PLATFORM_MAC" = "xyes" ] && CFG_LIBFREETYPE=no
if [ "$CFG_LIBFREETYPE" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/freetype "FreeType" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/freetype "FreeType" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_LIBFREETYPE=system
else
CFG_LIBFREETYPE=yes
@@ -5385,7 +5558,7 @@ fi
# find if the platform supports IPv6
if [ "$CFG_IPV6" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/ipv6 "IPv6" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/ipv6 "IPv6" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
CFG_IPV6=yes
else
if [ "$CFG_IPV6" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
@@ -5516,7 +5689,7 @@ fi
# detect OpenSSL
if [ "$CFG_OPENSSL" != "no" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/openssl "OpenSSL" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_ARCHS_COMMANDLINE; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/openssl "OpenSSL" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then
if [ "$CFG_OPENSSL" = "auto" ]; then
CFG_OPENSSL=yes
fi
@@ -5533,6 +5706,50 @@ if [ "$CFG_OPENSSL" != "no" ]; then
fi
fi
+# detect OpenVG support
+if [ "$CFG_OPENVG" != "no" ]; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/openvg" "OpenVG" $L_FLAGS $I_FLAGS $l_FLAGS $CONFIG_ARG; then
+ if [ "$CFG_OPENVG" = "auto" ]; then
+ CFG_OPENVG=yes
+ fi
+ elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG openvg_on_opengl" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/openvg" "OpenVG" $L_FLAGS $I_FLAGS $l_FLAGS $CONFIG_ARG; then
+ if [ "$CFG_OPENVG" = "auto" ]; then
+ CFG_OPENVG=yes
+ fi
+ CFG_OPENVG_ON_OPENGL=yes
+ elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG lower_case_includes" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/openvg" "OpenVG (lc includes)" $L_FLAGS $I_FLAGS $l_FLAGS $CONFIG_ARG; then
+ if [ "$CFG_OPENVG" = "auto" ]; then
+ CFG_OPENVG=yes
+ fi
+ CFG_OPENVG_LC_INCLUDES=yes
+ elif "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG openvg_on_opengl lower_case_includes" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/openvg" "OpenVG (lc includes)" $L_FLAGS $I_FLAGS $l_FLAGS $CONFIG_ARG; then
+ if [ "$CFG_OPENVG" = "auto" ]; then
+ CFG_OPENVG=yes
+ fi
+ CFG_OPENVG_LC_INCLUDES=yes
+ CFG_OPENVG_ON_OPENGL=yes
+ else
+ if [ "$CFG_OPENVG" != "auto" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+ echo "$CFG_OPENVG was specified for OpenVG but cannot be enabled due to functionality tests!"
+ echo " Turn on verbose messaging (-v) to $0 to see the final report."
+ echo " If you believe this message is in error you may use the continue"
+ echo " switch (-continue) to $0 to continue."
+ exit 101
+ else
+ CFG_OPENVG=no
+ fi
+ fi
+ if [ "$CFG_OPENVG" == "yes" ] && "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" "config.tests/unix/shivavg" "ShivaVG" $L_FLAGS $I_FLAGS $l_FLAGS $CONFIG_ARG; then
+ CFG_OPENVG_SHIVA=yes
+ fi
+fi
+
+# if openvg is disabled and the user specified graphicssystem vg, disable it...
+if [ "$CFG_GRAPHICS_SYSTEM" = "openvg" ] && [ "$CFG_OPENVG" = "no" ]; then
+ echo "OpenVG Graphics System is disabled due to missing OpenVG support..."
+ CFG_GRAPHICS_SYSTEM=default
+fi
+
if [ "$CFG_PTMALLOC" != "no" ]; then
# build ptmalloc, copy .a file to lib/
echo "Building ptmalloc. Please wait..."
@@ -5542,6 +5759,14 @@ if [ "$CFG_PTMALLOC" != "no" ]; then
QMakeVar add QMAKE_LFLAGS "$outpath/lib/libptmalloc3.a"
fi
+if [ "$CFG_ALSA" = "auto" ]; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/alsa "alsa" $L_FLAGS $I_FLAGS $l_FLAGS; then
+ CFG_ALSA=yes
+ else
+ CFG_ALSA=no
+ fi
+fi
+
#-------------------------------------------------------------------------------
# ask for all that hasn't been auto-detected or specified in the arguments
#-------------------------------------------------------------------------------
@@ -5585,17 +5810,23 @@ if [ "$CFG_MAC_DWARF2" = "yes" ]; then
QT_CONFIG="$QT_CONFIG dwarf2"
fi
-# Set the default arch. Select 32-bit/carbon if nothing else has
-# been specified on the configure line.
+# Set the default arch.
+# Carbon builds: 32 bit x86/ppc.
+# For "-cocoa" builds on snow leopard : compiler default (64-bit).
+# For "-cocoa" builds on leopard : compiler default (32-bit).
if [ "$PLATFORM_MAC" = "yes" ] && [ "$CFG_MAC_ARCHS" == "" ]; then
source "$mactests/defaultarch.test" "$TEST_COMPILER" "$OPT_VERBOSE" "$mactests"
- if [ "$QT_MAC_DEFUALT_ARCH" == "x86_64" ]; then
- CFG_MAC_ARCHS=" x86"
- elif [ "$QT_MAC_DEFUALT_ARCH" == "ppc64" ]; then
- CFG_MAC_ARCHS=" ppc"
- else
- CFG_MAC_ARCHS=" $QT_MAC_DEFUALT_ARCH"
+ if [ "$CFG_MAC_COCOA" != "yes" ]; then
+ if [ "$QT_MAC_DEFAULT_ARCH" == "x86_64" ]; then
+ CFG_MAC_ARCHS=" x86"
+ elif [ "$QT_MAC_DEFAULT_ARCH" == "ppc64" ]; then
+ CFG_MAC_ARCHS=" ppc"
+ else
+ CFG_MAC_ARCHS=" $QT_MAC_DEFAULT_ARCH"
+ fi
+ else
+ CFG_MAC_ARCHS=" $QT_MAC_DEFAULT_ARCH"
fi
[ "$OPT_VERBOSE" == "yes" ] && echo "Setting Mac architechture to$CFG_MAC_ARCHS."
@@ -5622,7 +5853,7 @@ else
fi
fi;
-# set the global Mac deployment target. This is overridden on an arch-by-arch basis
+# set the global Mac deployment target. This is overridden on an arch-by-arch basis
# in some cases, see code further down
case "$PLATFORM,$CFG_MAC_COCOA" in
macx*,yes)
@@ -5630,16 +5861,19 @@ case "$PLATFORM,$CFG_MAC_COCOA" in
QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET 10.5
CFG_QT3SUPPORT="no"
;;
- macx-icc,*)
- # Intel CC, Carbon
- QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET 10.4
- ;;
macx*,no)
# gcc, Carbon
- QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET 10.3
+ QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET 10.4
;;
esac
+# disable Qt 3 support on VxWorks
+case "$XPLATFORM" in
+ unsupported/vxworks*)
+ CFG_QT3SUPPORT="no"
+ ;;
+esac
+
# enable Qt 3 support functionality
if [ "$CFG_QT3SUPPORT" = "yes" ]; then
QT_CONFIG="$QT_CONFIG qt3support"
@@ -5662,6 +5896,33 @@ else
QT_CONFIG="$QT_CONFIG accessibility"
fi
+# enable egl
+if [ "$CFG_EGL" = "no" ]; then
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_EGL"
+else
+ QT_CONFIG="$QT_CONFIG egl"
+ if [ "$CFG_EGL_GLES_INCLUDES" = "yes" ]; then
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_GLES_EGL"
+ fi
+fi
+
+# enable openvg
+if [ "$CFG_OPENVG" = "no" ]; then
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_OPENVG"
+else
+ QT_CONFIG="$QT_CONFIG openvg"
+ if [ "$CFG_OPENVG_LC_INCLUDES" = "yes" ]; then
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_LOWER_CASE_VG_INCLUDES"
+ fi
+ if [ "$CFG_OPENVG_ON_OPENGL" = "yes" ]; then
+ QT_CONFIG="$QT_CONFIG openvg_on_opengl"
+ fi
+ if [ "$CFG_OPENVG_SHIVA" = "yes" ]; then
+ QT_CONFIG="$QT_CONFIG shivavg"
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_SHIVAVG"
+ fi
+fi
+
# enable opengl
if [ "$CFG_OPENGL" = "no" ]; then
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_OPENGL"
@@ -5952,6 +6213,10 @@ if [ "$CFG_EXCEPTIONS" != "no" ]; then
QTCONFIG_CONFIG="$QTCONFIG_CONFIG exceptions"
fi
+if [ "$CFG_ALSA" = "yes" ]; then
+ QT_CONFIG="$QT_CONFIG alsa"
+fi
+
#
# Some Qt modules are too advanced in C++ for some old compilers
# Detect here the platforms where they are known to work.
@@ -5961,6 +6226,7 @@ fi
#
canBuildQtXmlPatterns="yes"
canBuildWebKit="$HAVE_STL"
+canBuildQtConcurrent="yes"
# WebKit requires stdint.h
"$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/stdint "Stdint" $L_FLAGS $I_FLAGS $l_FLAGS
@@ -5987,14 +6253,21 @@ case "$XPLATFORM" in
;;
esac
;;
+ unsupported/vxworks-*-g++*)
+ canBuildWebKit="no"
+ ;;
+ unsupported/vxworks-*-dcc*)
+ canBuildWebKit="no"
+ canBuildQtXmlPatterns="no"
+ ;;
*-g++*)
# Check gcc's version
case "$(${QMAKE_CONF_COMPILER} -dumpversion)" in
4*|3.4*)
;;
- 3.3*)
- canBuildWebKit="no"
- ;;
+ 3.3*)
+ canBuildWebKit="no"
+ ;;
*)
canBuildWebKit="no"
canBuildQtXmlPatterns="no"
@@ -6002,30 +6275,74 @@ case "$XPLATFORM" in
esac
;;
solaris-cc*)
- # Check the compiler version
- case `${QMAKE_CONF_COMPILER} -V 2>&1 | awk '{print $4}'` in
- *)
- canBuildWebKit="no"
- canBuildQtXmlPatterns="no"
- ;;
- esac
- ;;
+ # Check the compiler version
+ case `${QMAKE_CONF_COMPILER} -V 2>&1 | awk '{print $4}'` in
+ 5.[012345678])
+ canBuildWebKit="no"
+ canBuildQtXmlPatterns="no"
+ canBuildQtConcurrent="no"
+ ;;
+ 5.9)
+ canBuildWebKit="no"
+ canBuildQtConcurrent="no"
+ ;;
+ esac
+ ;;
hpux-acc*)
canBuildWebKit="no"
canBuildQtXmlPatterns="no"
+ canBuildQtConcurrent="no"
;;
hpuxi-acc*)
canBuildWebKit="no"
;;
aix-xlc*)
- canBuildWebKit="no"
- canBuildQtXmlPatterns="no"
- ;;
+ # Get the xlC version
+ cat > xlcver.c <<EOF
+#include <stdio.h>
+int main()
+{
+ printf("%d.%d\n", __xlC__ >> 8, __xlC__ & 0xFF);
+ return 0;
+}
+EOF
+ xlcver=
+ if ${QMAKE_CONF_COMPILER} -o xlcver xlcver.c >/dev/null 2>/dev/null; then
+ xlcver=`./xlcver 2>/dev/null`
+ rm -f ./xlcver
+ fi
+ if [ "$OPT_VERBOSE" = "yes" ]; then
+ if [ -n "$xlcver" ]; then
+ echo Found IBM xlC version: $xlcver.
+ else
+ echo Could not determine IBM xlC version, assuming oldest supported.
+ fi
+ fi
+
+ case "$xlcver" in
+ [123456].*)
+ canBuildWebKit="no"
+ canBuildQtXmlPatterns="no"
+ canBuildQtConcurrent="no"
+ ;;
+ *)
+ canBuildWebKit="no"
+ canBuildQtConcurrent="no"
+ ;;
+ esac
+ ;;
irix-cc*)
canBuildWebKit="no"
+ canBuildQtConcurrent="no"
;;
esac
+CFG_CONCURRENT="yes"
+if [ "$canBuildQtConcurrent" = "no" ]; then
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_CONCURRENT"
+ CFG_CONCURRENT="no"
+fi
+
if [ "$CFG_XMLPATTERNS" = "yes" -a "$CFG_EXCEPTIONS" = "no" ]; then
echo "QtXmlPatterns was requested, but it can't be built due to exceptions being disabled."
exit 1
@@ -6041,6 +6358,12 @@ else
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XMLPATTERNS"
fi
+if [ "$CFG_MULTIMEDIA" = "no" ]; then
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_MULTIMEDIA"
+else
+ QT_CONFIG="$QT_CONFIG multimedia"
+fi
+
if [ "$CFG_SVG" = "yes" ]; then
QT_CONFIG="$QT_CONFIG svg"
else
@@ -6060,13 +6383,28 @@ else
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_WEBKIT"
fi
-if [ "$CFG_SCRIPTTOOLS" = "auto" ]; then
+if [ "$CFG_SCRIPT" = "auto" ]; then
+ CFG_SCRIPT="$canBuildWebKit"
+fi
+
+if [ "$CFG_SCRIPT" = "yes" ]; then
+ QT_CONFIG="$QT_CONFIG script"
+else
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SCRIPT"
+fi
+
+if [ "$CFG_SCRIPTTOOLS" = "yes" -a "$CFG_SCRIPT" = "no" ]; then
+ echo "QtScriptTools was requested, but it can't be built due to QtScript being disabled."
+ exit 1
+fi
+if [ "$CFG_SCRIPTTOOLS" = "auto" -a "$CFG_SCRIPT" != "no" ]; then
CFG_SCRIPTTOOLS="yes"
+elif [ "$CFG_SCRIPT" = "no" ]; then
+ CFG_SCRIPTTOOLS="no"
fi
if [ "$CFG_SCRIPTTOOLS" = "yes" ]; then
QT_CONFIG="$QT_CONFIG scripttools"
- CFG_SCRIPTTOOLS="yes"
else
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SCRIPTTOOLS"
fi
@@ -6095,7 +6433,7 @@ fi
# On Mac, set the minimum deployment target for the different architechtures
# using the Xarch compiler option when supported (10.5 and up). On 10.4 the
-# deployment version is set to 10.3 globally using the QMAKE_MACOSX_DEPLOYMENT_TARGET
+# deployment version is set to 10.4 globally using the QMAKE_MACOSX_DEPLOYMENT_TARGET
# env. variable. "-cocoa" on the command line means Cocoa is used in 32-bit mode also,
# in this case fall back on QMAKE_MACOSX_DEPLOYMENT_TARGET which will be set to 10.5.
if [ "$PLATFORM_MAC" = "yes" ] && [ "$CFG_MAC_XARCH" != "no" ] && [ "$COMMANDLINE_MAC_COCOA" != "yes" ]; then
@@ -6106,10 +6444,10 @@ if [ "$PLATFORM_MAC" = "yes" ] && [ "$CFG_MAC_XARCH" != "no" ] && [ "$COMMANDLIN
QMakeVar add QMAKE_OBJECTIVE_CFLAGS_X86 "-arch i386 -Xarch_i386 -mmacosx-version-min=10.4"
fi
if echo "$CFG_MAC_ARCHS" | grep '\<ppc\>' > /dev/null 2>&1; then
- QMakeVar add QMAKE_CFLAGS "-Xarch_ppc -mmacosx-version-min=10.3"
- QMakeVar add QMAKE_CXXFLAGS "-Xarch_ppc -mmacosx-version-min=10.3"
- QMakeVar add QMAKE_LFLAGS "-Xarch_ppc -mmacosx-version-min=10.3"
- QMakeVar add QMAKE_OBJECTIVE_CFLAGS_PPC "-arch ppc -Xarch_ppc -mmacosx-version-min=10.3"
+ QMakeVar add QMAKE_CFLAGS "-Xarch_ppc -mmacosx-version-min=10.4"
+ QMakeVar add QMAKE_CXXFLAGS "-Xarch_ppc -mmacosx-version-min=10.4"
+ QMakeVar add QMAKE_LFLAGS "-Xarch_ppc -mmacosx-version-min=10.4"
+ QMakeVar add QMAKE_OBJECTIVE_CFLAGS_PPC "-arch ppc -Xarch_ppc -mmacosx-version-min=10.4"
fi
if echo "$CFG_MAC_ARCHS" | grep '\<x86_64\>' > /dev/null 2>&1; then
QMakeVar add QMAKE_CFLAGS "-Xarch_x86_64 -mmacosx-version-min=10.5"
@@ -6179,10 +6517,8 @@ esac
# Different edition modules:
# network canvas table xml opengl sql
#
-# Options:
-# stl
-#
# Things that do not affect the Qt API/ABI:
+# stl
# system-jpeg no-jpeg jpeg
# system-mng no-mng mng
# system-png no-png png
@@ -6192,7 +6528,6 @@ esac
# debug release
# dll staticlib
#
-# internal
# nocrosscompiler
# GNUmake
# largefile
@@ -6204,7 +6539,7 @@ esac
# X11 : x11sm xinerama xcursor xfixes xrandr xrender mitshm fontconfig xkb
# Embedded: embedded freetype
#
-ALL_OPTIONS="stl"
+ALL_OPTIONS=
BUILD_CONFIG=
BUILD_OPTIONS=
@@ -6218,12 +6553,6 @@ for config_option in $QMAKE_CONFIG $QT_CONFIG; do
BUILD_CONFIG="$config_option"
;;
- stl)
- # these config options affect the Qt API/ABI. they should influence
- # the generation of the buildkey, so we don't skip them
- SKIP="no"
- ;;
-
*) # skip all other options since they don't affect the Qt API/ABI.
;;
esac
@@ -6543,6 +6872,7 @@ QMakeVar set sql-plugins "$SQL_PLUGINS"
if [ "$PLATFORM_QWS" != "yes" ]; then
[ "$CFG_GRAPHICS_SYSTEM" = "raster" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_GRAPHICSSYSTEM_RASTER"
[ "$CFG_GRAPHICS_SYSTEM" = "opengl" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_GRAPHICSSYSTEM_OPENGL"
+ [ "$CFG_GRAPHICS_SYSTEM" = "openvg" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_GRAPHICSSYSTEM_OPENVG"
fi
# X11/Unix/Mac only configs
@@ -6580,6 +6910,7 @@ fi
[ "$CFG_XFIXES" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XFIXES"
[ "$CFG_XRANDR" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XRANDR"
[ "$CFG_XINPUT" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XINPUT"
+[ "$CFG_ALSA" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_ALSA"
# sort QCONFIG_FLAGS for neatness if we can
[ '!' -z "$AWK" ] && QCONFIG_FLAGS=`echo $QCONFIG_FLAGS | $AWK '{ gsub(" ", "\n"); print }' | sort | uniq`
@@ -6673,6 +7004,9 @@ fi
if [ "$PLATFORM_MAC" = "yes" ]; then
QT_CONFIG="$QT_CONFIG $CFG_MAC_ARCHS"
fi
+if [ "$CFG_DEV" = "yes" ]; then
+ QT_CONFIG="$QT_CONFIG private_tests"
+fi
# Make the application arch follow the Qt arch for single arch builds.
# (for multiple-arch builds, set CONFIG manually in the application .pro file)
@@ -6739,6 +7073,11 @@ QMAKE_LIBDIR_QT = \$\$QT_BUILD_TREE/lib
EOF
+# Ensure we can link to uninistalled libraries
+if linkerSupportsFlag -rpath-link "$outpath/lib"; then
+ echo "QMAKE_LFLAGS += -Wl,-rpath-link,\$\$QT_BUILD_TREE/lib" >> "$CACHEFILE.tmp"
+fi
+
if [ -n "$QT_CFLAGS_PSQL" ]; then
echo "QT_CFLAGS_PSQL = $QT_CFLAGS_PSQL" >> "$CACHEFILE.tmp"
fi
@@ -6757,6 +7096,9 @@ fi
if [ -n "$QT_LFLAGS_SQLITE" ]; then
echo "QT_LFLAGS_SQLITE = $QT_LFLAGS_SQLITE" >> "$CACHEFILE.tmp"
fi
+if [ -n "$QT_LFLAGS_ODBC" ]; then
+ echo "QT_LFLAGS_ODBC = $QT_LFLAGS_ODBC" >> "$CACHEFILE.tmp"
+fi
if [ "$QT_EDITION" != "QT_EDITION_OPENSOURCE" ]; then
echo "DEFINES *= QT_EDITION=QT_EDITION_DESKTOP" >> "$CACHEFILE.tmp"
@@ -6929,9 +7271,12 @@ echo "Qt 3 compatibility .. $CFG_QT3SUPPORT"
[ "$CFG_DBUS" = "no" ] && echo "QtDBus module ....... no"
[ "$CFG_DBUS" = "yes" ] && echo "QtDBus module ....... yes (run-time)"
[ "$CFG_DBUS" = "linked" ] && echo "QtDBus module ....... yes (linked)"
+echo "QtConcurrent code.... $CFG_CONCURRENT"
+echo "QtScript module ..... $CFG_SCRIPT"
echo "QtScriptTools module $CFG_SCRIPTTOOLS"
echo "QtXmlPatterns module $CFG_XMLPATTERNS"
echo "Phonon module ....... $CFG_PHONON"
+echo "Multimedia module ... $CFG_MULTIMEDIA"
echo "SVG module .......... $CFG_SVG"
echo "WebKit module ....... $CFG_WEBKIT"
echo "STL support ......... $CFG_STL"
@@ -7011,6 +7356,20 @@ elif [ "$CFG_OPENGL" = "es2" ]; then
else
echo "OpenGL support ...... no"
fi
+if [ "$CFG_EGL" != "no" ]; then
+ if [ "$CFG_EGL_GLES_INCLUDES" != "no" ]; then
+ echo "EGL support ......... yes <GLES/egl.h>"
+ else
+ echo "EGL support ......... yes <EGL/egl.h>"
+ fi
+fi
+if [ "$CFG_OPENVG" ]; then
+ if [ "$CFG_OPENVG_SHIVA" = "yes" ]; then
+ echo "OpenVG support ...... ShivaVG"
+ else
+ echo "OpenVG support ...... $CFG_OPENVG"
+ fi
+fi
if [ "$PLATFORM_X11" = "yes" ]; then
echo "NAS sound support ... $CFG_NAS"
echo "XShape support ...... $CFG_XSHAPE"
@@ -7068,6 +7427,7 @@ if [ "$PLATFORM_MAC" = "yes" ] && [ "$CFG_FRAMEWORK" = "yes" ] && [ "$CFG_DEBUG"
echo "NOTE: Mac OS X frameworks implicitly build debug and release Qt libraries."
echo
fi
+echo "alsa support ........ $CFG_ALSA"
echo
sepath=`echo "$relpath" | sed -e 's/\\./\\\\./g'`
@@ -7235,11 +7595,12 @@ for file in .projects .projects.3; do
case $a in
*winmain/winmain.pro) continue ;;
+ *s60main/s60main.pro) continue ;;
*/qmake/qmake.pro) continue ;;
*tools/bootstrap*|*tools/moc*|*tools/rcc*|*tools/uic*) SPEC=$QMAKESPEC ;;
*) SPEC=$XQMAKESPEC ;;
esac
- dir=`dirname $a | sed -e "s;$sepath;.;g"`
+ dir=`dirname "$a" | sed -e "s;$sepath;.;g"`
test -d "$dir" || mkdir -p "$dir"
OUTDIR="$outpath/$dir"
if [ -f "${OUTDIR}/Makefile" ] && [ "$OPT_FAST" = "yes" ]; then
@@ -7382,7 +7743,7 @@ if [ -n "$RPATH_MESSAGE" ]; then
echo "$RPATH_MESSAGE"
fi
-MAKE=`basename $MAKE`
+MAKE=`basename "$MAKE"`
echo
echo Qt is now configured for building. Just run \'$MAKE\'.
if [ "$relpath" = "$QT_INSTALL_PREFIX" ]; then
diff --git a/configure.exe b/configure.exe
index df6a6ac..4c095d2 100644..100755
--- a/configure.exe
+++ b/configure.exe
Binary files differ
diff --git a/demos/affine/affine.pro b/demos/affine/affine.pro
index b928753..7f9e444 100644
--- a/demos/affine/affine.pro
+++ b/demos/affine/affine.pro
@@ -18,6 +18,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.html *.jpg
sources.path = $$[QT_INSTALL_DEMOS]/affine
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
wince*: {
DEPLOYMENT_PLUGIN += qjpeg
}
diff --git a/demos/arthurplugin/arthurplugin.pro b/demos/arthurplugin/arthurplugin.pro
index e9eb1f3..3114293 100644
--- a/demos/arthurplugin/arthurplugin.pro
+++ b/demos/arthurplugin/arthurplugin.pro
@@ -44,6 +44,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.jpg *.png
sources.path = $$[QT_INSTALL_DEMOS]/arthurplugin
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
win32-msvc* {
QMAKE_CFLAGS += /Zm500
QMAKE_CXXFLAGS += /Zm500
diff --git a/demos/arthurplugin/plugin.cpp b/demos/arthurplugin/plugin.cpp
index 19fecbc..727fd12 100644
--- a/demos/arthurplugin/plugin.cpp
+++ b/demos/arthurplugin/plugin.cpp
@@ -55,7 +55,26 @@
QT_FORWARD_DECLARE_CLASS(QDesignerFormEditorInterface)
-static inline QString customWidgetDomXml(const QString &className)
+// Specify "text" to be a singleline property (no richtext)
+static inline QString textSingleLinePropertyDeclaration(const QString &className)
+{
+ QString rc = QLatin1String(
+ "<customwidgets>\n"
+ " <customwidget>\n"
+ " <class>");
+ rc += className;
+ rc += QLatin1String("</class>\n"
+ " <propertyspecifications>\n"
+ " <stringpropertyspecification name=\"text\" type=\"singleline\"/>\n"
+ " </propertyspecifications>\n"
+ " </customwidget>\n"
+ "</customwidgets>\n");
+ return rc;
+}
+
+// Plain XML for a custom widget
+static inline QString customWidgetDomXml(const QString &className,
+ const QString &customSection = QString())
{
QString rc = QLatin1String("<ui language=\"c++\"><widget class=\"");
rc += className;
@@ -63,7 +82,9 @@ static inline QString customWidgetDomXml(const QString &className)
QString objectName = className;
objectName[0] = objectName.at(0).toLower();
rc += objectName;
- rc += QLatin1String("\"/></ui>");
+ rc += QLatin1String("\"/>");
+ rc += customSection;
+ rc += QLatin1String("</ui>");
return rc;
}
@@ -80,7 +101,7 @@ class DemoPlugin : public QDesignerCustomWidgetInterface
Q_INTERFACES(QDesignerCustomWidgetInterface)
protected:
- DemoPlugin(const QString &className);
+ explicit DemoPlugin(const QString &className, const QString &customSection = QString());
public:
QString name() const { return m_className; }
@@ -105,9 +126,9 @@ private:
bool m_initialized;
};
-DemoPlugin::DemoPlugin(const QString &className) :
+DemoPlugin::DemoPlugin(const QString &className, const QString &customSection) :
m_className(className),
- m_domXml(customWidgetDomXml(className)),
+ m_domXml(customWidgetDomXml(className, customSection)),
m_initialized(false)
{
}
@@ -117,8 +138,8 @@ class DeformPlugin : public QObject, public DemoPlugin
Q_OBJECT
public:
- DeformPlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("PathDeformRendererEx")) { }
- QString includeFile() const { return "deform.h"; }
+ explicit DeformPlugin(QObject *parent = 0);
+ QString includeFile() const { return QLatin1String("deform.h"); }
QWidget *createWidget(QWidget *parent)
{
@@ -126,12 +147,19 @@ public:
deform->setRadius(70);
deform->setAnimated(false);
deform->setFontSize(20);
- deform->setText("Arthur Widgets Demo");
+ deform->setText(QLatin1String("Arthur Widgets Demo"));
return deform;
}
};
+DeformPlugin::DeformPlugin(QObject *parent) :
+ QObject(parent),
+ DemoPlugin(QLatin1String("PathDeformRendererEx"),
+ textSingleLinePropertyDeclaration(QLatin1String("PathDeformRendererEx")))
+{
+}
+
class XFormRendererEx : public XFormView
{
Q_OBJECT
@@ -144,24 +172,30 @@ class XFormPlugin : public QObject, public DemoPlugin
{
Q_OBJECT
public:
- XFormPlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("XFormRendererEx")) { }
- QString includeFile() const { return "xform.h"; }
+ explicit XFormPlugin(QObject *parent = 0);
+ QString includeFile() const { return QLatin1String("xform.h"); }
QWidget *createWidget(QWidget *parent)
{
XFormRendererEx *xform = new XFormRendererEx(parent);
- xform->setText("Qt - Hello World!!");
- xform->setPixmap(QPixmap(":/trolltech/arthurplugin/bg1.jpg"));
+ xform->setText(QLatin1String("Qt - Hello World!!"));
+ xform->setPixmap(QPixmap(QLatin1String(":/trolltech/arthurplugin/bg1.jpg")));
return xform;
}
};
+XFormPlugin::XFormPlugin(QObject *parent) :
+ QObject(parent),
+ DemoPlugin(QLatin1String("XFormRendererEx"),
+ textSingleLinePropertyDeclaration(QLatin1String("XFormRendererEx")))
+{
+}
class GradientEditorPlugin : public QObject, public DemoPlugin
{
Q_OBJECT
public:
- GradientEditorPlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("GradientEditor")) { }
+ explicit GradientEditorPlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("GradientEditor")) { }
QString includeFile() const { return "gradients.h"; }
QWidget *createWidget(QWidget *parent)
@@ -184,7 +218,7 @@ class GradientRendererPlugin : public QObject, public DemoPlugin
Q_OBJECT
public:
GradientRendererPlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("GradientRendererEx")) { }
- QString includeFile() const { return "gradients.h"; }
+ QString includeFile() const { return QLatin1String("gradients.h"); }
QWidget *createWidget(QWidget *parent)
{
@@ -198,7 +232,7 @@ class PathStrokeRendererEx : public PathStrokeRenderer
{
Q_OBJECT
public:
- PathStrokeRendererEx(QWidget *p) : PathStrokeRenderer(p) { }
+ explicit PathStrokeRendererEx(QWidget *p) : PathStrokeRenderer(p) { }
QSize sizeHint() const { return QSize(300, 200); }
};
@@ -206,8 +240,8 @@ class StrokeRenderPlugin : public QObject, public DemoPlugin
{
Q_OBJECT
public:
- StrokeRenderPlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("PathStrokeRendererEx")) { }
- QString includeFile() const { return "pathstroke.h"; }
+ explicit StrokeRenderPlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("PathStrokeRendererEx")) { }
+ QString includeFile() const { return QLatin1String("pathstroke.h"); }
QWidget *createWidget(QWidget *parent)
{
@@ -221,8 +255,8 @@ class CompositionModePlugin : public QObject, public DemoPlugin
{
Q_OBJECT
public:
- CompositionModePlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("CompositionRenderer")) { }
- QString includeFile() const { return "composition.h"; }
+ explicit CompositionModePlugin(QObject *parent = 0) : QObject(parent), DemoPlugin(QLatin1String("CompositionRenderer")) { }
+ QString includeFile() const { return QLatin1String("composition.h"); }
QWidget *createWidget(QWidget *parent)
{
@@ -239,7 +273,7 @@ class ArthurPlugins : public QObject, public QDesignerCustomWidgetCollectionInte
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
public:
- ArthurPlugins(QObject *parent = 0);
+ explicit ArthurPlugins(QObject *parent = 0);
QList<QDesignerCustomWidgetInterface*> customWidgets() const { return m_plugins; }
private:
diff --git a/demos/books/books.pro b/demos/books/books.pro
index a2cd33f..a5e44e5 100644
--- a/demos/books/books.pro
+++ b/demos/books/books.pro
@@ -13,9 +13,11 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro images
sources.path = $$[QT_INSTALL_DEMOS]/books
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
wince*: {
CONFIG(debug, debug|release):sqlPlugins.sources = $$QT_BUILD_TREE/plugins/sqldrivers/*d4.dll
CONFIG(release, debug|release):sqlPlugins.sources = $$QT_BUILD_TREE/plugins/sqldrivers/*[^d]4.dll
sqlPlugins.path = sqldrivers
DEPLOYMENT += sqlPlugins
-} \ No newline at end of file
+}
diff --git a/demos/boxes/boxes.pro b/demos/boxes/boxes.pro
index 6c1a331..59c9132 100644
--- a/demos/boxes/boxes.pro
+++ b/demos/boxes/boxes.pro
@@ -11,17 +11,14 @@ INCLUDEPATH += .
HEADERS += 3rdparty/fbm.h \
glbuffers.h \
glextensions.h \
- glshaders.h \
gltrianglemesh.h \
qtbox.h \
roundedbox.h \
scene.h \
- trackball.h \
- vector.h
+ trackball.h
SOURCES += 3rdparty/fbm.c \
glbuffers.cpp \
glextensions.cpp \
- glshaders.cpp \
main.cpp \
qtbox.cpp \
roundedbox.cpp \
@@ -45,6 +42,8 @@ wince*: {
}
win32-msvc* {
- QMAKE_CXXFLAGS += /Zm1200
- QMAKE_CFLAGS += /Zm1200
+ QMAKE_CXXFLAGS -= -Zm200
+ QMAKE_CFLAGS -= -Zm200
+ QMAKE_CXXFLAGS += -Zm1200
+ QMAKE_CFLAGS += -Zm1200
}
diff --git a/demos/boxes/glbuffers.cpp b/demos/boxes/glbuffers.cpp
index 69d7ad8..a3d26f6 100644
--- a/demos/boxes/glbuffers.cpp
+++ b/demos/boxes/glbuffers.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "glbuffers.h"
+#include <QtGui/qmatrix4x4.h>
//============================================================================//
// GLTexture //
@@ -346,7 +347,7 @@ void GLRenderTargetCube::end()
m_fbo.setAsRenderTarget(false);
}
-void GLRenderTargetCube::getViewMatrix(gfx::Matrix4x4f& mat, int face)
+void GLRenderTargetCube::getViewMatrix(QMatrix4x4& mat, int face)
{
if (face < 0 || face >= 6) {
qWarning("GLRenderTargetCube::getViewMatrix: 'face' must be in the range [0, 6). (face == %d)", face);
@@ -371,20 +372,21 @@ void GLRenderTargetCube::getViewMatrix(gfx::Matrix4x4f& mat, int face)
{-1.0f, -1.0f, +1.0f},
};
- memset(mat.bits(), 0, sizeof(float) * 16);
+ memset(mat.data(), 0, sizeof(float) * 16);
for (int i = 0; i < 3; ++i)
- mat(perm[face][i], i) = signs[face][i];
+ mat(i, perm[face][i]) = signs[face][i];
mat(3, 3) = 1.0f;
}
-void GLRenderTargetCube::getProjectionMatrix(gfx::Matrix4x4f& mat, float nearZ, float farZ)
+void GLRenderTargetCube::getProjectionMatrix(QMatrix4x4& mat, float nearZ, float farZ)
{
- float proj[] = {
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, (nearZ+farZ)/(nearZ-farZ), -1.0f,
- 0.0f, 0.0f, 2.0f*nearZ*farZ/(nearZ-farZ), 0.0f,
- };
-
- memcpy(mat.bits(), proj, sizeof(float) * 16);
+ static const QMatrix4x4 reference(
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, -1.0f, 0.0f);
+
+ mat = reference;
+ mat(2, 2) = (nearZ+farZ)/(nearZ-farZ);
+ mat(2, 3) = 2.0f*nearZ*farZ/(nearZ-farZ);
}
diff --git a/demos/boxes/glbuffers.h b/demos/boxes/glbuffers.h
index 71c4012..2cce006 100644
--- a/demos/boxes/glbuffers.h
+++ b/demos/boxes/glbuffers.h
@@ -48,8 +48,6 @@
#include <QtGui>
#include <QtOpenGL>
-#include "vector.h"
-
#define BUFFER_OFFSET(i) ((char*)0 + (i))
#define SIZE_OF_MEMBER(cls, member) sizeof(static_cast<cls *>(0)->member)
@@ -60,6 +58,10 @@ if (m_failed || !(assertion)) {
returnStatement; \
}
+QT_BEGIN_NAMESPACE
+class QMatrix4x4;
+QT_END_NAMESPACE
+
class GLTexture
{
public:
@@ -135,8 +137,8 @@ public:
void end();
virtual bool failed() {return m_failed || m_fbo.failed();}
- static void getViewMatrix(gfx::Matrix4x4f& mat, int face);
- static void getProjectionMatrix(gfx::Matrix4x4f& mat, float nearZ, float farZ);
+ static void getViewMatrix(QMatrix4x4& mat, int face);
+ static void getProjectionMatrix(QMatrix4x4& mat, float nearZ, float farZ);
private:
GLFrameBufferObject m_fbo;
};
diff --git a/demos/boxes/glextensions.cpp b/demos/boxes/glextensions.cpp
index 20aaebe..6e11284 100644
--- a/demos/boxes/glextensions.cpp
+++ b/demos/boxes/glextensions.cpp
@@ -47,23 +47,6 @@ bool GLExtensionFunctions::resolve(const QGLContext *context)
{
bool ok = true;
- RESOLVE_GL_FUNC(CreateShaderObjectARB)
- RESOLVE_GL_FUNC(ShaderSourceARB)
- RESOLVE_GL_FUNC(CompileShaderARB)
- RESOLVE_GL_FUNC(GetObjectParameterivARB)
- RESOLVE_GL_FUNC(DeleteObjectARB)
- RESOLVE_GL_FUNC(GetInfoLogARB)
- RESOLVE_GL_FUNC(CreateProgramObjectARB)
- RESOLVE_GL_FUNC(AttachObjectARB)
- RESOLVE_GL_FUNC(DetachObjectARB)
- RESOLVE_GL_FUNC(LinkProgramARB)
- RESOLVE_GL_FUNC(UseProgramObjectARB)
- RESOLVE_GL_FUNC(GetUniformLocationARB)
- RESOLVE_GL_FUNC(Uniform1iARB)
- RESOLVE_GL_FUNC(Uniform1fARB)
- RESOLVE_GL_FUNC(Uniform4fARB)
- RESOLVE_GL_FUNC(UniformMatrix4fvARB)
-
RESOLVE_GL_FUNC(GenFramebuffersEXT)
RESOLVE_GL_FUNC(GenRenderbuffersEXT)
RESOLVE_GL_FUNC(BindRenderbufferEXT)
@@ -88,26 +71,6 @@ bool GLExtensionFunctions::resolve(const QGLContext *context)
return ok;
}
-bool GLExtensionFunctions::glslSupported() {
- return CreateShaderObjectARB
- && CreateShaderObjectARB
- && ShaderSourceARB
- && CompileShaderARB
- && GetObjectParameterivARB
- && DeleteObjectARB
- && GetInfoLogARB
- && CreateProgramObjectARB
- && AttachObjectARB
- && DetachObjectARB
- && LinkProgramARB
- && UseProgramObjectARB
- && GetUniformLocationARB
- && Uniform1iARB
- && Uniform1fARB
- && Uniform4fARB
- && UniformMatrix4fvARB;
-}
-
bool GLExtensionFunctions::fboSupported() {
return GenFramebuffersEXT
&& GenRenderbuffersEXT
diff --git a/demos/boxes/glextensions.h b/demos/boxes/glextensions.h
index 7520a57..70d6c33 100644
--- a/demos/boxes/glextensions.h
+++ b/demos/boxes/glextensions.h
@@ -47,23 +47,6 @@
/*
Functions resolved:
-glCreateShaderObjectARB
-glShaderSourceARB
-glCompileShaderARB
-glGetObjectParameterivARB
-glDeleteObjectARB
-glGetInfoLogARB
-glCreateProgramObjectARB
-glAttachObjectARB
-glDetachObjectARB
-glLinkProgramARB
-glUseProgramObjectARB
-glGetUniformLocationARB
-glUniform1iARB
-glUniform1fARB
-glUniform4fARB
-glUniformMatrix4fvARB
-
glGenFramebuffersEXT
glGenRenderbuffersEXT
glBindRenderbufferEXT
@@ -139,39 +122,6 @@ typedef ptrdiff_t GLsizeiptrARB;
#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
#endif
-#ifndef GL_ARB_vertex_shader
-#define GL_VERTEX_SHADER_ARB 0x8B31
-#endif
-
-#ifndef GL_ARB_fragment_shader
-#define GL_FRAGMENT_SHADER_ARB 0x8B30
-#endif
-
-#ifndef GL_ARB_shader_objects
-typedef char GLcharARB;
-typedef unsigned int GLhandleARB;
-#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
-#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
-#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
-#endif
-
-typedef GLhandleARB (APIENTRY *_glCreateShaderObjectARB) (GLenum);
-typedef void (APIENTRY *_glShaderSourceARB) (GLhandleARB, GLuint, const GLcharARB**, GLint *);
-typedef void (APIENTRY *_glCompileShaderARB) (GLhandleARB);
-typedef void (APIENTRY *_glGetObjectParameterivARB) (GLhandleARB, GLenum, int *);
-typedef void (APIENTRY *_glDeleteObjectARB) (GLhandleARB);
-typedef void (APIENTRY *_glGetInfoLogARB) (GLhandleARB, GLsizei, GLsizei *, GLcharARB *);
-typedef GLhandleARB (APIENTRY *_glCreateProgramObjectARB) ();
-typedef void (APIENTRY *_glAttachObjectARB) (GLhandleARB, GLhandleARB);
-typedef void (APIENTRY *_glDetachObjectARB) (GLhandleARB, GLhandleARB);
-typedef void (APIENTRY *_glLinkProgramARB) (GLhandleARB);
-typedef void (APIENTRY *_glUseProgramObjectARB) (GLhandleARB);
-typedef GLint (APIENTRY *_glGetUniformLocationARB) (GLhandleARB, const GLcharARB *);
-typedef void (APIENTRY *_glUniform1iARB) (GLint, GLint);
-typedef void (APIENTRY *_glUniform1fARB) (GLint, GLfloat);
-typedef void (APIENTRY *_glUniform4fARB) (GLint, GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (APIENTRY *_glUniformMatrix4fvARB) (GLint, GLuint, GLboolean, const GLfloat *);
-
typedef void (APIENTRY *_glGenFramebuffersEXT) (GLsizei, GLuint *);
typedef void (APIENTRY *_glGenRenderbuffersEXT) (GLsizei, GLuint *);
typedef void (APIENTRY *_glBindRenderbufferEXT) (GLenum, GLuint);
@@ -197,27 +147,9 @@ struct GLExtensionFunctions
{
bool resolve(const QGLContext *context);
- bool glslSupported();
bool fboSupported();
bool openGL15Supported(); // the rest: multi-texture, 3D-texture, vertex buffer objects
- _glCreateShaderObjectARB CreateShaderObjectARB;
- _glShaderSourceARB ShaderSourceARB;
- _glCompileShaderARB CompileShaderARB;
- _glGetObjectParameterivARB GetObjectParameterivARB;
- _glDeleteObjectARB DeleteObjectARB;
- _glGetInfoLogARB GetInfoLogARB;
- _glCreateProgramObjectARB CreateProgramObjectARB;
- _glAttachObjectARB AttachObjectARB;
- _glDetachObjectARB DetachObjectARB;
- _glLinkProgramARB LinkProgramARB;
- _glUseProgramObjectARB UseProgramObjectARB;
- _glGetUniformLocationARB GetUniformLocationARB;
- _glUniform1iARB Uniform1iARB;
- _glUniform1fARB Uniform1fARB;
- _glUniform4fARB Uniform4fARB;
- _glUniformMatrix4fvARB UniformMatrix4fvARB;
-
_glGenFramebuffersEXT GenFramebuffersEXT;
_glGenRenderbuffersEXT GenRenderbuffersEXT;
_glBindRenderbufferEXT BindRenderbufferEXT;
@@ -246,23 +178,6 @@ inline GLExtensionFunctions &getGLExtensionFunctions()
return funcs;
}
-#define glCreateShaderObjectARB getGLExtensionFunctions().CreateShaderObjectARB
-#define glShaderSourceARB getGLExtensionFunctions().ShaderSourceARB
-#define glCompileShaderARB getGLExtensionFunctions().CompileShaderARB
-#define glGetObjectParameterivARB getGLExtensionFunctions().GetObjectParameterivARB
-#define glDeleteObjectARB getGLExtensionFunctions().DeleteObjectARB
-#define glGetInfoLogARB getGLExtensionFunctions().GetInfoLogARB
-#define glCreateProgramObjectARB getGLExtensionFunctions().CreateProgramObjectARB
-#define glAttachObjectARB getGLExtensionFunctions().AttachObjectARB
-#define glDetachObjectARB getGLExtensionFunctions().DetachObjectARB
-#define glLinkProgramARB getGLExtensionFunctions().LinkProgramARB
-#define glUseProgramObjectARB getGLExtensionFunctions().UseProgramObjectARB
-#define glGetUniformLocationARB getGLExtensionFunctions().GetUniformLocationARB
-#define glUniform1iARB getGLExtensionFunctions().Uniform1iARB
-#define glUniform1fARB getGLExtensionFunctions().Uniform1fARB
-#define glUniform4fARB getGLExtensionFunctions().Uniform4fARB
-#define glUniformMatrix4fvARB getGLExtensionFunctions().UniformMatrix4fvARB
-
#define glGenFramebuffersEXT getGLExtensionFunctions().GenFramebuffersEXT
#define glGenRenderbuffersEXT getGLExtensionFunctions().GenRenderbuffersEXT
#define glBindRenderbufferEXT getGLExtensionFunctions().BindRenderbufferEXT
diff --git a/demos/boxes/glshaders.cpp b/demos/boxes/glshaders.cpp
deleted file mode 100644
index 7622858..0000000
--- a/demos/boxes/glshaders.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the demonstration applications of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "glshaders.h"
-
-#define GLSHADERS_ASSERT_OPENGL(prefix, assertion, returnStatement) \
-if (m_failed || !(assertion)) { \
- if (!m_failed) qCritical(prefix ": The necessary OpenGL functions are not available."); \
- m_failed = true; \
- returnStatement; \
-}
-
-
-GLShader::GLShader(const char *data, int size, GLenum shaderType)
-: m_compileError(false), m_failed(false)
-{
- GLSHADERS_ASSERT_OPENGL("GLShader::GLShader",
- glCreateShaderObjectARB && glShaderSourceARB && glCompileShaderARB && glGetObjectParameterivARB, return)
-
- m_shader = glCreateShaderObjectARB(shaderType);
-
- GLint glSize = size;
- glShaderSourceARB(m_shader, 1, reinterpret_cast<const GLcharARB**>(&data), &glSize);
- glCompileShaderARB(m_shader);
- int status;
- glGetObjectParameterivARB(m_shader, GL_OBJECT_COMPILE_STATUS_ARB, &status);
- m_compileError = (status != 1);
-}
-
-GLShader::GLShader(const QString& fileName, GLenum shaderType)
- : m_compileError(false), m_failed(false)
-{
- GLSHADERS_ASSERT_OPENGL("GLShader::GLShader",
- glCreateShaderObjectARB && glShaderSourceARB && glCompileShaderARB && glGetObjectParameterivARB, return)
-
- m_shader = glCreateShaderObjectARB(shaderType);
-
- QFile file(fileName);
- if (file.open(QIODevice::ReadOnly)) {
- QByteArray bytes = file.readAll();
- GLint size = file.size();
- const char *p = bytes.data();
- file.close();
- glShaderSourceARB(m_shader, 1, reinterpret_cast<const GLcharARB**>(&p), &size);
- glCompileShaderARB(m_shader);
- int status;
- glGetObjectParameterivARB(m_shader, GL_OBJECT_COMPILE_STATUS_ARB, &status);
- m_compileError = (status != 1);
- } else {
- m_compileError = true;
- }
-}
-
-GLShader::~GLShader()
-{
- GLSHADERS_ASSERT_OPENGL("GLShader::~GLShader", glDeleteObjectARB, return)
-
- glDeleteObjectARB(m_shader);
-}
-
-QString GLShader::log()
-{
- GLSHADERS_ASSERT_OPENGL("GLShader::log", glGetObjectParameterivARB
- && glGetInfoLogARB, return QLatin1String("GLSL not supported."))
-
- int length;
- glGetObjectParameterivARB(m_shader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
- char *log = new char[length + 1];
- GLsizei glLength = length;
- glGetInfoLogARB(m_shader, glLength, &glLength, reinterpret_cast<GLcharARB*>(log));
- log[glLength] = '\0';
- QString result(log);
- delete log;
- return result;
-}
-
-GLVertexShader::GLVertexShader(const char *data, int size) : GLShader(data, size, GL_VERTEX_SHADER_ARB)
-{
-}
-
-GLVertexShader::GLVertexShader(const QString& fileName) : GLShader(fileName, GL_VERTEX_SHADER_ARB)
-{
-}
-
-GLFragmentShader::GLFragmentShader(const char *data, int size) : GLShader(data, size, GL_FRAGMENT_SHADER_ARB)
-{
-}
-
-GLFragmentShader::GLFragmentShader(const QString& fileName) : GLShader(fileName, GL_FRAGMENT_SHADER_ARB)
-{
-}
-
-GLProgram::GLProgram() : m_linked(false), m_linkError(false), m_failed(false)
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::GLProgram", glCreateProgramObjectARB, return)
-
- m_program = glCreateProgramObjectARB();
-}
-
-GLProgram::~GLProgram()
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::~GLProgram", glDeleteObjectARB, return)
-
- glDeleteObjectARB(m_program);
-}
-
-void GLProgram::attach(const GLShader &shader)
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::attach", glAttachObjectARB, return)
-
- glAttachObjectARB(m_program, shader.m_shader);
- m_linked = m_linkError = false;
-}
-
-void GLProgram::detach(const GLShader &shader)
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::detach", glDetachObjectARB, return)
-
- glDetachObjectARB(m_program, shader.m_shader);
- m_linked = m_linkError = false;
-}
-
-bool GLProgram::failed()
-{
- if (m_failed || m_linkError)
- return true;
-
- if (m_linked)
- return false;
-
- GLSHADERS_ASSERT_OPENGL("GLProgram::failed", glLinkProgramARB && glGetObjectParameterivARB, return true)
-
- glLinkProgramARB(m_program);
- int status;
- glGetObjectParameterivARB(m_program, GL_OBJECT_LINK_STATUS_ARB, &status);
- m_linkError = !(m_linked = (status == 1));
- return m_linkError;
-}
-
-QString GLProgram::log()
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::log", glGetObjectParameterivARB && glGetInfoLogARB,
- return QLatin1String("Failed."))
-
- int length;
- glGetObjectParameterivARB(m_program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
- char *log = new char[length + 1];
- GLsizei glLength = length;
- glGetInfoLogARB(m_program, glLength, &glLength, reinterpret_cast<GLcharARB*>(log));
- log[glLength] = '\0';
- QString result(log);
- delete log;
- return result;
-}
-
-void GLProgram::bind()
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::bind", glUseProgramObjectARB, return)
-
- if (!failed())
- glUseProgramObjectARB(m_program);
-}
-
-void GLProgram::unbind()
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::bind", glUseProgramObjectARB, return)
-
- glUseProgramObjectARB(0);
-}
-
-bool GLProgram::hasParameter(const QString& name)
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::hasParameter", glGetUniformLocationARB, return false)
-
- if (!failed()) {
- QByteArray asciiName = name.toAscii();
- return -1 != glGetUniformLocationARB(m_program, reinterpret_cast<const GLcharARB*>(asciiName.data()));
- }
- return false;
-}
-
-void GLProgram::setInt(const QString& name, int value)
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::setInt", glGetUniformLocationARB && glUniform1iARB, return)
-
- if (!failed()) {
- QByteArray asciiName = name.toAscii();
- int loc = glGetUniformLocationARB(m_program, reinterpret_cast<const GLcharARB*>(asciiName.data()));
- glUniform1iARB(loc, value);
- }
-}
-
-void GLProgram::setFloat(const QString& name, float value)
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::setFloat", glGetUniformLocationARB && glUniform1fARB, return)
-
- if (!failed()) {
- QByteArray asciiName = name.toAscii();
- int loc = glGetUniformLocationARB(m_program, reinterpret_cast<const GLcharARB*>(asciiName.data()));
- glUniform1fARB(loc, value);
- }
-}
-
-void GLProgram::setColor(const QString& name, QRgb value)
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::setColor", glGetUniformLocationARB && glUniform4fARB, return)
-
- //qDebug() << "Setting color" << name;
- if (!failed()) {
- QByteArray asciiName = name.toAscii();
- int loc = glGetUniformLocationARB(m_program, reinterpret_cast<const GLcharARB*>(asciiName.data()));
- //qDebug() << "Location of" << name << "is" << loc;
- QColor color(value);
- glUniform4fARB(loc, color.redF(), color.greenF(), color.blueF(), color.alphaF());
- }
-}
-
-void GLProgram::setMatrix(const QString& name, const gfx::Matrix4x4f &mat)
-{
- GLSHADERS_ASSERT_OPENGL("GLProgram::setMatrix", glGetUniformLocationARB && glUniformMatrix4fvARB, return)
-
- if (!failed()) {
- QByteArray asciiName = name.toAscii();
- int loc = glGetUniformLocationARB(m_program, reinterpret_cast<const GLcharARB*>(asciiName.data()));
- //qDebug() << "Location of" << name << "is" << loc;
- glUniformMatrix4fvARB(loc, 1, GL_FALSE, mat.bits());
- }
-}
diff --git a/demos/boxes/glshaders.h b/demos/boxes/glshaders.h
deleted file mode 100644
index 7380c4d..0000000
--- a/demos/boxes/glshaders.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the demonstration applications of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef GLSHADERS_H
-#define GLSHADERS_H
-
-//#include <GL/glew.h>
-#include "glextensions.h"
-
-#include <QtGui>
-#include <QtOpenGL>
-
-#include "vector.h"
-
-class GLShader
-{
-public:
- friend class GLProgram;
- virtual ~GLShader();
- bool failed() const {return m_failed;}
- QString log();
-protected:
- GLShader(const char *data, int size, GLenum shaderType);
- GLShader(const QString& fileName, GLenum shaderType);
-
- GLhandleARB m_shader;
- bool m_compileError;
- bool m_failed;
-};
-
-class GLVertexShader : public GLShader
-{
-public:
- GLVertexShader(const char *data, int size);
- GLVertexShader(const QString& fileName);
-};
-
-class GLFragmentShader : public GLShader
-{
-public:
- GLFragmentShader(const char *data, int size);
- GLFragmentShader(const QString& fileName);
-};
-
-class GLProgram
-{
-public:
- GLProgram();
- ~GLProgram();
- void attach(const GLShader &shader);
- void detach(const GLShader &shader);
- void bind();
- void unbind();
- bool failed();
- QString log();
- bool hasParameter(const QString& name);
- // use program before setting values
- void setInt(const QString& name, int value);
- void setFloat(const QString& name, float value);
- void setColor(const QString& name, QRgb value);
- void setMatrix(const QString& name, const gfx::Matrix4x4f &mat);
- // TODO: add a bunch of set-functions for different types.
-private:
- GLhandleARB m_program;
- bool m_linked;
- bool m_linkError;
- bool m_failed;
-};
-
-#endif
diff --git a/demos/boxes/qtbox.cpp b/demos/boxes/qtbox.cpp
index 2255a38..7134d63 100644
--- a/demos/boxes/qtbox.cpp
+++ b/demos/boxes/qtbox.cpp
@@ -122,7 +122,7 @@ void ItemBase::duplicateSelectedItems(QGraphicsScene *scene)
selected = scene->selectedItems();
foreach (QGraphicsItem *item, selected) {
- ItemBase *itemBase = dynamic_cast<ItemBase *>(item);
+ ItemBase *itemBase = qgraphicsitem_cast<ItemBase *>(item);
if (itemBase)
scene->addItem(itemBase->createNew(itemBase->m_size, itemBase->pos().x() + itemBase->m_size, itemBase->pos().y()));
}
@@ -137,7 +137,7 @@ void ItemBase::deleteSelectedItems(QGraphicsScene *scene)
selected = scene->selectedItems();
foreach (QGraphicsItem *item, selected) {
- ItemBase *itemBase = dynamic_cast<ItemBase *>(item);
+ ItemBase *itemBase = qgraphicsitem_cast<ItemBase *>(item);
if (itemBase)
delete itemBase;
}
@@ -152,7 +152,7 @@ void ItemBase::growSelectedItems(QGraphicsScene *scene)
selected = scene->selectedItems();
foreach (QGraphicsItem *item, selected) {
- ItemBase *itemBase = dynamic_cast<ItemBase *>(item);
+ ItemBase *itemBase = qgraphicsitem_cast<ItemBase *>(item);
if (itemBase) {
itemBase->prepareGeometryChange();
itemBase->m_size *= 2;
@@ -171,7 +171,7 @@ void ItemBase::shrinkSelectedItems(QGraphicsScene *scene)
selected = scene->selectedItems();
foreach (QGraphicsItem *item, selected) {
- ItemBase *itemBase = dynamic_cast<ItemBase *>(item);
+ ItemBase *itemBase = qgraphicsitem_cast<ItemBase *>(item);
if (itemBase) {
itemBase->prepareGeometryChange();
itemBase->m_size /= 2;
@@ -257,6 +257,12 @@ void ItemBase::wheelEvent(QGraphicsSceneWheelEvent *event)
m_size = MIN_ITEM_SIZE;
}
+int ItemBase::type() const
+{
+ return Type;
+}
+
+
bool ItemBase::isInResizeArea(const QPointF &pos)
{
return (-pos.y() < pos.x() - m_size + 9);
@@ -269,19 +275,20 @@ bool ItemBase::isInResizeArea(const QPointF &pos)
QtBox::QtBox(int size, int x, int y) : ItemBase(size, x, y), m_texture(0)
{
for (int i = 0; i < 8; ++i) {
- m_vertices[i][0] = (i & 1 ? 0.5f : -0.5f);
- m_vertices[i][1] = (i & 2 ? 0.5f : -0.5f);
- m_vertices[i][2] = (i & 4 ? 0.5f : -0.5f);
+ m_vertices[i].setX(i & 1 ? 0.5f : -0.5f);
+ m_vertices[i].setY(i & 2 ? 0.5f : -0.5f);
+ m_vertices[i].setZ(i & 4 ? 0.5f : -0.5f);
}
for (int i = 0; i < 4; ++i) {
- m_texCoords[i][0] = (i & 1 ? 1.0f : 0.0f);
- m_texCoords[i][1] = (i & 2 ? 1.0f : 0.0f);
- }
- memset(m_normals, 0, sizeof(m_normals));
- for (int i = 0; i < 3; ++i) {
- m_normals[2 * i + 0][i] = -1.0f;
- m_normals[2 * i + 1][i] = 1.0f;
+ m_texCoords[i].setX(i & 1 ? 1.0f : 0.0f);
+ m_texCoords[i].setY(i & 2 ? 1.0f : 0.0f);
}
+ m_normals[0] = QVector3D(-1.0f, 0.0f, 0.0f);
+ m_normals[1] = QVector3D(1.0f, 0.0f, 0.0f);
+ m_normals[2] = QVector3D(0.0f, -1.0f, 0.0f);
+ m_normals[3] = QVector3D(0.0f, 1.0f, 0.0f);
+ m_normals[4] = QVector3D(0.0f, 0.0f, -1.0f);
+ m_normals[5] = QVector3D(0.0f, 0.0f, 1.0f);
}
QtBox::~QtBox()
@@ -312,6 +319,8 @@ void QtBox::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWi
0.5f * (right + left), 0.5f * (bottom + top), 0.0f, 1.0f
};
+ painter->beginNativePainting();
+
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadMatrixf(moveToRectMatrix);
@@ -351,21 +360,21 @@ void QtBox::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWi
glColor4f(1.0f, 1.0f, 1.0f, 1.0);
glBegin(GL_TRIANGLE_STRIP);
- glNormal3fv(m_normals[2 * dir + 0].bits());
+ glNormal3fv(reinterpret_cast<float *>(&m_normals[2 * dir + 0]));
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
- glTexCoord2fv(m_texCoords[(j << 1) | i].bits());
- glVertex3fv(m_vertices[(i << ((dir + 2) % 3)) | (j << ((dir + 1) % 3))].bits());
+ glTexCoord2fv(reinterpret_cast<float *>(&m_texCoords[(j << 1) | i]));
+ glVertex3fv(reinterpret_cast<float *>(&m_vertices[(i << ((dir + 2) % 3)) | (j << ((dir + 1) % 3))]));
}
}
glEnd();
glBegin(GL_TRIANGLE_STRIP);
- glNormal3fv(m_normals[2 * dir + 1].bits());
+ glNormal3fv(reinterpret_cast<float *>(&m_normals[2 * dir + 1]));
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
- glTexCoord2fv(m_texCoords[(j << 1) | i].bits());
- glVertex3fv(m_vertices[(1 << dir) | (i << ((dir + 1) % 3)) | (j << ((dir + 2) % 3))].bits());
+ glTexCoord2fv(reinterpret_cast<float *>(&m_texCoords[(j << 1) | i]));
+ glVertex3fv(reinterpret_cast<float *>(&m_vertices[(1 << dir) | (i << ((dir + 1) % 3)) | (j << ((dir + 2) % 3))]));
}
}
glEnd();
@@ -385,6 +394,8 @@ void QtBox::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWi
glMatrixMode(GL_PROJECTION);
glPopMatrix();
+ painter->endNativePainting();
+
ItemBase::paint(painter, option, widget);
}
diff --git a/demos/boxes/qtbox.h b/demos/boxes/qtbox.h
index 260e134..9465911 100644
--- a/demos/boxes/qtbox.h
+++ b/demos/boxes/qtbox.h
@@ -44,13 +44,14 @@
#include <QtGui>
-#include "vector.h"
+#include <QtGui/qvector3d.h>
#include "glbuffers.h"
-class ItemBase : public QObject, public QGraphicsItem
+class ItemBase : public QGraphicsItem
{
- Q_OBJECT
public:
+ enum { Type = UserType + 1 };
+
ItemBase(int size, int x, int y);
virtual ~ItemBase();
virtual QRectF boundingRect() const;
@@ -64,6 +65,7 @@ protected:
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
virtual void keyPressEvent(QKeyEvent *event);
virtual void wheelEvent(QGraphicsSceneWheelEvent *event);
+ virtual int type() const;
bool isInResizeArea(const QPointF &pos);
static void duplicateSelectedItems(QGraphicsScene *scene);
@@ -85,9 +87,9 @@ public:
protected:
virtual ItemBase *createNew(int size, int x, int y);
private:
- gfx::Vector3f m_vertices[8];
- gfx::Vector2f m_texCoords[4];
- gfx::Vector3f m_normals[6];
+ QVector3D m_vertices[8];
+ QVector3D m_texCoords[4];
+ QVector3D m_normals[6];
GLTexture *m_texture;
};
diff --git a/demos/boxes/roundedbox.cpp b/demos/boxes/roundedbox.cpp
index 16e9616..e01f6b8 100644
--- a/demos/boxes/roundedbox.cpp
+++ b/demos/boxes/roundedbox.cpp
@@ -46,9 +46,10 @@
//============================================================================//
VertexDescription P3T2N3Vertex::description[] = {
- {VertexDescription::Position, GL_FLOAT, SIZE_OF_MEMBER(P3T2N3Vertex, position) / sizeof(float), offsetof(P3T2N3Vertex, position), 0},
- {VertexDescription::TexCoord, GL_FLOAT, SIZE_OF_MEMBER(P3T2N3Vertex, texCoord) / sizeof(float), offsetof(P3T2N3Vertex, texCoord), 0},
- {VertexDescription::Normal, GL_FLOAT, SIZE_OF_MEMBER(P3T2N3Vertex, normal) / sizeof(float), offsetof(P3T2N3Vertex, normal), 0},
+ {VertexDescription::Position, GL_FLOAT, SIZE_OF_MEMBER(P3T2N3Vertex, position) / sizeof(float), 0, 0},
+ {VertexDescription::TexCoord, GL_FLOAT, SIZE_OF_MEMBER(P3T2N3Vertex, texCoord) / sizeof(float), sizeof(QVector3D), 0},
+ {VertexDescription::Normal, GL_FLOAT, SIZE_OF_MEMBER(P3T2N3Vertex, normal) / sizeof(float), sizeof(QVector3D) + sizeof(QVector2D), 0},
+
{VertexDescription::Null, 0, 0, 0, 0},
};
@@ -78,10 +79,9 @@ GLRoundedBox::GLRoundedBox(float r, float scale, int n)
}
for (int corner = 0; corner < 8; ++corner) {
- gfx::Vector3f centre;
- centre[0] = (corner & 1 ? 1.0f : -1.0f);
- centre[1] = (corner & 2 ? 1.0f : -1.0f);
- centre[2] = (corner & 4 ? 1.0f : -1.0f);
+ QVector3D centre(corner & 1 ? 1.0f : -1.0f,
+ corner & 2 ? 1.0f : -1.0f,
+ corner & 4 ? 1.0f : -1.0f);
int winding = (corner & 1) ^ ((corner >> 1) & 1) ^ (corner >> 2);
int offsX = ((corner ^ 1) - corner) * vertexCountPerCorner;
int offsY = ((corner ^ 2) - corner) * vertexCountPerCorner;
@@ -129,12 +129,13 @@ GLRoundedBox::GLRoundedBox(float r, float scale, int n)
}
for (int j = 0; j <= i; ++j) {
- gfx::Vector3f normal = gfx::Vector3f::vector(i - j, j, n + 1 - i).normalized();
- gfx::Vector3f pos = centre * (0.5f - r + r * normal);
+ QVector3D normal = QVector3D(i - j, j, n + 1 - i).normalized();
+ QVector3D offset(0.5f - r, 0.5f - r, 0.5f - r);
+ QVector3D pos = centre * (offset + r * normal);
vp[vidx].position = scale * pos;
vp[vidx].normal = centre * normal;
- vp[vidx].texCoord = gfx::Vector2f::vector(pos[0], pos[1]) + 0.5f;
+ vp[vidx].texCoord = QVector2D(pos.x() + 0.5f, pos.y() + 0.5f);
// Corner polygons
if (i < n + 1) {
diff --git a/demos/boxes/roundedbox.h b/demos/boxes/roundedbox.h
index 4f10bde..11069a1 100644
--- a/demos/boxes/roundedbox.h
+++ b/demos/boxes/roundedbox.h
@@ -49,14 +49,15 @@
#include <QtOpenGL>
#include "gltrianglemesh.h"
-#include "vector.h"
+#include <QtGui/qvector3d.h>
+#include <QtGui/qvector2d.h>
#include "glbuffers.h"
struct P3T2N3Vertex
{
- gfx::Vector3f position;
- gfx::Vector2f texCoord;
- gfx::Vector3f normal;
+ QVector3D position;
+ QVector2D texCoord;
+ QVector3D normal;
static VertexDescription description[];
};
diff --git a/demos/boxes/scene.cpp b/demos/boxes/scene.cpp
index 29aece9..2a7ca0e 100644
--- a/demos/boxes/scene.cpp
+++ b/demos/boxes/scene.cpp
@@ -39,7 +39,10 @@
**
****************************************************************************/
+#include <QDebug>
#include "scene.h"
+#include <QtGui/qmatrix4x4.h>
+#include <QtGui/qvector3d.h>
#include "3rdparty/fbm.h"
@@ -484,9 +487,9 @@ Scene::Scene(int width, int height, int maxTextureSize)
{
setSceneRect(0, 0, width, height);
- m_trackBalls[0] = TrackBall(0.0005f, gfx::Vector3f::vector(0, 1, 0), TrackBall::Sphere);
- m_trackBalls[1] = TrackBall(0.0001f, gfx::Vector3f::vector(0, 0, 1), TrackBall::Sphere);
- m_trackBalls[2] = TrackBall(0.0f, gfx::Vector3f::vector(0, 1, 0), TrackBall::Plane);
+ m_trackBalls[0] = TrackBall(0.05f, QVector3D(0, 1, 0), TrackBall::Sphere);
+ m_trackBalls[1] = TrackBall(0.005f, QVector3D(0, 0, 1), TrackBall::Sphere);
+ m_trackBalls[2] = TrackBall(0.0f, QVector3D(0, 1, 0), TrackBall::Plane);
m_renderOptions = new RenderOptionsDialog;
m_renderOptions->move(20, 120);
@@ -531,11 +534,11 @@ Scene::~Scene()
if (texture) delete texture;
if (m_mainCubemap)
delete m_mainCubemap;
- foreach (GLProgram *program, m_programs)
+ foreach (QGLShaderProgram *program, m_programs)
if (program) delete program;
if (m_vertexShader)
delete m_vertexShader;
- foreach (GLFragmentShader *shader, m_fragmentShaders)
+ foreach (QGLShader *shader, m_fragmentShaders)
if (shader) delete shader;
foreach (GLRenderTargetCube *rt, m_cubemaps)
if (rt) delete rt;
@@ -549,16 +552,18 @@ void Scene::initGL()
{
m_box = new GLRoundedBox(0.25f, 1.0f, 10);
- m_vertexShader = new GLVertexShader(":/res/boxes/basic.vsh");
+ m_vertexShader = new QGLShader(":/res/boxes/basic.vsh", QGLShader::VertexShader);
QStringList list;
list << ":/res/boxes/cubemap_posx.jpg" << ":/res/boxes/cubemap_negx.jpg" << ":/res/boxes/cubemap_posy.jpg"
<< ":/res/boxes/cubemap_negy.jpg" << ":/res/boxes/cubemap_posz.jpg" << ":/res/boxes/cubemap_negz.jpg";
m_environment = new GLTextureCube(list, qMin(1024, m_maxTextureSize));
- m_environmentShader = new GLFragmentShader(environmentShaderText, strlen(environmentShaderText));
- m_environmentProgram = new GLProgram;
- m_environmentProgram->attach(*m_vertexShader);
- m_environmentProgram->attach(*m_environmentShader);
+ m_environmentShader = new QGLShader(QGLShader::FragmentShader);
+ m_environmentShader->compile(environmentShaderText);
+ m_environmentProgram = new QGLShaderProgram;
+ m_environmentProgram->addShader(m_vertexShader);
+ m_environmentProgram->addShader(m_environmentShader);
+ m_environmentProgram->link();
const int NOISE_SIZE = 128; // for a different size, B and BM in fbm.c must also be changed
m_noise = new GLTexture3D(NOISE_SIZE, NOISE_SIZE, NOISE_SIZE);
@@ -610,12 +615,12 @@ void Scene::initGL()
filter = QStringList("*.fsh");
files = QDir(":/res/boxes/").entryInfoList(filter, QDir::Files | QDir::Readable);
foreach (QFileInfo file, files) {
- GLProgram *program = new GLProgram;
- GLFragmentShader* shader = new GLFragmentShader(file.absoluteFilePath());
+ QGLShaderProgram *program = new QGLShaderProgram;
+ QGLShader* shader = new QGLShader(file.absoluteFilePath(), QGLShader::FragmentShader);
// The program does not take ownership over the shaders, so store them in a vector so they can be deleted afterwards.
- program->attach(*m_vertexShader);
- program->attach(*shader);
- if (program->failed()) {
+ program->addShader(m_vertexShader);
+ program->addShader(shader);
+ if (!program->link()) {
qWarning("Failed to compile and link shader program");
qWarning("Vertex shader log:");
qWarning() << m_vertexShader->log();
@@ -633,22 +638,22 @@ void Scene::initGL()
m_programs << program;
m_renderOptions->addShader(file.baseName());
- program->bind();
- m_cubemaps << (program->hasParameter("env") ? new GLRenderTargetCube(qMin(256, m_maxTextureSize)) : 0);
- program->unbind();
+ program->enable();
+ m_cubemaps << ((program->uniformLocation("env") != -1) ? new GLRenderTargetCube(qMin(256, m_maxTextureSize)) : 0);
+ program->disable();
}
if (m_programs.size() == 0)
- m_programs << new GLProgram;
+ m_programs << new QGLShaderProgram;
m_renderOptions->emitParameterChanged();
}
// If one of the boxes should not be rendered, set excludeBox to its index.
// If the main box should not be rendered, set excludeBox to -1.
-void Scene::renderBoxes(const gfx::Matrix4x4f &view, int excludeBox)
+void Scene::renderBoxes(const QMatrix4x4 &view, int excludeBox)
{
- gfx::Matrix4x4f invView = view.inverse();
+ QMatrix4x4 invView = view.inverted();
// If multi-texturing is supported, use three saplers.
if (glActiveTexture) {
@@ -664,26 +669,26 @@ void Scene::renderBoxes(const gfx::Matrix4x4f &view, int excludeBox)
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
- gfx::Matrix4x4f viewRotation(view);
+ QMatrix4x4 viewRotation(view);
viewRotation(3, 0) = viewRotation(3, 1) = viewRotation(3, 2) = 0.0f;
viewRotation(0, 3) = viewRotation(1, 3) = viewRotation(2, 3) = 0.0f;
viewRotation(3, 3) = 1.0f;
- glLoadMatrixf(viewRotation.bits());
+ glLoadMatrixf(viewRotation.data());
glScalef(20.0f, 20.0f, 20.0f);
// Don't render the environment if the environment texture can't be set for the correct sampler.
if (glActiveTexture) {
m_environment->bind();
- m_environmentProgram->bind();
- m_environmentProgram->setInt("tex", 0);
- m_environmentProgram->setInt("env", 1);
- m_environmentProgram->setInt("noise", 2);
+ m_environmentProgram->enable();
+ m_environmentProgram->setUniformValue("tex", GLint(0));
+ m_environmentProgram->setUniformValue("env", GLint(1));
+ m_environmentProgram->setUniformValue("noise", GLint(2));
m_box->draw();
- m_environmentProgram->unbind();
+ m_environmentProgram->disable();
m_environment->unbind();
}
- glLoadMatrixf(view.bits());
+ glLoadMatrixf(view.data());
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
@@ -693,9 +698,11 @@ void Scene::renderBoxes(const gfx::Matrix4x4f &view, int excludeBox)
continue;
glPushMatrix();
- gfx::Matrix4x4f m;
- m_trackBalls[1].rotation().matrix(m);
- glMultMatrixf(m.bits());
+ QMatrix4x4 m;
+ m.rotate(m_trackBalls[1].rotation());
+ m = m.transposed();
+
+ glMultMatrixf(m.data());
glRotatef(360.0f * i / m_programs.size(), 0.0f, 0.0f, 1.0f);
glTranslatef(2.0f, 0.0f, 0.0f);
@@ -707,14 +714,14 @@ void Scene::renderBoxes(const gfx::Matrix4x4f &view, int excludeBox)
else
m_environment->bind();
}
- m_programs[i]->bind();
- m_programs[i]->setInt("tex", 0);
- m_programs[i]->setInt("env", 1);
- m_programs[i]->setInt("noise", 2);
- m_programs[i]->setMatrix("view", view);
- m_programs[i]->setMatrix("invView", invView);
+ m_programs[i]->enable();
+ m_programs[i]->setUniformValue("tex", GLint(0));
+ m_programs[i]->setUniformValue("env", GLint(1));
+ m_programs[i]->setUniformValue("noise", GLint(2));
+ m_programs[i]->setUniformValue("view", view);
+ m_programs[i]->setUniformValue("invView", invView);
m_box->draw();
- m_programs[i]->unbind();
+ m_programs[i]->disable();
if (glActiveTexture) {
if (m_dynamicCubemap && m_cubemaps[i])
@@ -726,9 +733,10 @@ void Scene::renderBoxes(const gfx::Matrix4x4f &view, int excludeBox)
}
if (-1 != excludeBox) {
- gfx::Matrix4x4f m;
- m_trackBalls[0].rotation().matrix(m);
- glMultMatrixf(m.bits());
+ QMatrix4x4 m;
+ m.rotate(m_trackBalls[0].rotation());
+ m = m.transposed();
+ glMultMatrixf(m.data());
if (glActiveTexture) {
if (m_dynamicCubemap)
@@ -737,14 +745,14 @@ void Scene::renderBoxes(const gfx::Matrix4x4f &view, int excludeBox)
m_environment->bind();
}
- m_programs[m_currentShader]->bind();
- m_programs[m_currentShader]->setInt("tex", 0);
- m_programs[m_currentShader]->setInt("env", 1);
- m_programs[m_currentShader]->setInt("noise", 2);
- m_programs[m_currentShader]->setMatrix("view", view);
- m_programs[m_currentShader]->setMatrix("invView", invView);
+ m_programs[m_currentShader]->enable();
+ m_programs[m_currentShader]->setUniformValue("tex", GLint(0));
+ m_programs[m_currentShader]->setUniformValue("env", GLint(1));
+ m_programs[m_currentShader]->setUniformValue("noise", GLint(2));
+ m_programs[m_currentShader]->setUniformValue("view", view);
+ m_programs[m_currentShader]->setUniformValue("invView", invView);
m_box->draw();
- m_programs[m_currentShader]->unbind();
+ m_programs[m_currentShader]->disable();
if (glActiveTexture) {
if (m_dynamicCubemap)
@@ -829,31 +837,32 @@ void Scene::renderCubemaps()
// To speed things up, only update the cubemaps for the small cubes every N frames.
const int N = (m_updateAllCubemaps ? 1 : 3);
- gfx::Matrix4x4f mat;
+ QMatrix4x4 mat;
GLRenderTargetCube::getProjectionMatrix(mat, 0.1f, 100.0f);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
- glLoadMatrixf(mat.bits());
+ glLoadMatrixf(mat.data());
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
- gfx::Vector3f center;
+ QVector3D center;
for (int i = m_frame % N; i < m_cubemaps.size(); i += N) {
if (0 == m_cubemaps[i])
continue;
float angle = 2.0f * PI * i / m_cubemaps.size();
- center = m_trackBalls[1].rotation().transform(gfx::Vector3f::vector(cos(angle), sin(angle), 0));
+
+ center = m_trackBalls[1].rotation().rotateVector(QVector3D(cos(angle), sin(angle), 0.0f));
for (int face = 0; face < 6; ++face) {
m_cubemaps[i]->begin(face);
GLRenderTargetCube::getViewMatrix(mat, face);
- gfx::Vector4f v = gfx::Vector4f::vector(-center[0], -center[1], -center[2], 1.0);
- mat[3] = v * mat;
+ QVector4D v = QVector4D(-center.x(), -center.y(), -center.z(), 1.0);
+ mat.setColumn(3, v * mat);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
renderBoxes(mat, i);
@@ -885,6 +894,7 @@ void Scene::drawBackground(QPainter *painter, const QRectF &)
float width = float(painter->device()->width());
float height = float(painter->device()->height());
+ painter->beginNativePainting();
setStates();
if (m_dynamicCubemap)
@@ -897,16 +907,15 @@ void Scene::drawBackground(QPainter *painter, const QRectF &)
glMatrixMode(GL_MODELVIEW);
- //gfx::Matrix4x4f view = gfx::Matrix4x4f::identity();
- //view(3, 2) -= 2.0f * exp(m_distExp / 1200.0f);
-
- gfx::Matrix4x4f view;
- m_trackBalls[2].rotation().matrix(view);
- view(3, 2) -= 2.0f * exp(m_distExp / 1200.0f);
+ QMatrix4x4 view;
+ view.rotate(m_trackBalls[2].rotation());
+ view(2, 3) -= 2.0f * exp(m_distExp / 1200.0f);
renderBoxes(view);
defaultStates();
++m_frame;
+
+ painter->endNativePainting();
}
QPointF Scene::pixelPosToViewPos(const QPointF& p)
@@ -936,10 +945,10 @@ void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
}
if (event->buttons() & Qt::MidButton) {
- m_trackBalls[2].move(pixelPosToViewPos(event->scenePos()), gfx::Quaternionf::identity());
+ m_trackBalls[2].move(pixelPosToViewPos(event->scenePos()), QQuaternion());
event->accept();
} else {
- m_trackBalls[2].release(pixelPosToViewPos(event->scenePos()), gfx::Quaternionf::identity());
+ m_trackBalls[2].release(pixelPosToViewPos(event->scenePos()), QQuaternion());
}
}
@@ -960,7 +969,7 @@ void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event)
}
if (event->buttons() & Qt::MidButton) {
- m_trackBalls[2].push(pixelPosToViewPos(event->scenePos()), gfx::Quaternionf::identity());
+ m_trackBalls[2].push(pixelPosToViewPos(event->scenePos()), QQuaternion());
event->accept();
}
}
@@ -982,7 +991,7 @@ void Scene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
}
if (event->button() == Qt::MidButton) {
- m_trackBalls[2].release(pixelPosToViewPos(event->scenePos()), gfx::Quaternionf::identity());
+ m_trackBalls[2].release(pixelPosToViewPos(event->scenePos()), QQuaternion());
event->accept();
}
}
@@ -1021,20 +1030,20 @@ void Scene::toggleDynamicCubemap(int state)
void Scene::setColorParameter(const QString &name, QRgb color)
{
// set the color in all programs
- foreach (GLProgram *program, m_programs) {
- program->bind();
- program->setColor(name, color);
- program->unbind();
+ foreach (QGLShaderProgram *program, m_programs) {
+ program->enable();
+ program->setUniformValue(program->uniformLocation(name), QColor(color));
+ program->disable();
}
}
void Scene::setFloatParameter(const QString &name, float value)
{
// set the color in all programs
- foreach (GLProgram *program, m_programs) {
- program->bind();
- program->setFloat(name, value);
- program->unbind();
+ foreach (QGLShaderProgram *program, m_programs) {
+ program->enable();
+ program->setUniformValue(program->uniformLocation(name), value);
+ program->disable();
}
}
diff --git a/demos/boxes/scene.h b/demos/boxes/scene.h
index cc1dace..efe1e3f 100644
--- a/demos/boxes/scene.h
+++ b/demos/boxes/scene.h
@@ -50,14 +50,16 @@
#include "roundedbox.h"
#include "gltrianglemesh.h"
-#include "vector.h"
#include "trackball.h"
#include "glbuffers.h"
-#include "glshaders.h"
#include "qtbox.h"
#define PI 3.14159265358979
+QT_BEGIN_NAMESPACE
+class QMatrix4x4;
+QT_END_NAMESPACE
+
class ParameterEdit : public QWidget
{
public:
@@ -195,7 +197,7 @@ public slots:
void setFloatParameter(const QString &name, float value);
void newItem(ItemDialog::ItemType type);
protected:
- void renderBoxes(const gfx::Matrix4x4f &view, int excludeBox = -2);
+ void renderBoxes(const QMatrix4x4 &view, int excludeBox = -2);
void setStates();
void setLights();
void defaultStates();
@@ -231,13 +233,11 @@ private:
GLTexture3D *m_noise;
GLRenderTargetCube *m_mainCubemap;
QVector<GLRenderTargetCube *> m_cubemaps;
- QVector<GLProgram *> m_programs;
- GLVertexShader *m_vertexShader;
- QVector<GLFragmentShader *> m_fragmentShaders;
- GLFragmentShader *m_environmentShader;
- GLProgram *m_environmentProgram;
+ QVector<QGLShaderProgram *> m_programs;
+ QGLShader *m_vertexShader;
+ QVector<QGLShader *> m_fragmentShaders;
+ QGLShader *m_environmentShader;
+ QGLShaderProgram *m_environmentProgram;
};
-
-
#endif
diff --git a/demos/boxes/trackball.cpp b/demos/boxes/trackball.cpp
index 2dec679..9898441 100644
--- a/demos/boxes/trackball.cpp
+++ b/demos/boxes/trackball.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "trackball.h"
+#include "scene.h"
//============================================================================//
// TrackBall //
@@ -51,23 +52,23 @@ TrackBall::TrackBall(TrackMode mode)
, m_pressed(false)
, m_mode(mode)
{
- m_axis = gfx::Vector3f::vector(0, 1, 0);
- m_rotation = gfx::Quaternionf::quaternion(1.0f, 0.0f, 0.0f, 0.0f);
+ m_axis = QVector3D(0, 1, 0);
+ m_rotation = QQuaternion();
m_lastTime = QTime::currentTime();
}
-TrackBall::TrackBall(float angularVelocity, const gfx::Vector3f& axis, TrackMode mode)
+TrackBall::TrackBall(float angularVelocity, const QVector3D& axis, TrackMode mode)
: m_axis(axis)
, m_angularVelocity(angularVelocity)
, m_paused(false)
, m_pressed(false)
, m_mode(mode)
{
- m_rotation = gfx::Quaternionf::quaternion(1.0f, 0.0f, 0.0f, 0.0f);
+ m_rotation = QQuaternion();
m_lastTime = QTime::currentTime();
}
-void TrackBall::push(const QPointF& p, const gfx::Quaternionf &)
+void TrackBall::push(const QPointF& p, const QQuaternion &)
{
m_rotation = rotation();
m_pressed = true;
@@ -76,7 +77,7 @@ void TrackBall::push(const QPointF& p, const gfx::Quaternionf &)
m_angularVelocity = 0.0f;
}
-void TrackBall::move(const QPointF& p, const gfx::Quaternionf &transformation)
+void TrackBall::move(const QPointF& p, const QQuaternion &transformation)
{
if (!m_pressed)
return;
@@ -90,44 +91,45 @@ void TrackBall::move(const QPointF& p, const gfx::Quaternionf &transformation)
case Plane:
{
QLineF delta(m_lastPos, p);
- m_angularVelocity = delta.length() / msecs;
- m_axis = gfx::Vector3f::vector(delta.dy(), -delta.dx(), 0.0f).normalized();
- m_axis = transformation.transform(m_axis);
- m_rotation *= gfx::Quaternionf::rotation(delta.length(), m_axis);
+ m_angularVelocity = 180*delta.length() / (PI*msecs);
+ m_axis = QVector3D(delta.dy(), -delta.dx(), 0.0f).normalized();
+ m_axis = transformation.rotateVector(m_axis);
+ m_rotation *= QQuaternion::fromAxisAndAngle(m_axis, delta.length());
}
break;
case Sphere:
{
- gfx::Vector3f lastPos3D = gfx::Vector3f::vector(m_lastPos.x(), m_lastPos.y(), 0);
- float sqrZ = 1 - lastPos3D.sqrNorm();
+ QVector3D lastPos3D = QVector3D(m_lastPos.x(), m_lastPos.y(), 0.0f);
+ float sqrZ = 1 - QVector3D::dotProduct(lastPos3D, lastPos3D);
if (sqrZ > 0)
- lastPos3D[2] = sqrt(sqrZ);
+ lastPos3D.setZ(sqrt(sqrZ));
else
lastPos3D.normalize();
- gfx::Vector3f currentPos3D = gfx::Vector3f::vector(p.x(), p.y(), 0);
- sqrZ = 1 - currentPos3D.sqrNorm();
+ QVector3D currentPos3D = QVector3D(p.x(), p.y(), 0.0f);
+ sqrZ = 1 - QVector3D::dotProduct(currentPos3D, currentPos3D);
if (sqrZ > 0)
- currentPos3D[2] = sqrt(sqrZ);
+ currentPos3D.setZ(sqrt(sqrZ));
else
currentPos3D.normalize();
- m_axis = gfx::Vector3f::cross(currentPos3D, lastPos3D);
- float angle = asin(sqrt(m_axis.sqrNorm()));
+ m_axis = QVector3D::crossProduct(currentPos3D, lastPos3D);
+ float angle = asin(sqrt(QVector3D::dotProduct(m_axis, m_axis)));
- m_angularVelocity = angle / msecs;
+ m_angularVelocity = 180*angle / (PI*msecs);
m_axis.normalize();
- m_axis = transformation.transform(m_axis);
- m_rotation *= gfx::Quaternionf::rotation(angle, m_axis);
+ m_axis = transformation.rotateVector(m_axis);
+ m_rotation *= QQuaternion::fromAxisAndAngle(m_axis, angle);
}
break;
}
+
m_lastPos = p;
m_lastTime = currentTime;
}
-void TrackBall::release(const QPointF& p, const gfx::Quaternionf &transformation)
+void TrackBall::release(const QPointF& p, const QQuaternion &transformation)
{
// Calling move() caused the rotation to stop if the framerate was too low.
move(p, transformation);
@@ -146,13 +148,13 @@ void TrackBall::stop()
m_paused = true;
}
-gfx::Quaternionf TrackBall::rotation() const
+QQuaternion TrackBall::rotation() const
{
if (m_paused || m_pressed)
return m_rotation;
QTime currentTime = QTime::currentTime();
float angle = m_angularVelocity * m_lastTime.msecsTo(currentTime);
- return m_rotation * gfx::Quaternionf::rotation(angle, m_axis);
+ return m_rotation * QQuaternion::fromAxisAndAngle(m_axis, angle);
}
diff --git a/demos/boxes/trackball.h b/demos/boxes/trackball.h
index 817595f..323424b 100644
--- a/demos/boxes/trackball.h
+++ b/demos/boxes/trackball.h
@@ -44,7 +44,8 @@
#include <QtGui>
-#include "vector.h"
+#include <QtGui/qvector3d.h>
+#include <QtGui/qquaternion.h>
class TrackBall
{
@@ -55,17 +56,17 @@ public:
Sphere,
};
TrackBall(TrackMode mode = Sphere);
- TrackBall(float angularVelocity, const gfx::Vector3f& axis, TrackMode mode = Sphere);
+ TrackBall(float angularVelocity, const QVector3D& axis, TrackMode mode = Sphere);
// coordinates in [-1,1]x[-1,1]
- void push(const QPointF& p, const gfx::Quaternionf &transformation);
- void move(const QPointF& p, const gfx::Quaternionf &transformation);
- void release(const QPointF& p, const gfx::Quaternionf &transformation);
+ void push(const QPointF& p, const QQuaternion &transformation);
+ void move(const QPointF& p, const QQuaternion &transformation);
+ void release(const QPointF& p, const QQuaternion &transformation);
void start(); // starts clock
void stop(); // stops clock
- gfx::Quaternionf rotation() const;
+ QQuaternion rotation() const;
private:
- gfx::Quaternionf m_rotation;
- gfx::Vector3f m_axis;
+ QQuaternion m_rotation;
+ QVector3D m_axis;
float m_angularVelocity;
QPointF m_lastPos;
diff --git a/demos/boxes/vector.h b/demos/boxes/vector.h
deleted file mode 100644
index 0923b63..0000000
--- a/demos/boxes/vector.h
+++ /dev/null
@@ -1,602 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the demonstration applications of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef VECTOR_H
-#define VECTOR_H
-
-#include <cassert>
-#include <cmath>
-#include <iostream>
-
-namespace gfx
-{
-
-template<class T, int n>
-struct Vector
-{
- // Keep the Vector struct a plain old data (POD) struct by avoiding constructors
-
- static Vector vector(T x)
- {
- Vector result;
- for (int i = 0; i < n; ++i)
- result.v[i] = x;
- return result;
- }
-
- // Use only for 2D vectors
- static Vector vector(T x, T y)
- {
- assert(n == 2);
- Vector result;
- result.v[0] = x;
- result.v[1] = y;
- return result;
- }
-
- // Use only for 3D vectors
- static Vector vector(T x, T y, T z)
- {
- assert(n == 3);
- Vector result;
- result.v[0] = x;
- result.v[1] = y;
- result.v[2] = z;
- return result;
- }
-
- // Use only for 4D vectors
- static Vector vector(T x, T y, T z, T w)
- {
- assert(n == 4);
- Vector result;
- result.v[0] = x;
- result.v[1] = y;
- result.v[2] = z;
- result.v[3] = w;
- return result;
- }
-
- // Pass 'n' arguments to this function.
- static Vector vector(T *v)
- {
- Vector result;
- for (int i = 0; i < n; ++i)
- result.v[i] = v[i];
- return result;
- }
-
- T &operator [] (int i) {return v[i];}
- T operator [] (int i) const {return v[i];}
-
-#define VECTOR_BINARY_OP(op, arg, rhs) \
- Vector operator op (arg) const \
- { \
- Vector result; \
- for (int i = 0; i < n; ++i) \
- result.v[i] = v[i] op rhs; \
- return result; \
- }
-
- VECTOR_BINARY_OP(+, const Vector &u, u.v[i])
- VECTOR_BINARY_OP(-, const Vector &u, u.v[i])
- VECTOR_BINARY_OP(*, const Vector &u, u.v[i])
- VECTOR_BINARY_OP(/, const Vector &u, u.v[i])
- VECTOR_BINARY_OP(+, T s, s)
- VECTOR_BINARY_OP(-, T s, s)
- VECTOR_BINARY_OP(*, T s, s)
- VECTOR_BINARY_OP(/, T s, s)
-#undef VECTOR_BINARY_OP
-
- Vector operator - () const
- {
- Vector result;
- for (int i = 0; i < n; ++i)
- result.v[i] = -v[i];
- return result;
- }
-
-#define VECTOR_ASSIGN_OP(op, arg, rhs) \
- Vector &operator op (arg) \
- { \
- for (int i = 0; i < n; ++i) \
- v[i] op rhs; \
- return *this; \
- }
-
- VECTOR_ASSIGN_OP(+=, const Vector &u, u.v[i])
- VECTOR_ASSIGN_OP(-=, const Vector &u, u.v[i])
- VECTOR_ASSIGN_OP(=, T s, s)
- VECTOR_ASSIGN_OP(*=, T s, s)
- VECTOR_ASSIGN_OP(/=, T s, s)
-#undef VECTOR_ASSIGN_OP
-
- static T dot(const Vector &u, const Vector &v)
- {
- T sum(0);
- for (int i = 0; i < n; ++i)
- sum += u.v[i] * v.v[i];
- return sum;
- }
-
- static Vector cross(const Vector &u, const Vector &v)
- {
- assert(n == 3);
- return vector(u.v[1] * v.v[2] - u.v[2] * v.v[1],
- u.v[2] * v.v[0] - u.v[0] * v.v[2],
- u.v[0] * v.v[1] - u.v[1] * v.v[0]);
- }
-
- T sqrNorm() const
- {
- return dot(*this, *this);
- }
-
- // requires floating point type T
- void normalize()
- {
- T s = sqrNorm();
- if (s != 0)
- *this /= sqrt(s);
- }
-
- // requires floating point type T
- Vector normalized() const
- {
- T s = sqrNorm();
- if (s == 0)
- return *this;
- return *this / sqrt(s);
- }
-
- T *bits() {return v;}
- const T *bits() const {return v;}
-
- T v[n];
-};
-
-#define SCALAR_VECTOR_BINARY_OP(op) \
-template<class T, int n> \
-Vector<T, n> operator op (T s, const Vector<T, n>& u) \
-{ \
- Vector<T, n> result; \
- for (int i = 0; i < n; ++i) \
- result[i] = s op u[i]; \
- return result; \
-}
-
-SCALAR_VECTOR_BINARY_OP(+)
-SCALAR_VECTOR_BINARY_OP(-)
-SCALAR_VECTOR_BINARY_OP(*)
-SCALAR_VECTOR_BINARY_OP(/)
-#undef SCALAR_VECTOR_BINARY_OP
-
-template<class T, int n>
-std::ostream &operator << (std::ostream &os, const Vector<T, n> &v)
-{
- assert(n > 0);
- os << "[" << v[0];
- for (int i = 1; i < n; ++i)
- os << ", " << v[i];
- os << "]";
- return os;
-}
-
-typedef Vector<float, 2> Vector2f;
-typedef Vector<float, 3> Vector3f;
-typedef Vector<float, 4> Vector4f;
-
-template<class T, int rows, int cols>
-struct Matrix
-{
- // Keep the Matrix struct a plain old data (POD) struct by avoiding constructors
-
- static Matrix matrix(T x)
- {
- Matrix result;
- for (int i = 0; i < rows; ++i) {
- for (int j = 0; j < cols; ++j)
- result.v[i][j] = x;
- }
- return result;
- }
-
- static Matrix matrix(T *m)
- {
- Matrix result;
- for (int i = 0; i < rows; ++i) {
- for (int j = 0; j < cols; ++j) {
- result.v[i][j] = *m;
- ++m;
- }
- }
- return result;
- }
-
- T &operator () (int i, int j) {return v[i][j];}
- T operator () (int i, int j) const {return v[i][j];}
- Vector<T, cols> &operator [] (int i) {return v[i];}
- const Vector<T, cols> &operator [] (int i) const {return v[i];}
-
- // TODO: operators, methods
-
- Vector<T, rows> operator * (const Vector<T, cols> &u) const
- {
- Vector<T, rows> result;
- for (int i = 0; i < rows; ++i)
- result[i] = Vector<T, cols>::dot(v[i], u);
- return result;
- }
-
- template<int k>
- Matrix<T, rows, k> operator * (const Matrix<T, cols, k> &m)
- {
- Matrix<T, rows, k> result;
- for (int i = 0; i < rows; ++i)
- result[i] = v[i] * m;
- return result;
- }
-
- T* bits() {return reinterpret_cast<T *>(this);}
- const T* bits() const {return reinterpret_cast<const T *>(this);}
-
- // Simple Gauss elimination.
- // TODO: Optimize and improve stability.
- Matrix inverse(bool *ok = 0) const
- {
- assert(rows == cols);
- Matrix rhs = identity();
- Matrix lhs(*this);
- T temp;
- // Down
- for (int i = 0; i < rows; ++i) {
- // Pivoting
- int pivot = i;
- for (int j = i; j < rows; ++j) {
- if (qAbs(lhs(j, i)) > lhs(pivot, i))
- pivot = j;
- }
- // TODO: fuzzy compare.
- if (lhs(pivot, i) == T(0)) {
- if (ok)
- *ok = false;
- return rhs;
- }
- if (pivot != i) {
- for (int j = i; j < cols; ++j) {
- temp = lhs(pivot, j);
- lhs(pivot, j) = lhs(i, j);
- lhs(i, j) = temp;
- }
- for (int j = 0; j < cols; ++j) {
- temp = rhs(pivot, j);
- rhs(pivot, j) = rhs(i, j);
- rhs(i, j) = temp;
- }
- }
-
- // Normalize i-th row
- rhs[i] /= lhs(i, i);
- for (int j = cols - 1; j > i; --j)
- lhs(i, j) /= lhs(i, i);
-
- // Eliminate non-zeros in i-th column below the i-th row.
- for (int j = i + 1; j < rows; ++j) {
- rhs[j] -= lhs(j, i) * rhs[i];
- for (int k = i + 1; k < cols; ++k)
- lhs(j, k) -= lhs(j, i) * lhs(i, k);
- }
- }
- // Up
- for (int i = rows - 1; i > 0; --i) {
- for (int j = i - 1; j >= 0; --j)
- rhs[j] -= lhs(j, i) * rhs[i];
- }
- if (ok)
- *ok = true;
- return rhs;
- }
-
- Matrix<T, cols, rows> transpose() const
- {
- Matrix<T, cols, rows> result;
- for (int i = 0; i < rows; ++i) {
- for (int j = 0; j < cols; ++j)
- result.v[j][i] = v[i][j];
- }
- return result;
- }
-
- static Matrix identity()
- {
- Matrix result = matrix(T(0));
- for (int i = 0; i < rows && i < cols; ++i)
- result.v[i][i] = T(1);
- return result;
- }
-
- Vector<T, cols> v[rows];
-};
-
-template<class T, int rows, int cols>
-Vector<T, cols> operator * (const Vector<T, rows> &u, const Matrix<T, rows, cols> &m)
-{
- Vector<T, cols> result = Vector<T, cols>::vector(T(0));
- for (int i = 0; i < rows; ++i)
- result += m[i] * u[i];
- return result;
-}
-
-template<class T, int rows, int cols>
-std::ostream &operator << (std::ostream &os, const Matrix<T, rows, cols> &m)
-{
- assert(rows > 0);
- os << "[" << m[0];
- for (int i = 1; i < rows; ++i)
- os << ", " << m[i];
- os << "]";
- return os;
-}
-
-
-typedef Matrix<float, 2, 2> Matrix2x2f;
-typedef Matrix<float, 3, 3> Matrix3x3f;
-typedef Matrix<float, 4, 4> Matrix4x4f;
-
-template<class T>
-struct Quaternion
-{
- // Keep the Quaternion struct a plain old data (POD) struct by avoiding constructors
-
- static Quaternion quaternion(T s, T x, T y, T z)
- {
- Quaternion result;
- result.scalar = s;
- result.vector[0] = x;
- result.vector[1] = y;
- result.vector[2] = z;
- return result;
- }
-
- static Quaternion quaternion(T s, const Vector<T, 3> &v)
- {
- Quaternion result;
- result.scalar = s;
- result.vector = v;
- return result;
- }
-
- static Quaternion identity()
- {
- return quaternion(T(1), T(0), T(0), T(0));
- }
-
- // assumes that all the elements are packed tightly
- T& operator [] (int i) {return reinterpret_cast<T *>(this)[i];}
- T operator [] (int i) const {return reinterpret_cast<const T *>(this)[i];}
-
-#define QUATERNION_BINARY_OP(op, arg, rhs) \
- Quaternion operator op (arg) const \
- { \
- Quaternion result; \
- for (int i = 0; i < 4; ++i) \
- result[i] = (*this)[i] op rhs; \
- return result; \
- }
-
- QUATERNION_BINARY_OP(+, const Quaternion &q, q[i])
- QUATERNION_BINARY_OP(-, const Quaternion &q, q[i])
- QUATERNION_BINARY_OP(*, T s, s)
- QUATERNION_BINARY_OP(/, T s, s)
-#undef QUATERNION_BINARY_OP
-
- Quaternion operator - () const
- {
- return Quaternion(-scalar, -vector);
- }
-
- Quaternion operator * (const Quaternion &q) const
- {
- Quaternion result;
- result.scalar = scalar * q.scalar - Vector<T, 3>::dot(vector, q.vector);
- result.vector = scalar * q.vector + vector * q.scalar + Vector<T, 3>::cross(vector, q.vector);
- return result;
- }
-
- Quaternion operator * (const Vector<T, 3> &v) const
- {
- Quaternion result;
- result.scalar = -Vector<T, 3>::dot(vector, v);
- result.vector = scalar * v + Vector<T, 3>::cross(vector, v);
- return result;
- }
-
- friend Quaternion operator * (const Vector<T, 3> &v, const Quaternion &q)
- {
- Quaternion result;
- result.scalar = -Vector<T, 3>::dot(v, q.vector);
- result.vector = v * q.scalar + Vector<T, 3>::cross(v, q.vector);
- return result;
- }
-
-#define QUATERNION_ASSIGN_OP(op, arg, rhs) \
- Quaternion &operator op (arg) \
- { \
- for (int i = 0; i < 4; ++i) \
- (*this)[i] op rhs; \
- return *this; \
- }
-
- QUATERNION_ASSIGN_OP(+=, const Quaternion &q, q[i])
- QUATERNION_ASSIGN_OP(-=, const Quaternion &q, q[i])
- QUATERNION_ASSIGN_OP(=, T s, s)
- QUATERNION_ASSIGN_OP(*=, T s, s)
- QUATERNION_ASSIGN_OP(/=, T s, s)
-#undef QUATERNION_ASSIGN_OP
-
- Quaternion& operator *= (const Quaternion &q)
- {
- Quaternion result;
- result.scalar = scalar * q.scalar - Vector<T, 3>::dot(vector, q.vector);
- result.vector = scalar * q.vector + vector * q.scalar + Vector<T, 3>::cross(vector, q.vector);
- return (*this = result);
- }
-
- Quaternion& operator *= (const Vector<T, 3> &v)
- {
- Quaternion result;
- result.scalar = -Vector<T, 3>::dot(vector, v);
- result.vector = scalar * v + Vector<T, 3>::cross(vector, v);
- return (*this = result);
- }
-
- Quaternion conjugate() const
- {
- return quaternion(scalar, -vector);
- }
-
- T sqrNorm() const
- {
- return scalar * scalar + vector.sqrNorm();
- }
-
- Quaternion inverse() const
- {
- return conjugate() / sqrNorm();
- }
-
- // requires floating point type T
- Quaternion normalized() const
- {
- T s = sqrNorm();
- if (s == 0)
- return *this;
- return *this / sqrt(s);
- }
-
- void matrix(Matrix<T, 3, 3>& m) const
- {
- T bb = vector[0] * vector[0];
- T cc = vector[1] * vector[1];
- T dd = vector[2] * vector[2];
- T diag = scalar * scalar - bb - cc - dd;
- T ab = scalar * vector[0];
- T ac = scalar * vector[1];
- T ad = scalar * vector[2];
- T bc = vector[0] * vector[1];
- T cd = vector[1] * vector[2];
- T bd = vector[2] * vector[0];
- m(0, 0) = diag + 2 * bb;
- m(0, 1) = 2 * (bc - ad);
- m(0, 2) = 2 * (ac + bd);
- m(1, 0) = 2 * (ad + bc);
- m(1, 1) = diag + 2 * cc;
- m(1, 2) = 2 * (cd - ab);
- m(2, 0) = 2 * (bd - ac);
- m(2, 1) = 2 * (ab + cd);
- m(2, 2) = diag + 2 * dd;
- }
-
- void matrix(Matrix<T, 4, 4>& m) const
- {
- T bb = vector[0] * vector[0];
- T cc = vector[1] * vector[1];
- T dd = vector[2] * vector[2];
- T diag = scalar * scalar - bb - cc - dd;
- T ab = scalar * vector[0];
- T ac = scalar * vector[1];
- T ad = scalar * vector[2];
- T bc = vector[0] * vector[1];
- T cd = vector[1] * vector[2];
- T bd = vector[2] * vector[0];
- m(0, 0) = diag + 2 * bb;
- m(0, 1) = 2 * (bc - ad);
- m(0, 2) = 2 * (ac + bd);
- m(0, 3) = 0;
- m(1, 0) = 2 * (ad + bc);
- m(1, 1) = diag + 2 * cc;
- m(1, 2) = 2 * (cd - ab);
- m(1, 3) = 0;
- m(2, 0) = 2 * (bd - ac);
- m(2, 1) = 2 * (ab + cd);
- m(2, 2) = diag + 2 * dd;
- m(2, 3) = 0;
- m(3, 0) = 0;
- m(3, 1) = 0;
- m(3, 2) = 0;
- m(3, 3) = 1;
- }
-
- // assumes that 'this' is normalized
- Vector<T, 3> transform(const Vector<T, 3> &v) const
- {
- Matrix<T, 3, 3> m;
- matrix(m);
- return v * m;
- }
-
- // assumes that all the elements are packed tightly
- T* bits() {return reinterpret_cast<T *>(this);}
- const T* bits() const {return reinterpret_cast<const T *>(this);}
-
- // requires floating point type T
- static Quaternion rotation(T angle, const Vector<T, 3> &unitAxis)
- {
- T s = sin(angle / 2);
- T c = cos(angle / 2);
- return quaternion(c, unitAxis * s);
- }
-
- T scalar;
- Vector<T, 3> vector;
-};
-
-template<class T>
-Quaternion<T> operator * (T s, const Quaternion<T>& q)
-{
- return Quaternion<T>::quaternion(s * q.scalar, s * q.vector);
-}
-
-typedef Quaternion<float> Quaternionf;
-
-} // end namespace gfx
-
-#endif
diff --git a/demos/browser/browser.pro b/demos/browser/browser.pro
index 13e8a1d..f54afe4 100644
--- a/demos/browser/browser.pro
+++ b/demos/browser/browser.pro
@@ -3,7 +3,7 @@ TARGET = browser
QT += webkit network
CONFIG += qt warn_on
-contains(QT_BUILD_PARTS, tools): CONFIG += uitools
+contains(QT_BUILD_PARTS, tools):!symbian: CONFIG += uitools
else: DEFINES += QT_NO_UITOOLS
FORMS += \
@@ -89,3 +89,8 @@ target.path = $$[QT_INSTALL_DEMOS]/browser
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.plist *.icns *.ico *.rc *.pro *.html *.doc images htmls data
sources.path = $$[QT_INSTALL_DEMOS]/browser
INSTALLS += target sources
+
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ TARGET.UID3 = 0xA000CF70
+}
diff --git a/demos/browser/browsermainwindow.cpp b/demos/browser/browsermainwindow.cpp
index 8f68c07..2489467 100644
--- a/demos/browser/browsermainwindow.cpp
+++ b/demos/browser/browsermainwindow.cpp
@@ -81,6 +81,7 @@ BrowserMainWindow::BrowserMainWindow(QWidget *parent, Qt::WindowFlags flags)
, m_stop(0)
, m_reload(0)
{
+ setToolButtonStyle(Qt::ToolButtonFollowStyle);
setAttribute(Qt::WA_DeleteOnClose, true);
statusBar()->setSizeGripEnabled(true);
setupMenu();
@@ -575,7 +576,7 @@ QUrl BrowserMainWindow::guessUrlFromString(const QString &string)
int dotIndex = urlStr.indexOf(QLatin1Char('.'));
if (dotIndex != -1) {
QString prefix = urlStr.left(dotIndex).toLower();
- QByteArray schema = (prefix == QLatin1String("ftp")) ? prefix.toLatin1() : "http";
+ QByteArray schema = (prefix == QLatin1String("ftp")) ? prefix.toLatin1() : QByteArray("http");
QUrl url =
QUrl::fromEncoded(schema + "://" + urlStr.toUtf8(), QUrl::TolerantMode);
if (url.isValid())
diff --git a/demos/browser/data/defaultbookmarks.xbel b/demos/browser/data/defaultbookmarks.xbel
index 1d20ac0..dce5297 100644
--- a/demos/browser/data/defaultbookmarks.xbel
+++ b/demos/browser/data/defaultbookmarks.xbel
@@ -30,6 +30,9 @@
<bookmark href="http://xkcd.com/">
<title>xkcd</title>
</bookmark>
+ <bookmark href="http://twitter.com/qtbynokia">
+ <title>Twitter</title>
+ </bookmark>
</folder>
<folder folded="yes">
<title>Bookmarks Menu</title>
diff --git a/demos/browser/networkaccessmanager.cpp b/demos/browser/networkaccessmanager.cpp
index c420e5b..6f53091 100644
--- a/demos/browser/networkaccessmanager.cpp
+++ b/demos/browser/networkaccessmanager.cpp
@@ -57,16 +57,21 @@
#include <QtNetwork/QAuthenticator>
#include <QtNetwork/QNetworkDiskCache>
#include <QtNetwork/QNetworkProxy>
+#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QSslError>
NetworkAccessManager::NetworkAccessManager(QObject *parent)
- : QNetworkAccessManager(parent)
+ : QNetworkAccessManager(parent),
+ requestFinishedCount(0), requestFinishedFromCacheCount(0), requestFinishedPipelinedCount(0),
+ requestFinishedSecureCount(0)
{
connect(this, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
connect(this, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)),
SLOT(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)));
+ connect(this, SIGNAL(finished(QNetworkReply *)),
+ SLOT(requestFinished(QNetworkReply *)));
#ifndef QT_NO_OPENSSL
connect(this, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)),
SLOT(sslErrors(QNetworkReply*, const QList<QSslError>&)));
@@ -79,6 +84,38 @@ NetworkAccessManager::NetworkAccessManager(QObject *parent)
setCache(diskCache);
}
+QNetworkReply* NetworkAccessManager::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData)
+{
+ QNetworkRequest request = req; // copy so we can modify
+ // this is a temporary hack until we properly use the pipelining flags from QtWebkit
+ // pipeline everything! :)
+ request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
+ return QNetworkAccessManager::createRequest(op, request, outgoingData);
+}
+
+void NetworkAccessManager::requestFinished(QNetworkReply *reply)
+{
+ requestFinishedCount++;
+
+ if (reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool() == true)
+ requestFinishedFromCacheCount++;
+
+ if (reply->attribute(QNetworkRequest::HttpPipeliningWasUsedAttribute).toBool() == true)
+ requestFinishedPipelinedCount++;
+
+ if (reply->attribute(QNetworkRequest::ConnectionEncryptedAttribute).toBool() == true)
+ requestFinishedSecureCount++;
+
+ if (requestFinishedCount % 10)
+ return;
+
+ double pctCached = (double(requestFinishedFromCacheCount) * 100.0/ double(requestFinishedCount));
+ double pctPipelined = (double(requestFinishedPipelinedCount) * 100.0/ double(requestFinishedCount));
+ double pctSecure = (double(requestFinishedSecureCount) * 100.0/ double(requestFinishedCount));
+ qDebug("STATS [%lli requests total] [%3.2f%% from cache] [%3.2f%% pipelined] [%3.2f%% SSL/TLS]", requestFinishedCount, pctCached, pctPipelined, pctSecure);
+
+}
+
void NetworkAccessManager::loadSettings()
{
QSettings settings;
diff --git a/demos/browser/networkaccessmanager.h b/demos/browser/networkaccessmanager.h
index 58757f3..636aa22 100644
--- a/demos/browser/networkaccessmanager.h
+++ b/demos/browser/networkaccessmanager.h
@@ -43,6 +43,7 @@
#define NETWORKACCESSMANAGER_H
#include <QtNetwork/QNetworkAccessManager>
+#include <QtNetwork/QNetworkRequest>
class NetworkAccessManager : public QNetworkAccessManager
{
@@ -51,11 +52,18 @@ class NetworkAccessManager : public QNetworkAccessManager
public:
NetworkAccessManager(QObject *parent = 0);
+ virtual QNetworkReply* createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0 );
+
private:
QList<QString> sslTrustedHostList;
+ qint64 requestFinishedCount;
+ qint64 requestFinishedFromCacheCount;
+ qint64 requestFinishedPipelinedCount;
+ qint64 requestFinishedSecureCount;
public slots:
void loadSettings();
+ void requestFinished(QNetworkReply *reply);
private slots:
void authenticationRequired(QNetworkReply *reply, QAuthenticator *auth);
diff --git a/demos/browser/searchlineedit.cpp b/demos/browser/searchlineedit.cpp
index f7cb878..9662590 100644
--- a/demos/browser/searchlineedit.cpp
+++ b/demos/browser/searchlineedit.cpp
@@ -50,7 +50,9 @@
ClearButton::ClearButton(QWidget *parent)
: QAbstractButton(parent)
{
+#ifndef QT_NO_CURSOR
setCursor(Qt::ArrowCursor);
+#endif // QT_NO_CURSOR
setToolTip(tr("Clear"));
setVisible(false);
setFocusPolicy(Qt::NoFocus);
@@ -103,7 +105,9 @@ SearchButton::SearchButton(QWidget *parent)
m_menu(0)
{
setObjectName(QLatin1String("SearchButton"));
+#ifndef QT_NO_CURSOR
setCursor(Qt::ArrowCursor);
+#endif //QT_NO_CURSOR
setFocusPolicy(Qt::NoFocus);
}
diff --git a/demos/browser/webview.cpp b/demos/browser/webview.cpp
index 32299bc..7b5a42a 100644
--- a/demos/browser/webview.cpp
+++ b/demos/browser/webview.cpp
@@ -54,7 +54,9 @@
#include <QtWebKit/QWebHitTestResult>
+#ifndef QT_NO_UITOOLS
#include <QtUiTools/QUiLoader>
+#endif //QT_NO_UITOOLS
#include <QtCore/QDebug>
#include <QtCore/QBuffer>
diff --git a/demos/browser/xbel.cpp b/demos/browser/xbel.cpp
index 2449d3c..06ceda3 100644
--- a/demos/browser/xbel.cpp
+++ b/demos/browser/xbel.cpp
@@ -133,16 +133,13 @@ BookmarkNode *XbelReader::read(QIODevice *device)
{
BookmarkNode *root = new BookmarkNode(BookmarkNode::Root);
setDevice(device);
- while (!atEnd()) {
- readNext();
- if (isStartElement()) {
- QString version = attributes().value(QLatin1String("version")).toString();
- if (name() == QLatin1String("xbel")
- && (version.isEmpty() || version == QLatin1String("1.0"))) {
- readXBEL(root);
- } else {
- raiseError(QObject::tr("The file is not an XBEL version 1.0 file."));
- }
+ if (readNextStartElement()) {
+ QString version = attributes().value(QLatin1String("version")).toString();
+ if (name() == QLatin1String("xbel")
+ && (version.isEmpty() || version == QLatin1String("1.0"))) {
+ readXBEL(root);
+ } else {
+ raiseError(QObject::tr("The file is not an XBEL version 1.0 file."));
}
}
return root;
@@ -152,21 +149,15 @@ void XbelReader::readXBEL(BookmarkNode *parent)
{
Q_ASSERT(isStartElement() && name() == QLatin1String("xbel"));
- while (!atEnd()) {
- readNext();
- if (isEndElement())
- break;
-
- if (isStartElement()) {
- if (name() == QLatin1String("folder"))
- readFolder(parent);
- else if (name() == QLatin1String("bookmark"))
- readBookmarkNode(parent);
- else if (name() == QLatin1String("separator"))
- readSeparator(parent);
- else
- skipUnknownElement();
- }
+ while (readNextStartElement()) {
+ if (name() == QLatin1String("folder"))
+ readFolder(parent);
+ else if (name() == QLatin1String("bookmark"))
+ readBookmarkNode(parent);
+ else if (name() == QLatin1String("separator"))
+ readSeparator(parent);
+ else
+ skipCurrentElement();
}
}
@@ -177,26 +168,19 @@ void XbelReader::readFolder(BookmarkNode *parent)
BookmarkNode *folder = new BookmarkNode(BookmarkNode::Folder, parent);
folder->expanded = (attributes().value(QLatin1String("folded")) == QLatin1String("no"));
- while (!atEnd()) {
- readNext();
-
- if (isEndElement())
- break;
-
- if (isStartElement()) {
- if (name() == QLatin1String("title"))
- readTitle(folder);
- else if (name() == QLatin1String("desc"))
- readDescription(folder);
- else if (name() == QLatin1String("folder"))
- readFolder(folder);
- else if (name() == QLatin1String("bookmark"))
- readBookmarkNode(folder);
- else if (name() == QLatin1String("separator"))
- readSeparator(folder);
- else
- skipUnknownElement();
- }
+ while (readNextStartElement()) {
+ if (name() == QLatin1String("title"))
+ readTitle(folder);
+ else if (name() == QLatin1String("desc"))
+ readDescription(folder);
+ else if (name() == QLatin1String("folder"))
+ readFolder(folder);
+ else if (name() == QLatin1String("bookmark"))
+ readBookmarkNode(folder);
+ else if (name() == QLatin1String("separator"))
+ readSeparator(folder);
+ else
+ skipCurrentElement();
}
}
@@ -224,39 +208,18 @@ void XbelReader::readBookmarkNode(BookmarkNode *parent)
Q_ASSERT(isStartElement() && name() == QLatin1String("bookmark"));
BookmarkNode *bookmark = new BookmarkNode(BookmarkNode::Bookmark, parent);
bookmark->url = attributes().value(QLatin1String("href")).toString();
- while (!atEnd()) {
- readNext();
- if (isEndElement())
- break;
-
- if (isStartElement()) {
- if (name() == QLatin1String("title"))
- readTitle(bookmark);
- else if (name() == QLatin1String("desc"))
- readDescription(bookmark);
- else
- skipUnknownElement();
- }
+ while (readNextStartElement()) {
+ if (name() == QLatin1String("title"))
+ readTitle(bookmark);
+ else if (name() == QLatin1String("desc"))
+ readDescription(bookmark);
+ else
+ skipCurrentElement();
}
if (bookmark->title.isEmpty())
bookmark->title = QObject::tr("Unknown title");
}
-void XbelReader::skipUnknownElement()
-{
- Q_ASSERT(isStartElement());
-
- while (!atEnd()) {
- readNext();
-
- if (isEndElement())
- break;
-
- if (isStartElement())
- skipUnknownElement();
- }
-}
-
XbelWriter::XbelWriter()
{
diff --git a/demos/browser/xbel.h b/demos/browser/xbel.h
index ece5505..6b2e2b2 100644
--- a/demos/browser/xbel.h
+++ b/demos/browser/xbel.h
@@ -87,7 +87,6 @@ public:
BookmarkNode *read(QIODevice *device);
private:
- void skipUnknownElement();
void readXBEL(BookmarkNode *parent);
void readTitle(BookmarkNode *parent);
void readDescription(BookmarkNode *parent);
diff --git a/demos/chip/chip.cpp b/demos/chip/chip.cpp
index 7940156..903af25 100644
--- a/demos/chip/chip.cpp
+++ b/demos/chip/chip.cpp
@@ -74,8 +74,9 @@ void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWid
if (option->state & QStyle::State_MouseOver)
fillColor = fillColor.light(125);
- if (option->levelOfDetail < 0.2) {
- if (option->levelOfDetail < 0.125) {
+ const qreal lod = option->levelOfDetailFromTransform(painter->worldTransform());
+ if (lod < 0.2) {
+ if (lod < 0.125) {
painter->fillRect(QRectF(0, 0, 110, 70), fillColor);
return;
}
@@ -100,7 +101,7 @@ void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWid
painter->drawRect(QRect(14, 14, 79, 39));
painter->setBrush(b);
- if (option->levelOfDetail >= 1) {
+ if (lod >= 1) {
painter->setPen(QPen(Qt::gray, 1));
painter->drawLine(15, 54, 94, 54);
painter->drawLine(94, 53, 94, 15);
@@ -108,7 +109,7 @@ void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWid
}
// Draw text
- if (option->levelOfDetail >= 2) {
+ if (lod >= 2) {
QFont font("Times", 10);
font.setStyleStrategy(QFont::ForceOutline);
painter->setFont(font);
@@ -122,17 +123,17 @@ void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWid
// Draw lines
QVarLengthArray<QLineF, 36> lines;
- if (option->levelOfDetail >= 0.5) {
- for (int i = 0; i <= 10; i += (option->levelOfDetail > 0.5 ? 1 : 2)) {
+ if (lod >= 0.5) {
+ for (int i = 0; i <= 10; i += (lod > 0.5 ? 1 : 2)) {
lines.append(QLineF(18 + 7 * i, 13, 18 + 7 * i, 5));
lines.append(QLineF(18 + 7 * i, 54, 18 + 7 * i, 62));
}
- for (int i = 0; i <= 6; i += (option->levelOfDetail > 0.5 ? 1 : 2)) {
+ for (int i = 0; i <= 6; i += (lod > 0.5 ? 1 : 2)) {
lines.append(QLineF(5, 18 + i * 5, 13, 18 + i * 5));
lines.append(QLineF(94, 18 + i * 5, 102, 18 + i * 5));
}
}
- if (option->levelOfDetail >= 0.4) {
+ if (lod >= 0.4) {
const QLineF lineData[] = {
QLineF(25, 35, 35, 35),
QLineF(35, 30, 35, 40),
diff --git a/demos/chip/chip.pro b/demos/chip/chip.pro
index 53fa23b..4339f82 100644
--- a/demos/chip/chip.pro
+++ b/demos/chip/chip.pro
@@ -17,3 +17,4 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES *.png *.pro *.html *.doc images
sources.path = $$[QT_INSTALL_DEMOS]/chip
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/demos/composition/composition.cpp b/demos/composition/composition.cpp
index bb8a02c..8061908 100644
--- a/demos/composition/composition.cpp
+++ b/demos/composition/composition.cpp
@@ -377,7 +377,9 @@ void CompositionRenderer::paint(QPainter *painter)
p.setCompositionMode(QPainter::CompositionMode_Source);
p.fillRect(QRect(0, 0, m_pbuffer->width(), m_pbuffer->height()), Qt::transparent);
- p.save();
+ p.save(); // Needed when using the GL1 engine
+ p.beginNativePainting(); // Needed when using the GL2 engine
+
glBindTexture(GL_TEXTURE_2D, m_base_tex);
glEnable(GL_TEXTURE_2D);
glColor4f(1.,1.,1.,1.);
@@ -399,16 +401,21 @@ void CompositionRenderer::paint(QPainter *painter)
glEnd();
glDisable(GL_TEXTURE_2D);
- p.restore();
+
+ p.endNativePainting(); // Needed when using the GL2 engine
+ p.restore(); // Needed when using the GL1 engine
drawSource(p);
p.end();
m_pbuffer->updateDynamicTexture(m_compositing_tex);
}
- glWidget()->makeCurrent();
+ painter->beginNativePainting(); // Needed when using the GL2 engine
+ glWidget()->makeCurrent(); // Needed when using the GL1 engine
glBindTexture(GL_TEXTURE_2D, m_compositing_tex);
glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.,1.,1.,1.);
glBegin(GL_QUADS);
{
@@ -426,6 +433,7 @@ void CompositionRenderer::paint(QPainter *painter)
}
glEnd();
glDisable(GL_TEXTURE_2D);
+ painter->endNativePainting(); // Needed when using the GL2 engine
} else
#endif
{
diff --git a/demos/composition/composition.pro b/demos/composition/composition.pro
index d5c4a60..c820a8b 100644
--- a/demos/composition/composition.pro
+++ b/demos/composition/composition.pro
@@ -17,6 +17,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES *.png *.jpg *.pro *.html
sources.path = $$[QT_INSTALL_DEMOS]/composition
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
win32-msvc* {
QMAKE_CXXFLAGS += /Zm500
QMAKE_CFLAGS += /Zm500
diff --git a/demos/deform/deform.pro b/demos/deform/deform.pro
index db8484d..4cce195 100644
--- a/demos/deform/deform.pro
+++ b/demos/deform/deform.pro
@@ -17,3 +17,8 @@ target.path = $$[QT_INSTALL_DEMOS]/deform
sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.html
sources.path = $$[QT_INSTALL_DEMOS]/deform
INSTALLS += target sources
+
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ TARGET.UID3 = 0xA000A63D
+}
diff --git a/demos/deform/pathdeform.cpp b/demos/deform/pathdeform.cpp
index beee7ff..e391225 100644
--- a/demos/deform/pathdeform.cpp
+++ b/demos/deform/pathdeform.cpp
@@ -53,7 +53,6 @@
#include <QDesktopWidget>
#include <qmath.h>
-
PathDeformControls::PathDeformControls(QWidget *parent, PathDeformRenderer* renderer, bool smallScreen)
: QWidget(parent)
{
@@ -241,6 +240,7 @@ void PathDeformControls::layoutForSmallScreen()
QRect screen_size = QApplication::desktop()->screenGeometry();
radiusSlider->setValue(qMin(screen_size.width(), screen_size.height())/5);
+
m_renderer->setText(tr("Qt"));
}
diff --git a/demos/demos.pro b/demos/demos.pro
index 6084550..c4b8872 100644
--- a/demos/demos.pro
+++ b/demos/demos.pro
@@ -1,26 +1,32 @@
TEMPLATE = subdirs
SUBDIRS = \
- demos_shared \
- demos_deform \
- demos_gradients \
- demos_pathstroke \
- demos_affine \
- demos_composition \
- demos_books \
- demos_interview \
- demos_mainwindow \
- demos_spreadsheet \
- demos_textedit \
- demos_chip \
- demos_embeddeddialogs \
- demos_undo
+ demos_shared \
+ demos_deform \
+ demos_gradients \
+ demos_pathstroke \
+ demos_affine \
+ demos_composition \
+ demos_books \
+ demos_interview \
+ demos_mainwindow \
+ demos_spreadsheet \
+ demos_textedit \
+ demos_chip \
+ demos_embeddeddialogs \
+ demos_undo \
+ demos_sub-attaq
+
+symbian: SUBDIRS = \
+ demos_shared \
+ demos_deform \
+ demos_pathstroke
contains(QT_CONFIG, opengl):!contains(QT_CONFIG, opengles1):!contains(QT_CONFIG, opengles1cl):!contains(QT_CONFIG, opengles2):{
SUBDIRS += demos_boxes
}
mac*: SUBDIRS += demos_macmainwindow
-wince*|embedded: SUBDIRS += embedded
+wince*|symbian|embedded: SUBDIRS += embedded
!contains(QT_EDITION, Console):!cross_compile:!embedded:!wince*:SUBDIRS += demos_arthurplugin
@@ -38,6 +44,8 @@ sources.files = README *.pro
sources.path = $$[QT_INSTALL_DEMOS]
INSTALLS += sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
demos_chip.subdir = chip
demos_embeddeddialogs.subdir = embeddeddialogs
demos_shared.subdir = shared
@@ -61,6 +69,7 @@ demos_mediaplayer.subdir = mediaplayer
demos_browser.subdir = browser
demos_boxes.subdir = boxes
+demos_sub-attaq.subdir = sub-attaq
#CONFIG += ordered
!ordered {
diff --git a/demos/embedded/anomaly/README.TXT b/demos/embedded/anomaly/README.TXT
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/demos/embedded/anomaly/README.TXT
diff --git a/demos/embedded/anomaly/anomaly.pro b/demos/embedded/anomaly/anomaly.pro
new file mode 100644
index 0000000..8fb1265
--- /dev/null
+++ b/demos/embedded/anomaly/anomaly.pro
@@ -0,0 +1,31 @@
+QT += network \
+ webkit
+HEADERS += src/BrowserWindow.h \
+ src/BrowserView.h \
+ src/TitleBar.h \
+ src/HomeView.h \
+ src/AddressBar.h \
+ src/BookmarksView.h \
+ src/flickcharm.h \
+ src/ZoomStrip.h \
+ src/ControlStrip.h
+SOURCES += src/Main.cpp \
+ src/BrowserWindow.cpp \
+ src/BrowserView.cpp \
+ src/TitleBar.cpp \
+ src/HomeView.cpp \
+ src/AddressBar.cpp \
+ src/BookmarksView.cpp \
+ src/flickcharm.cpp \
+ src/ZoomStrip.cpp \
+ src/ControlStrip.cpp
+RESOURCES += src/anomaly.qrc
+
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h
+ LIBS += -lesock -lconnmon
+ TARGET.CAPABILITY = NetworkServices
+ TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
+ TARGET.UID3 = 0xA000CF71
+}
diff --git a/demos/embedded/anomaly/src/AddressBar.cpp b/demos/embedded/anomaly/src/AddressBar.cpp
new file mode 100644
index 0000000..23e9ad1
--- /dev/null
+++ b/demos/embedded/anomaly/src/AddressBar.cpp
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "AddressBar.h"
+
+#include <QtCore>
+#include <QtGui>
+
+class LineEdit: public QLineEdit
+{
+public:
+ LineEdit(QWidget *parent = 0): QLineEdit(parent) {}
+
+ void paintEvent(QPaintEvent *event) {
+ QLineEdit::paintEvent(event);
+ if (text().isEmpty()) {
+ QPainter p(this);
+ int flags = Qt::AlignLeft | Qt::AlignVCenter;
+ p.setPen(palette().color(QPalette::Disabled, QPalette::Text));
+ p.drawText(rect().adjusted(10, 0, 0, 0), flags, "Enter address or search terms");
+ p.end();
+ }
+ }
+};
+
+AddressBar::AddressBar(QWidget *parent)
+ : QWidget(parent)
+{
+ m_lineEdit = new LineEdit(parent);
+ connect(m_lineEdit, SIGNAL(returnPressed()), SLOT(processAddress()));
+ m_toolButton = new QToolButton(parent);
+ m_toolButton->setText("Go");
+ connect(m_toolButton, SIGNAL(clicked()), SLOT(processAddress()));
+}
+
+QSize AddressBar::sizeHint() const
+{
+ return m_lineEdit->sizeHint();
+}
+
+void AddressBar::processAddress()
+{
+ if (!m_lineEdit->text().isEmpty())
+ emit addressEntered(m_lineEdit->text());
+}
+
+void AddressBar::resizeEvent(QResizeEvent *event)
+{
+ int x, y, w, h;
+
+ m_toolButton->adjustSize();
+ x = width() - m_toolButton->width();
+ y = 0;
+ w = m_toolButton->width();
+ h = height() - 1;
+ m_toolButton->setGeometry(x, y, w, h);
+ m_toolButton->show();
+
+ x = 0;
+ y = 0;
+ w = width() - m_toolButton->width();
+ h = height() - 1;
+ m_lineEdit->setGeometry(x, y, w, h);
+ m_lineEdit->show();
+}
+
+void AddressBar::focusInEvent(QFocusEvent *event)
+{
+ m_lineEdit->setFocus();
+ QWidget::focusInEvent(event);
+}
diff --git a/demos/embedded/anomaly/src/AddressBar.h b/demos/embedded/anomaly/src/AddressBar.h
new file mode 100644
index 0000000..38ef818
--- /dev/null
+++ b/demos/embedded/anomaly/src/AddressBar.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ADDRESSBAR_H
+#define ADDRESSBAR_H
+
+#include <QWidget>
+
+class QLineEdit;
+class QToolButton;
+
+class AddressBar : public QWidget
+{
+ Q_OBJECT
+
+public:
+ AddressBar(QWidget *parent = 0);
+ QSize sizeHint() const;
+
+protected:
+ void resizeEvent(QResizeEvent *event);
+ void focusInEvent(QFocusEvent *event);
+
+signals:
+ void addressEntered(const QString &address);
+
+private slots:
+ void processAddress();
+
+private:
+ QLineEdit *m_lineEdit;
+ QToolButton *m_toolButton;
+};
+
+#endif // ADDRESSBAR_H
diff --git a/demos/embedded/anomaly/src/BookmarksView.cpp b/demos/embedded/anomaly/src/BookmarksView.cpp
new file mode 100644
index 0000000..77c4824
--- /dev/null
+++ b/demos/embedded/anomaly/src/BookmarksView.cpp
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "BookmarksView.h"
+
+#include <QtGui>
+
+BookmarksView::BookmarksView(QWidget *parent)
+ : QWidget(parent)
+{
+ QListWidget *m_iconView = new QListWidget(this);
+ connect(m_iconView, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(activate(QListWidgetItem*)));
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ setLayout(layout);
+ layout->addWidget(m_iconView);
+
+ m_iconView->addItem("www.google.com");
+ m_iconView->addItem("qt.nokia.com/doc/4.5");
+ m_iconView->addItem("news.bbc.co.uk/text_only.stm");
+ m_iconView->addItem("mobile.wikipedia.org");
+ m_iconView->addItem("qt.nokia.com");
+ m_iconView->addItem("en.wikipedia.org");
+
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+}
+
+void BookmarksView::activate(QListWidgetItem *item)
+{
+ QUrl url = item->text().prepend("http://");
+ emit urlSelected(url);
+}
diff --git a/demos/embedded/anomaly/src/BookmarksView.h b/demos/embedded/anomaly/src/BookmarksView.h
new file mode 100644
index 0000000..2d23eb6
--- /dev/null
+++ b/demos/embedded/anomaly/src/BookmarksView.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef BOOKMARKSVIEW_H
+#define BOOKMARKSVIEW_H
+
+#include <QWidget>
+
+class QListWidgetItem;
+class QUrl;
+
+class BookmarksView : public QWidget
+{
+ Q_OBJECT
+
+public:
+ BookmarksView(QWidget *parent = 0);
+
+signals:
+ void urlSelected(const QUrl &url);
+
+private slots:
+ void activate(QListWidgetItem *item);
+};
+
+#endif // BOOKMARKSVIEW_H
diff --git a/demos/embedded/anomaly/src/BrowserView.cpp b/demos/embedded/anomaly/src/BrowserView.cpp
new file mode 100644
index 0000000..2841fee
--- /dev/null
+++ b/demos/embedded/anomaly/src/BrowserView.cpp
@@ -0,0 +1,185 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "BrowserView.h"
+
+#include <QtGui>
+#include <QtNetwork>
+#include <QtWebKit>
+
+#include "ControlStrip.h"
+#include "TitleBar.h"
+#include "flickcharm.h"
+#include "ZoomStrip.h"
+
+#if defined (Q_OS_SYMBIAN)
+#include "sym_iap_util.h"
+#endif
+
+BrowserView::BrowserView(QWidget *parent)
+ : QWidget(parent)
+ , m_titleBar(0)
+ , m_webView(0)
+ , m_progress(0)
+ , m_currentZoom(100)
+{
+ m_titleBar = new TitleBar(this);
+ m_webView = new QWebView(this);
+ m_zoomStrip = new ZoomStrip(this);
+ m_controlStrip = new ControlStrip(this);
+
+ m_zoomLevels << 30 << 50 << 67 << 80 << 90;
+ m_zoomLevels << 100;
+ m_zoomLevels << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300;
+
+ QTimer::singleShot(0, this, SLOT(initialize()));
+}
+
+void BrowserView::initialize()
+{
+ connect(m_zoomStrip, SIGNAL(zoomInClicked()), SLOT(zoomIn()));
+ connect(m_zoomStrip, SIGNAL(zoomOutClicked()), SLOT(zoomOut()));
+
+ connect(m_controlStrip, SIGNAL(menuClicked()), SIGNAL(menuButtonClicked()));
+ connect(m_controlStrip, SIGNAL(backClicked()), m_webView, SLOT(back()));
+ connect(m_controlStrip, SIGNAL(forwardClicked()), m_webView, SLOT(forward()));
+
+ QPalette pal = m_webView->palette();
+ pal.setBrush(QPalette::Base, Qt::white);
+ m_webView->setPalette(pal);
+
+ FlickCharm *flickCharm = new FlickCharm(this);
+ flickCharm->activateOn(m_webView);
+
+ m_webView->setZoomFactor(static_cast<qreal>(m_currentZoom)/100.0);
+ connect(m_webView, SIGNAL(loadStarted()), SLOT(start()));
+ connect(m_webView, SIGNAL(loadProgress(int)), SLOT(setProgress(int)));
+ connect(m_webView, SIGNAL(loadFinished(bool)), SLOT(finish(bool)));
+ connect(m_webView, SIGNAL(urlChanged(QUrl)), SLOT(updateTitleBar()));
+
+ m_webView->setHtml("Will try to load page soon!");
+ m_webView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_webView->setFocus();
+#ifdef Q_OS_SYMBIAN
+ QTimer::singleShot(0, this, SLOT(setDefaultIap()));
+#endif
+}
+
+void BrowserView::start()
+{
+ m_progress = 0;
+ updateTitleBar();
+ //m_titleBar->setText(m_webView->url().toString());
+}
+
+void BrowserView::setProgress(int percent)
+{
+ m_progress = percent;
+ updateTitleBar();
+ //m_titleBar->setText(QString("Loading %1%").arg(percent));
+}
+
+void BrowserView::updateTitleBar()
+{
+ QUrl url = m_webView->url();
+ m_titleBar->setHost(url.host());
+ m_titleBar->setTitle(m_webView->title());
+ m_titleBar->setProgress(m_progress);
+}
+
+void BrowserView::finish(bool ok)
+{
+ m_progress = 0;
+ updateTitleBar();
+
+ // TODO: handle error
+ if (!ok) {
+ //m_titleBar->setText("Loading failed.");
+ }
+}
+
+void BrowserView::zoomIn()
+{
+ int i = m_zoomLevels.indexOf(m_currentZoom);
+ Q_ASSERT(i >= 0);
+ if (i < m_zoomLevels.count() - 1)
+ m_currentZoom = m_zoomLevels[i + 1];
+
+ m_webView->setZoomFactor(static_cast<qreal>(m_currentZoom)/100.0);
+}
+
+void BrowserView::zoomOut()
+{
+ int i = m_zoomLevels.indexOf(m_currentZoom);
+ Q_ASSERT(i >= 0);
+ if (i > 0)
+ m_currentZoom = m_zoomLevels[i - 1];
+
+ m_webView->setZoomFactor(static_cast<qreal>(m_currentZoom)/100.0);
+}
+
+void BrowserView::resizeEvent(QResizeEvent *event)
+{
+ QWidget::resizeEvent(event);
+
+ int h1 = m_titleBar->sizeHint().height();
+ int h2 = m_controlStrip->sizeHint().height();
+
+ m_titleBar->setGeometry(0, 0, width(), h1);
+ m_controlStrip->setGeometry(0, height() - h2, width(), h2);
+ m_webView->setGeometry(0, h1, width(), height() - h1);
+
+ int zw = m_zoomStrip->sizeHint().width();
+ int zh = m_zoomStrip->sizeHint().height();
+ m_zoomStrip->move(width() - zw, (height() - zh) / 2);
+}
+#ifdef Q_OS_SYMBIAN
+void BrowserView::setDefaultIap()
+{
+ qt_SetDefaultIap();
+ m_webView->load(QUrl("http://news.bbc.co.uk/text_only.stm"));
+}
+#endif
+
+void BrowserView::navigate(const QUrl &url)
+{
+ m_webView->load(url);
+}
diff --git a/demos/embedded/anomaly/src/BrowserView.h b/demos/embedded/anomaly/src/BrowserView.h
new file mode 100644
index 0000000..a09def9
--- /dev/null
+++ b/demos/embedded/anomaly/src/BrowserView.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef BROWSERVIEW_H
+#define BROWSERVIEW_H
+
+#include <QWidget>
+#include <QVector>
+
+class QUrl;
+class QWebView;
+class TitleBar;
+class ControlStrip;
+class ZoomStrip;
+
+class BrowserView : public QWidget
+{
+ Q_OBJECT
+
+public:
+ BrowserView(QWidget *parent = 0);
+
+public slots:
+ void navigate(const QUrl &url);
+ void zoomIn();
+ void zoomOut();
+#ifdef Q_OS_SYMBIAN
+ void setDefaultIap();
+#endif
+
+private slots:
+ void initialize();
+ void start();
+ void setProgress(int percent);
+ void finish(bool);
+ void updateTitleBar();
+
+signals:
+ void menuButtonClicked();
+
+protected:
+ void resizeEvent(QResizeEvent *event);
+
+private:
+ TitleBar *m_titleBar;
+ QWebView *m_webView;
+ ZoomStrip *m_zoomStrip;
+ ControlStrip *m_controlStrip;
+ int m_progress;
+ int m_currentZoom;
+ QVector<int> m_zoomLevels;
+};
+
+#endif // BROWSERVIEW_H
diff --git a/demos/embedded/anomaly/src/BrowserWindow.cpp b/demos/embedded/anomaly/src/BrowserWindow.cpp
new file mode 100644
index 0000000..9bc2113
--- /dev/null
+++ b/demos/embedded/anomaly/src/BrowserWindow.cpp
@@ -0,0 +1,187 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "BrowserWindow.h"
+
+#include <QtCore>
+#include <QtGui>
+
+#include "BrowserView.h"
+#include "HomeView.h"
+
+BrowserWindow::BrowserWindow()
+ : QWidget()
+ , m_homeView(0)
+ , m_browserView(0)
+{
+ m_timeLine = new QTimeLine(300, this);
+ m_timeLine->setCurveShape(QTimeLine::EaseInOutCurve);
+ QTimer::singleShot(0, this, SLOT(initialize()));
+}
+
+void BrowserWindow::initialize()
+{
+ m_homeView = new HomeView(this);
+ m_browserView = new BrowserView(this);
+
+ m_homeView->hide();
+ m_homeView->resize(size());
+ m_homeView->move(0, 0);
+
+ m_browserView->hide();
+ m_browserView->resize(size());
+ m_browserView->move(0, 0);
+
+ connect(m_homeView, SIGNAL(addressEntered(QString)), SLOT(gotoAddress(QString)));
+ connect(m_homeView, SIGNAL(urlActivated(QUrl)), SLOT(navigate(QUrl)));
+
+ connect(m_browserView, SIGNAL(menuButtonClicked()), SLOT(showHomeView()));
+
+ m_homeView->setVisible(false);
+ m_browserView->setVisible(false);
+ slide(0);
+
+ connect(m_timeLine, SIGNAL(frameChanged(int)), SLOT(slide(int)));
+}
+
+
+// from Demo Browser
+QUrl guessUrlFromString(const QString &string)
+{
+ QString urlStr = string.trimmed();
+ QRegExp test(QLatin1String("^[a-zA-Z]+\\:.*"));
+
+ // Check if it looks like a qualified URL. Try parsing it and see.
+ bool hasSchema = test.exactMatch(urlStr);
+ if (hasSchema) {
+ QUrl url = QUrl::fromEncoded(urlStr.toUtf8(), QUrl::TolerantMode);
+ if (url.isValid())
+ return url;
+ }
+
+ // Might be a file.
+ if (QFile::exists(urlStr)) {
+ QFileInfo info(urlStr);
+ return QUrl::fromLocalFile(info.absoluteFilePath());
+ }
+
+ // Might be a shorturl - try to detect the schema.
+ if (!hasSchema) {
+ int dotIndex = urlStr.indexOf(QLatin1Char('.'));
+ if (dotIndex != -1) {
+ QString prefix = urlStr.left(dotIndex).toLower();
+ QString schema = (prefix == QString("ftp")) ? prefix.toLatin1() : QString("http");
+ QString location = schema + "://" + urlStr;
+ QUrl url = QUrl::fromEncoded(location.toUtf8(), QUrl::TolerantMode);
+ if (url.isValid())
+ return url;
+ }
+ }
+
+ // Fall back to QUrl's own tolerant parser.
+ QUrl url = QUrl::fromEncoded(string.toUtf8(), QUrl::TolerantMode);
+
+ // finally for cases where the user just types in a hostname add http
+ if (url.scheme().isEmpty())
+ url = QUrl::fromEncoded("http://" + string.toUtf8(), QUrl::TolerantMode);
+ return url;
+}
+
+void BrowserWindow::gotoAddress(const QString &address)
+{
+ m_browserView->navigate(guessUrlFromString(address));
+ showBrowserView();
+}
+
+void BrowserWindow::navigate(const QUrl &url)
+{
+ m_browserView->navigate(url);
+ showBrowserView();
+}
+
+void BrowserWindow::slide(int pos)
+{
+ m_browserView->move(pos, 0);
+ m_homeView->move(pos - width(), 0);
+ m_browserView->show();
+ m_homeView->show();
+}
+
+void BrowserWindow::showHomeView()
+{
+ if (m_timeLine->state() != QTimeLine::NotRunning)
+ return;
+
+ m_timeLine->setFrameRange(0, width());
+ m_timeLine->start();
+ m_homeView->setFocus();
+}
+
+void BrowserWindow::showBrowserView()
+{
+ if (m_timeLine->state() != QTimeLine::NotRunning)
+ return;
+
+ m_timeLine->setFrameRange(width(), 0);
+ m_timeLine->start();
+ m_browserView->setFocus();
+}
+
+void BrowserWindow::keyReleaseEvent(QKeyEvent *event)
+{
+ QWidget::keyReleaseEvent(event);
+
+ if (event->key() == Qt::Key_F3) {
+ if (m_homeView->isVisible())
+ showBrowserView();
+ else
+ showHomeView();
+ }
+}
+
+void BrowserWindow::resizeEvent(QResizeEvent *event)
+{
+ if (m_homeView)
+ m_homeView->resize(size());
+
+ if (m_browserView)
+ m_browserView->resize(size());
+}
diff --git a/demos/embedded/anomaly/src/BrowserWindow.h b/demos/embedded/anomaly/src/BrowserWindow.h
new file mode 100644
index 0000000..f94c635
--- /dev/null
+++ b/demos/embedded/anomaly/src/BrowserWindow.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef BROWSERWINDOW_H
+#define BROWSERWINDOW_H
+
+#include <QWidget>
+class QTimeLine;
+class QUrl;
+
+class BrowserView;
+class HomeView;
+
+class BrowserWindow : public QWidget
+{
+ Q_OBJECT
+
+public:
+ BrowserWindow();
+
+private slots:
+ void initialize();
+ void navigate(const QUrl &url);
+ void gotoAddress(const QString &address);
+
+public slots:
+ void showBrowserView();
+ void showHomeView();
+ void slide(int);
+
+protected:
+ void keyReleaseEvent(QKeyEvent *event);
+ void resizeEvent(QResizeEvent *event);
+
+private:
+ HomeView *m_homeView;
+ BrowserView *m_browserView;
+ QTimeLine *m_timeLine;
+};
+
+#endif // BROWSERWINDOW_H
diff --git a/demos/embedded/anomaly/src/ControlStrip.cpp b/demos/embedded/anomaly/src/ControlStrip.cpp
new file mode 100644
index 0000000..e30de82
--- /dev/null
+++ b/demos/embedded/anomaly/src/ControlStrip.cpp
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "ControlStrip.h"
+
+#include <QtCore>
+#include <QtGui>
+
+ControlStrip::ControlStrip(QWidget *parent)
+ : QWidget(parent)
+{
+ menuPixmap.load(":/images/edit-find.png");
+ backPixmap.load(":/images/go-previous.png");
+ forwardPixmap.load(":/images/go-next.png");
+}
+
+QSize ControlStrip::sizeHint() const
+{
+ return minimumSizeHint();
+}
+
+QSize ControlStrip::minimumSizeHint() const
+{
+ return QSize(320, 48);
+}
+
+void ControlStrip::mousePressEvent(QMouseEvent *event)
+{
+ int h = height();
+ int x = event->pos().x();
+
+ if (x < h) {
+ emit menuClicked();
+ event->accept();
+ return;
+ }
+
+ if (x > width() - h) {
+ emit forwardClicked();
+ event->accept();
+ return;
+ }
+
+ if ((x < width() - 2 * h) && (x > width() - 3 * h)) {
+ emit backClicked();
+ event->accept();
+ return;
+ }
+}
+
+void ControlStrip::paintEvent(QPaintEvent *event)
+{
+ int h = height();
+ int s = (h - menuPixmap.height()) / 2;
+
+ QPainter p(this);
+ p.fillRect(event->rect(), QColor(32, 32, 32, 192));
+ p.setCompositionMode(QPainter::CompositionMode_SourceOver);
+ p.drawPixmap(s, s, menuPixmap);
+ p.drawPixmap(width() - 3 * h + s, s, backPixmap);
+ p.drawPixmap(width() - h + s, s, forwardPixmap);
+ p.end();
+}
diff --git a/demos/embedded/anomaly/src/ControlStrip.h b/demos/embedded/anomaly/src/ControlStrip.h
new file mode 100644
index 0000000..39b2706
--- /dev/null
+++ b/demos/embedded/anomaly/src/ControlStrip.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CONTROLSTRIP_H
+#define CONTROLSTRIP_H
+
+#include <QWidget>
+
+class ControlStrip : public QWidget
+{
+ Q_OBJECT
+
+public:
+ ControlStrip(QWidget *parent = 0);
+
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+signals:
+ void menuClicked();
+ void backClicked();
+ void forwardClicked();
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ void mousePressEvent(QMouseEvent *event);
+
+private:
+ QPixmap menuPixmap;
+ QPixmap backPixmap;
+ QPixmap forwardPixmap;
+};
+
+#endif // CONTROLSTRIP_H
diff --git a/demos/embedded/anomaly/src/HomeView.cpp b/demos/embedded/anomaly/src/HomeView.cpp
new file mode 100644
index 0000000..5eaf31a
--- /dev/null
+++ b/demos/embedded/anomaly/src/HomeView.cpp
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "HomeView.h"
+
+#include <QtCore>
+#include <QtGui>
+
+#include "AddressBar.h"
+#include "BookmarksView.h"
+
+HomeView::HomeView(QWidget *parent)
+ : QWidget(parent)
+ , m_addressBar(0)
+{
+ m_addressBar = new AddressBar(parent);
+ connect(m_addressBar, SIGNAL(addressEntered(QString)), SLOT(gotoAddress(QString)));
+
+ m_bookmarks = new BookmarksView(parent);
+ connect(m_bookmarks, SIGNAL(urlSelected(QUrl)), SIGNAL(urlActivated(QUrl)));
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setMargin(4);
+ layout->setSpacing(4);
+ layout->addWidget(m_addressBar);
+ layout->addWidget(m_bookmarks);
+}
+
+void HomeView::gotoAddress(const QString &address)
+{
+ emit addressEntered(address);
+}
+
+void HomeView::focusInEvent(QFocusEvent *event)
+{
+ m_addressBar->setFocus();
+ QWidget::focusInEvent(event);
+}
diff --git a/demos/embedded/anomaly/src/HomeView.h b/demos/embedded/anomaly/src/HomeView.h
new file mode 100644
index 0000000..df43beb
--- /dev/null
+++ b/demos/embedded/anomaly/src/HomeView.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef HOMEVIEW_H
+#define HOMEVIEW_H
+
+#include <QWidget>
+
+class QUrl;
+
+class AddressBar;
+class BookmarksView;
+
+class HomeView : public QWidget
+{
+ Q_OBJECT
+
+public:
+ HomeView(QWidget *parent);
+
+signals:
+ void urlActivated(const QUrl &url);
+ void addressEntered(const QString &address);
+
+private slots:
+ void gotoAddress(const QString &address);
+
+protected:
+ void focusInEvent(QFocusEvent *event);
+
+private:
+ AddressBar *m_addressBar;
+ BookmarksView *m_bookmarks;
+};
+
+#endif // HOMEVIEW_H
diff --git a/demos/embedded/anomaly/src/Main.cpp b/demos/embedded/anomaly/src/Main.cpp
new file mode 100644
index 0000000..59369bd
--- /dev/null
+++ b/demos/embedded/anomaly/src/Main.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+#include <QtWebKit>
+
+#include "BrowserWindow.h"
+
+int main(int argc, char *argv[])
+{
+#if !defined(Q_WS_S60)
+ QApplication::setGraphicsSystem("raster");
+#endif
+
+ QApplication app(argc, argv);
+
+ app.setApplicationName("Anomaly");
+ app.setApplicationVersion("0.0.0");
+
+ BrowserWindow window;
+#ifdef Q_OS_SYMBIAN
+ window.showFullScreen();
+ QWebSettings::globalSettings()->setObjectCacheCapacities(128*1024, 1024*1024, 1024*1024);
+ QWebSettings::globalSettings()->setMaximumPagesInCache(3);
+#else
+ window.resize(360, 640);
+ window.show();
+ app.setStyle("windows");
+#endif
+
+ return app.exec();
+}
diff --git a/demos/embedded/anomaly/src/TitleBar.cpp b/demos/embedded/anomaly/src/TitleBar.cpp
new file mode 100644
index 0000000..435deb2
--- /dev/null
+++ b/demos/embedded/anomaly/src/TitleBar.cpp
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "TitleBar.h"
+
+#include <QtCore>
+#include <QtGui>
+
+TitleBar::TitleBar(QWidget *parent)
+ : QWidget(parent)
+ , m_progress(0)
+{
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
+}
+
+void TitleBar::setHost(const QString &host)
+{
+ m_host = host;
+ update();
+}
+
+void TitleBar::setTitle(const QString &title)
+{
+ m_title = title;
+ update();
+}
+
+void TitleBar::setProgress(int percent)
+{
+ m_progress = percent;
+ update();
+}
+
+QSize TitleBar::sizeHint() const
+{
+ return minimumSizeHint();
+}
+
+QSize TitleBar::minimumSizeHint() const
+{
+ QFontMetrics fm = fontMetrics();
+ return QSize(100, fm.height());
+}
+
+void TitleBar::paintEvent(QPaintEvent *event)
+{
+ QString title = m_host;
+ if (!m_title.isEmpty())
+ title.append(": ").append(m_title);
+
+ QPalette pal = palette();
+ QPainter p(this);
+ p.fillRect(event->rect(), pal.color(QPalette::Highlight));
+
+ if (m_progress > 0) {
+
+ QRect box = rect();
+ box.setLeft(16);
+ box.setWidth(width() - box.left() - 110);
+
+ p.setPen(pal.color(QPalette::HighlightedText));
+ p.setOpacity(0.8);
+ p.drawText(box, Qt::AlignLeft + Qt::AlignVCenter, title);
+
+ int x = width() - 100 - 5;
+ int y = 1;
+ int h = height() - 4;
+
+ p.setOpacity(1.0);
+ p.setBrush(Qt::NoBrush);
+ p.setPen(pal.color(QPalette::HighlightedText));
+ p.drawRect(x, y, 100, h);
+ p.setPen(Qt::NoPen);
+ p.setBrush(pal.color(QPalette::HighlightedText));
+ p.drawRect(x, y, m_progress, h);
+ } else {
+
+ QRect box = rect();
+ box.setLeft(16);
+ box.setWidth(width() - box.left() - 5);
+ p.setPen(pal.color(QPalette::HighlightedText));
+ p.drawText(box, Qt::AlignLeft + Qt::AlignVCenter, title);
+ }
+
+ p.end();
+}
diff --git a/demos/embedded/anomaly/src/TitleBar.h b/demos/embedded/anomaly/src/TitleBar.h
new file mode 100644
index 0000000..ee846e6
--- /dev/null
+++ b/demos/embedded/anomaly/src/TitleBar.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TITLEBAR_H
+#define TITLEBAR_H
+
+#include <QWidget>
+
+class TitleBar : public QWidget
+{
+ Q_OBJECT
+
+public:
+ TitleBar(QWidget *parent = 0);
+
+ void setHost(const QString &host);
+ void setTitle(const QString &title);
+ void setProgress(int percent);
+
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+protected:
+ void paintEvent(QPaintEvent *event);
+
+private:
+ QString m_host;
+ QString m_title;
+ int m_progress;
+};
+
+#endif // TITLEBAR_H
diff --git a/demos/embedded/anomaly/src/ZoomStrip.cpp b/demos/embedded/anomaly/src/ZoomStrip.cpp
new file mode 100644
index 0000000..15123d0
--- /dev/null
+++ b/demos/embedded/anomaly/src/ZoomStrip.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "ZoomStrip.h"
+
+#include <QtCore>
+#include <QtGui>
+
+ZoomStrip::ZoomStrip(QWidget *parent)
+ : QWidget(parent)
+{
+ zoomInPixmap.load(":/images/list-add.png");
+ zoomOutPixmap.load(":/images/list-remove.png");
+}
+
+QSize ZoomStrip::sizeHint() const
+{
+ return minimumSizeHint();
+}
+
+QSize ZoomStrip::minimumSizeHint() const
+{
+ return QSize(48, 96);
+}
+
+void ZoomStrip::mousePressEvent(QMouseEvent *event)
+{
+ if (event->pos().y() < height() / 2)
+ emit zoomInClicked();
+ else
+ emit zoomOutClicked();
+}
+
+void ZoomStrip::paintEvent(QPaintEvent *event)
+{
+ int w = width();
+ int s = (w - zoomInPixmap.width()) / 2;
+
+ QPainter p(this);
+ p.fillRect(event->rect(), QColor(128, 128, 128, 128));
+ p.drawPixmap(s, s, zoomInPixmap);
+ p.drawPixmap(s, s + w, zoomOutPixmap);
+ p.end();
+}
diff --git a/demos/embedded/anomaly/src/ZoomStrip.h b/demos/embedded/anomaly/src/ZoomStrip.h
new file mode 100644
index 0000000..dc66842
--- /dev/null
+++ b/demos/embedded/anomaly/src/ZoomStrip.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ZOOMSTRIP_H
+#define ZOOMSTRIP_H
+
+#include <QWidget>
+
+class ZoomStrip : public QWidget
+{
+ Q_OBJECT
+
+public:
+ ZoomStrip(QWidget *parent = 0);
+
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+signals:
+ void zoomInClicked();
+ void zoomOutClicked();
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ void mousePressEvent(QMouseEvent *event);
+
+private:
+ QPixmap zoomInPixmap;
+ QPixmap zoomOutPixmap;
+};
+
+#endif // ZOOMSTRIP_H
diff --git a/demos/embedded/anomaly/src/anomaly.qrc b/demos/embedded/anomaly/src/anomaly.qrc
new file mode 100644
index 0000000..601a34e
--- /dev/null
+++ b/demos/embedded/anomaly/src/anomaly.qrc
@@ -0,0 +1,9 @@
+<RCC>
+ <qresource prefix="/" >
+ <file>images/go-next.png</file>
+ <file>images/go-previous.png</file>
+ <file>images/edit-find.png</file>
+ <file>images/list-add.png</file>
+ <file>images/list-remove.png</file>
+ </qresource>
+</RCC>
diff --git a/demos/embedded/anomaly/src/flickcharm.cpp b/demos/embedded/anomaly/src/flickcharm.cpp
new file mode 100644
index 0000000..a884e07
--- /dev/null
+++ b/demos/embedded/anomaly/src/flickcharm.cpp
@@ -0,0 +1,327 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "flickcharm.h"
+
+#include <QAbstractScrollArea>
+#include <QApplication>
+#include <QBasicTimer>
+#include <QEvent>
+#include <QHash>
+#include <QList>
+#include <QMouseEvent>
+#include <QScrollBar>
+#include <QWebFrame>
+#include <QWebView>
+
+#include <QDebug>
+
+struct FlickData {
+ typedef enum { Steady, Pressed, ManualScroll, AutoScroll, Stop } State;
+ State state;
+ QWidget *widget;
+ QPoint pressPos;
+ QPoint offset;
+ QPoint dragPos;
+ QPoint speed;
+ QList<QEvent*> ignored;
+};
+
+class FlickCharmPrivate
+{
+public:
+ QHash<QWidget*, FlickData*> flickData;
+ QBasicTimer ticker;
+};
+
+FlickCharm::FlickCharm(QObject *parent): QObject(parent)
+{
+ d = new FlickCharmPrivate;
+}
+
+FlickCharm::~FlickCharm()
+{
+ delete d;
+}
+
+void FlickCharm::activateOn(QWidget *widget)
+{
+ QAbstractScrollArea *scrollArea = dynamic_cast<QAbstractScrollArea*>(widget);
+ if (scrollArea) {
+ scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+ QWidget *viewport = scrollArea->viewport();
+
+ viewport->installEventFilter(this);
+ scrollArea->installEventFilter(this);
+
+ d->flickData.remove(viewport);
+ d->flickData[viewport] = new FlickData;
+ d->flickData[viewport]->widget = widget;
+ d->flickData[viewport]->state = FlickData::Steady;
+
+ return;
+ }
+
+ QWebView *webView = dynamic_cast<QWebView*>(widget);
+ if (webView) {
+ QWebFrame *frame = webView->page()->mainFrame();
+ frame->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
+ frame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
+
+ webView->installEventFilter(this);
+
+ d->flickData.remove(webView);
+ d->flickData[webView] = new FlickData;
+ d->flickData[webView]->widget = webView;
+ d->flickData[webView]->state = FlickData::Steady;
+
+ return;
+ }
+
+ qWarning() << "FlickCharm only works on QAbstractScrollArea (and derived classes)";
+ qWarning() << "or QWebView (and derived classes)";
+}
+
+void FlickCharm::deactivateFrom(QWidget *widget)
+{
+ QAbstractScrollArea *scrollArea = dynamic_cast<QAbstractScrollArea*>(widget);
+ if (scrollArea) {
+ QWidget *viewport = scrollArea->viewport();
+
+ viewport->removeEventFilter(this);
+ scrollArea->removeEventFilter(this);
+
+ delete d->flickData[viewport];
+ d->flickData.remove(viewport);
+
+ return;
+ }
+
+ QWebView *webView = dynamic_cast<QWebView*>(widget);
+ if (webView) {
+ webView->removeEventFilter(this);
+
+ delete d->flickData[webView];
+ d->flickData.remove(webView);
+
+ return;
+ }
+}
+
+static QPoint scrollOffset(QWidget *widget)
+{
+ int x = 0, y = 0;
+
+ QAbstractScrollArea *scrollArea = dynamic_cast<QAbstractScrollArea*>(widget);
+ if (scrollArea) {
+ x = scrollArea->horizontalScrollBar()->value();
+ y = scrollArea->verticalScrollBar()->value();
+ }
+
+ QWebView *webView = dynamic_cast<QWebView*>(widget);
+ if (webView) {
+ QWebFrame *frame = webView->page()->mainFrame();
+ x = frame->evaluateJavaScript("window.scrollX").toInt();
+ y = frame->evaluateJavaScript("window.scrollY").toInt();
+ }
+
+ return QPoint(x, y);
+}
+
+static void setScrollOffset(QWidget *widget, const QPoint &p)
+{
+ QAbstractScrollArea *scrollArea = dynamic_cast<QAbstractScrollArea*>(widget);
+ if (scrollArea) {
+ scrollArea->horizontalScrollBar()->setValue(p.x());
+ scrollArea->verticalScrollBar()->setValue(p.y());
+ }
+
+ QWebView *webView = dynamic_cast<QWebView*>(widget);
+ QWebFrame *frame = webView ? webView->page()->mainFrame() : 0;
+ if (frame)
+ frame->evaluateJavaScript(QString("window.scrollTo(%1,%2);").arg(p.x()).arg(p.y()));
+}
+
+static QPoint deaccelerate(const QPoint &speed, int a = 1, int max = 64)
+{
+ int x = qBound(-max, speed.x(), max);
+ int y = qBound(-max, speed.y(), max);
+ x = (x == 0) ? x : (x > 0) ? qMax(0, x - a) : qMin(0, x + a);
+ y = (y == 0) ? y : (y > 0) ? qMax(0, y - a) : qMin(0, y + a);
+ return QPoint(x, y);
+}
+
+bool FlickCharm::eventFilter(QObject *object, QEvent *event)
+{
+ if (!object->isWidgetType())
+ return false;
+
+ QEvent::Type type = event->type();
+ if (type != QEvent::MouseButtonPress &&
+ type != QEvent::MouseButtonRelease &&
+ type != QEvent::MouseMove)
+ return false;
+
+ QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(event);
+ if (!mouseEvent || mouseEvent->modifiers() != Qt::NoModifier)
+ return false;
+
+ QWidget *viewport = dynamic_cast<QWidget*>(object);
+ FlickData *data = d->flickData.value(viewport);
+ if (!viewport || !data || data->ignored.removeAll(event))
+ return false;
+
+ bool consumed = false;
+ switch (data->state) {
+
+ case FlickData::Steady:
+ if (mouseEvent->type() == QEvent::MouseButtonPress)
+ if (mouseEvent->buttons() == Qt::LeftButton) {
+ consumed = true;
+ data->state = FlickData::Pressed;
+ data->pressPos = mouseEvent->pos();
+ data->offset = scrollOffset(data->widget);
+ }
+ break;
+
+ case FlickData::Pressed:
+ if (mouseEvent->type() == QEvent::MouseButtonRelease) {
+ consumed = true;
+ data->state = FlickData::Steady;
+
+ QMouseEvent *event1 = new QMouseEvent(QEvent::MouseButtonPress,
+ data->pressPos, Qt::LeftButton,
+ Qt::LeftButton, Qt::NoModifier);
+ QMouseEvent *event2 = new QMouseEvent(*mouseEvent);
+
+ data->ignored << event1;
+ data->ignored << event2;
+ QApplication::postEvent(object, event1);
+ QApplication::postEvent(object, event2);
+ }
+ if (mouseEvent->type() == QEvent::MouseMove) {
+ consumed = true;
+ data->state = FlickData::ManualScroll;
+ data->dragPos = QCursor::pos();
+ if (!d->ticker.isActive())
+ d->ticker.start(20, this);
+ }
+ break;
+
+ case FlickData::ManualScroll:
+ if (mouseEvent->type() == QEvent::MouseMove) {
+ consumed = true;
+ QPoint delta = mouseEvent->pos() - data->pressPos;
+ setScrollOffset(data->widget, data->offset - delta);
+ }
+ if (mouseEvent->type() == QEvent::MouseButtonRelease) {
+ consumed = true;
+ data->state = FlickData::AutoScroll;
+ }
+ break;
+
+ case FlickData::AutoScroll:
+ if (mouseEvent->type() == QEvent::MouseButtonPress) {
+ consumed = true;
+ data->state = FlickData::Stop;
+ data->speed = QPoint(0, 0);
+ data->pressPos = mouseEvent->pos();
+ data->offset = scrollOffset(data->widget);
+ }
+ if (mouseEvent->type() == QEvent::MouseButtonRelease) {
+ consumed = true;
+ data->state = FlickData::Steady;
+ data->speed = QPoint(0, 0);
+ }
+ break;
+
+ case FlickData::Stop:
+ if (mouseEvent->type() == QEvent::MouseButtonRelease) {
+ consumed = true;
+ data->state = FlickData::Steady;
+ }
+ if (mouseEvent->type() == QEvent::MouseMove) {
+ consumed = true;
+ data->state = FlickData::ManualScroll;
+ data->dragPos = QCursor::pos();
+ if (!d->ticker.isActive())
+ d->ticker.start(20, this);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return consumed;
+}
+
+void FlickCharm::timerEvent(QTimerEvent *event)
+{
+ int count = 0;
+ QHashIterator<QWidget*, FlickData*> item(d->flickData);
+ while (item.hasNext()) {
+ item.next();
+ FlickData *data = item.value();
+
+ if (data->state == FlickData::ManualScroll) {
+ count++;
+ data->speed = QCursor::pos() - data->dragPos;
+ data->dragPos = QCursor::pos();
+ }
+
+ if (data->state == FlickData::AutoScroll) {
+ count++;
+ data->speed = deaccelerate(data->speed);
+ QPoint p = scrollOffset(data->widget);
+ setScrollOffset(data->widget, p - data->speed);
+ if (data->speed == QPoint(0, 0))
+ data->state = FlickData::Steady;
+ }
+ }
+
+ if (!count)
+ d->ticker.stop();
+
+ QObject::timerEvent(event);
+}
diff --git a/demos/embedded/anomaly/src/flickcharm.h b/demos/embedded/anomaly/src/flickcharm.h
new file mode 100644
index 0000000..a0386b8
--- /dev/null
+++ b/demos/embedded/anomaly/src/flickcharm.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demos of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FLICKCHARM_H
+#define FLICKCHARM_H
+
+#include <QObject>
+
+class FlickCharmPrivate;
+class QWidget;
+
+class FlickCharm: public QObject
+{
+ Q_OBJECT
+public:
+ FlickCharm(QObject *parent = 0);
+ ~FlickCharm();
+ void activateOn(QWidget *widget);
+ void deactivateFrom(QWidget *widget);
+ bool eventFilter(QObject *object, QEvent *event);
+
+protected:
+ void timerEvent(QTimerEvent *event);
+
+private:
+ FlickCharmPrivate *d;
+};
+
+#endif // FLICKCHARM_H
diff --git a/demos/embedded/anomaly/src/images/edit-find.png b/demos/embedded/anomaly/src/images/edit-find.png
new file mode 100644
index 0000000..5594785
--- /dev/null
+++ b/demos/embedded/anomaly/src/images/edit-find.png
Binary files differ
diff --git a/demos/embedded/anomaly/src/images/go-next.png b/demos/embedded/anomaly/src/images/go-next.png
new file mode 100644
index 0000000..a68e2db
--- /dev/null
+++ b/demos/embedded/anomaly/src/images/go-next.png
Binary files differ
diff --git a/demos/embedded/anomaly/src/images/go-previous.png b/demos/embedded/anomaly/src/images/go-previous.png
new file mode 100644
index 0000000..c37bc04
--- /dev/null
+++ b/demos/embedded/anomaly/src/images/go-previous.png
Binary files differ
diff --git a/demos/embedded/anomaly/src/images/list-add.png b/demos/embedded/anomaly/src/images/list-add.png
new file mode 100644
index 0000000..2acdd8f
--- /dev/null
+++ b/demos/embedded/anomaly/src/images/list-add.png
Binary files differ
diff --git a/demos/embedded/anomaly/src/images/list-remove.png b/demos/embedded/anomaly/src/images/list-remove.png
new file mode 100644
index 0000000..c5524f7
--- /dev/null
+++ b/demos/embedded/anomaly/src/images/list-remove.png
Binary files differ
diff --git a/demos/embedded/desktopservices/contenttab.cpp b/demos/embedded/desktopservices/contenttab.cpp
new file mode 100644
index 0000000..336d189
--- /dev/null
+++ b/demos/embedded/desktopservices/contenttab.cpp
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// EXTERNAL INCLUDES
+#include <QKeyEvent>
+#include <QMessageBox>
+#include <QListWidget>
+#include <QVBoxLayout>
+#include <QFileInfoList>
+#include <QListWidgetItem>
+
+// INTERNAL INCLUDES
+
+// CLASS HEADER
+#include "contenttab.h"
+
+
+// CONSTRUCTORS & DESTRUCTORS
+ContentTab::ContentTab(QWidget *parent) :
+ QListWidget(parent)
+{
+ setDragEnabled(false);
+ setIconSize(QSize(45, 45));
+}
+
+ContentTab::~ContentTab()
+{
+}
+
+// NEW PUBLIC METHODS
+void ContentTab::init(const QDesktopServices::StandardLocation &location,
+ const QString &filter,
+ const QString &icon)
+{
+ setContentDir(location);
+ QStringList filterList;
+ filterList = filter.split(";");
+ m_ContentDir.setNameFilters(filterList);
+ setIcon(icon);
+
+ connect(this, SIGNAL(itemClicked(QListWidgetItem *)),
+ this, SLOT(openItem(QListWidgetItem *)));
+
+ populateListWidget();
+}
+
+// NEW PROTECTED METHODS
+void ContentTab::setContentDir(const QDesktopServices::StandardLocation &location)
+{
+ m_ContentDir.setPath(QDesktopServices::storageLocation(location));
+}
+
+void ContentTab::setIcon(const QString &icon)
+{
+ m_Icon = QIcon(icon);
+}
+
+void ContentTab::populateListWidget()
+{
+ QFileInfoList fileList = m_ContentDir.entryInfoList(QDir::Files, QDir::Time);
+ foreach(QFileInfo item, fileList) {
+ new QListWidgetItem(m_Icon, itemName(item), this);
+ }
+}
+
+QString ContentTab::itemName(const QFileInfo &item)
+{
+ return QString(item.baseName() + "." + item.completeSuffix());
+}
+
+QUrl ContentTab::itemUrl(QListWidgetItem *item)
+{
+ return QUrl("file:///" + m_ContentDir.absolutePath() + "/" + item->text());
+}
+
+void ContentTab::keyPressEvent(QKeyEvent *event)
+{
+ switch (event->key()) {
+ case Qt::Key_Up:
+ if (currentRow() == 0) {
+ setCurrentRow(count() - 1);
+ } else {
+ setCurrentRow(currentRow() - 1);
+ }
+ break;
+ case Qt::Key_Down:
+ if (currentRow() == (count() - 1)) {
+ setCurrentRow(0);
+ } else {
+ setCurrentRow(currentRow() + 1);
+ }
+ break;
+ case Qt::Key_Select:
+ openItem(currentItem());
+ default:
+ QListWidget::keyPressEvent(event);
+ break;
+ }
+}
+
+void ContentTab::handleErrorInOpen(QListWidgetItem *item)
+{
+ Q_UNUSED(item);
+ QMessageBox::warning(this, tr("Operation Failed"), tr("Unkown error!"), QMessageBox::Close);
+}
+
+// NEW SLOTS
+void ContentTab::openItem(QListWidgetItem *item)
+{
+ bool ret = QDesktopServices::openUrl(itemUrl(item));
+ if (!ret)
+ handleErrorInOpen(item);
+}
+
+
+// End of File
diff --git a/demos/embedded/desktopservices/contenttab.h b/demos/embedded/desktopservices/contenttab.h
new file mode 100644
index 0000000..b5c7392
--- /dev/null
+++ b/demos/embedded/desktopservices/contenttab.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CONTENTTAB_H_
+#define CONTENTTAB_H_
+
+// EXTERNAL INCLUDES
+#include <QDir>
+#include <QUrl>
+#include <QIcon>
+#include <QFileInfo>
+#include <QListWidget>
+#include <QDesktopServices>
+
+// INTERNAL INCLUDES
+
+// FORWARD DECLARATIONS
+QT_BEGIN_NAMESPACE
+class QListWidgetItem;
+QT_END_NAMESPACE
+
+// CLASS DECLARATION
+
+/**
+* ContentTab class.
+*
+* This class implements general purpose tab for media files.
+*/
+class ContentTab : public QListWidget
+{
+ Q_OBJECT
+
+public: // Constructors & Destructors
+ ContentTab(QWidget *parent);
+ virtual ~ContentTab();
+
+public: // New Methods
+ virtual void init(const QDesktopServices::StandardLocation &location,
+ const QString &filter,
+ const QString &icon);
+
+protected: // New Methods
+ virtual void setContentDir(const QDesktopServices::StandardLocation &location);
+ virtual void setIcon(const QString &icon);
+ virtual void populateListWidget();
+ virtual QString itemName(const QFileInfo &item);
+ virtual QUrl itemUrl(QListWidgetItem *item);
+ virtual void handleErrorInOpen(QListWidgetItem *item);
+protected:
+ void keyPressEvent(QKeyEvent *event);
+
+public slots: // New Slots
+ virtual void openItem(QListWidgetItem *item);
+
+protected: // Owned variables
+ QDir m_ContentDir;
+ QIcon m_Icon;
+};
+
+
+#endif // CONTENTTAB_H_
+
+// End of File
diff --git a/demos/embedded/desktopservices/data/Explosion.wav b/demos/embedded/desktopservices/data/Explosion.wav
new file mode 100644
index 0000000..7b140b1
--- /dev/null
+++ b/demos/embedded/desktopservices/data/Explosion.wav
Binary files differ
diff --git a/demos/embedded/desktopservices/data/designer.png b/demos/embedded/desktopservices/data/designer.png
new file mode 100644
index 0000000..0988fce
--- /dev/null
+++ b/demos/embedded/desktopservices/data/designer.png
Binary files differ
diff --git a/demos/embedded/desktopservices/data/monkey_on_64x64.png b/demos/embedded/desktopservices/data/monkey_on_64x64.png
new file mode 100644
index 0000000..990f604
--- /dev/null
+++ b/demos/embedded/desktopservices/data/monkey_on_64x64.png
Binary files differ
diff --git a/demos/embedded/desktopservices/data/sax.mp3 b/demos/embedded/desktopservices/data/sax.mp3
new file mode 100644
index 0000000..0a078b1
--- /dev/null
+++ b/demos/embedded/desktopservices/data/sax.mp3
Binary files differ
diff --git a/demos/embedded/desktopservices/desktopservices.pro b/demos/embedded/desktopservices/desktopservices.pro
new file mode 100644
index 0000000..81fe16d
--- /dev/null
+++ b/demos/embedded/desktopservices/desktopservices.pro
@@ -0,0 +1,22 @@
+TEMPLATE = app
+TARGET =
+INCLUDEPATH += .
+
+HEADERS += desktopwidget.h contenttab.h linktab.h
+SOURCES += desktopwidget.cpp contenttab.cpp linktab.cpp main.cpp
+
+RESOURCES += desktopservices.qrc
+
+music.sources = data/*.mp3 data/*.wav
+music.path = /data/sounds/
+
+image.sources = data/*.png
+image.path = /data/images/
+
+DEPLOYMENT += music image
+
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ TARGET.UID3 = 0xA000C611
+ ICON = ./resources/heart.svg
+}
diff --git a/demos/embedded/desktopservices/desktopservices.qrc b/demos/embedded/desktopservices/desktopservices.qrc
new file mode 100644
index 0000000..410175f
--- /dev/null
+++ b/demos/embedded/desktopservices/desktopservices.qrc
@@ -0,0 +1,8 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/">
+ <file>resources/music.png</file>
+ <file>resources/photo.png</file>
+ <file>resources/browser.png</file>
+ <file>resources/message.png</file>
+</qresource>
+</RCC>
diff --git a/demos/embedded/desktopservices/desktopwidget.cpp b/demos/embedded/desktopservices/desktopwidget.cpp
new file mode 100644
index 0000000..dc2c531
--- /dev/null
+++ b/demos/embedded/desktopservices/desktopwidget.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// EXTERNAL INCLUDES
+#include <QTabWidget>
+#include <QVBoxLayout>
+#include <QDesktopServices>
+
+// INTERNAL INCLUDES
+#include "linktab.h"
+#include "contenttab.h"
+
+// CLASS HEADER
+#include "desktopwidget.h"
+
+// CONSTRUCTORS & DESTRUCTORS
+DesktopWidget::DesktopWidget(QWidget *parent) : QWidget(parent)
+
+{
+ QTabWidget *tabWidget = new QTabWidget(this);
+
+ // Images
+ ContentTab* imageTab = new ContentTab(tabWidget);
+ imageTab->init(QDesktopServices::PicturesLocation,
+ "*.png;*.jpg;*.jpeg;*.bmp;*.gif",
+ ":/resources/photo.png");
+ tabWidget->addTab(imageTab, tr("Images"));
+
+ // Music
+ ContentTab* musicTab = new ContentTab(tabWidget);
+ musicTab->init(QDesktopServices::MusicLocation,
+ "*.wav;*.mp3;*.mp4",
+ ":/resources/music.png");
+ tabWidget->addTab(musicTab, tr("Music"));
+
+ // Links
+ LinkTab* othersTab = new LinkTab(tabWidget);;
+ // Given icon file will be overriden by LinkTab
+ othersTab->init(QDesktopServices::PicturesLocation, "", "");
+ tabWidget->addTab(othersTab, tr("Links"));
+
+ // Layout
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->addWidget(tabWidget);
+ setLayout(layout);
+}
+
+DesktopWidget::~DesktopWidget()
+{
+}
+
+// End of file
diff --git a/demos/embedded/desktopservices/desktopwidget.h b/demos/embedded/desktopservices/desktopwidget.h
new file mode 100644
index 0000000..44448d5
--- /dev/null
+++ b/demos/embedded/desktopservices/desktopwidget.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DESKTOPWIDGET_H_
+#define DESKTOPWIDGET_H_
+
+// EXTERNAL INCLUDES
+#include <QWidget>
+
+// INTERNAL INCLUDES
+
+// FORWARD DECLARATIONS
+QT_BEGIN_NAMESPACE
+class QTabWidget;
+QT_END_NAMESPACE
+
+// CLASS DECLARATION
+/**
+* DesktopWidget class.
+*
+* Implements the main top level widget for QDesktopServices demo app.
+*/
+class DesktopWidget : public QWidget
+{
+ Q_OBJECT
+
+public: // Constructors & Destructors
+ DesktopWidget(QWidget *parent);
+ ~DesktopWidget();
+
+};
+
+#endif // DESKTOPWIDGET_H_
+
+// End of file
diff --git a/demos/embedded/desktopservices/linktab.cpp b/demos/embedded/desktopservices/linktab.cpp
new file mode 100644
index 0000000..657b403
--- /dev/null
+++ b/demos/embedded/desktopservices/linktab.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// EXTERNAL INCLUDES
+#include <QUrl>
+#include <QMessageBox>
+#include <QListWidgetItem>
+
+// INTERNAL INCLUDES
+
+// CLASS HEADER
+#include "linktab.h"
+
+LinkTab::LinkTab(QWidget *parent) :
+ ContentTab(parent)
+{
+}
+
+LinkTab::~LinkTab()
+{
+}
+
+void LinkTab::populateListWidget()
+{
+ m_WebItem = new QListWidgetItem(QIcon(":/resources/browser.png"), tr("Launch Browser"), this);
+ m_MailToItem = new QListWidgetItem(QIcon(":/resources/message.png"), tr("New e-mail"), this);
+}
+
+QUrl LinkTab::itemUrl(QListWidgetItem *item)
+{
+ if (m_WebItem == item) {
+ return QUrl(tr("http://qt.nokia.com"));
+ } else if (m_MailToItem == item) {
+ return QUrl(tr("mailto:qts60-feedback@trolltech.com?subject=QtS60 feedback&body=Hello"));
+ } else {
+ // We should never endup here
+ Q_ASSERT(false);
+ return QUrl();
+ }
+}
+void LinkTab::handleErrorInOpen(QListWidgetItem *item)
+{
+ if (m_MailToItem == item) {
+ QMessageBox::warning(this, tr("Operation Failed"), tr("Please check that you have\ne-mail account defined."), QMessageBox::Close);
+ } else {
+ ContentTab::handleErrorInOpen(item);
+ }
+}
+
+// End of file
diff --git a/demos/embedded/desktopservices/linktab.h b/demos/embedded/desktopservices/linktab.h
new file mode 100644
index 0000000..43ee0ca
--- /dev/null
+++ b/demos/embedded/desktopservices/linktab.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LINKTAB_H_
+#define LINKTAB_H_
+
+// EXTERNAL INCLUDES
+
+// INTERNAL INCLUDES
+#include "contenttab.h"
+
+// FORWARD DECLARATIONS
+QT_BEGIN_NAMESPACE
+class QWidget;
+class QListWidgetItem;
+QT_END_NAMESPACE
+
+// CLASS DECLARATION
+
+/**
+* LinkTab class.
+*
+* This class implements tab for opening http and mailto links.
+*/
+class LinkTab : public ContentTab
+{
+ Q_OBJECT
+
+public: // Constructors & Destructors
+ LinkTab(QWidget *parent);
+ ~LinkTab();
+
+protected: // Derived Methods
+ virtual void populateListWidget();
+ virtual QUrl itemUrl(QListWidgetItem *item);
+ virtual void handleErrorInOpen(QListWidgetItem *item);
+
+private: // Used variables
+ QListWidgetItem *m_WebItem;
+ QListWidgetItem *m_MailToItem;
+
+private: // Owned variables
+
+};
+
+#endif // CONTENTTAB_H_
+
+// End of File
diff --git a/demos/embedded/desktopservices/main.cpp b/demos/embedded/desktopservices/main.cpp
new file mode 100644
index 0000000..c65b355
--- /dev/null
+++ b/demos/embedded/desktopservices/main.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QApplication>
+#include "desktopwidget.h"
+
+int main(int argc, char *argv[])
+{
+ Q_INIT_RESOURCE(desktopservices);
+
+ QApplication app(argc, argv);
+ DesktopWidget* myWidget = new DesktopWidget(0);
+ myWidget->showMaximized();
+
+ return app.exec();
+}
+
+// End of file
diff --git a/demos/embedded/desktopservices/resources/browser.png b/demos/embedded/desktopservices/resources/browser.png
new file mode 100644
index 0000000..28561e1
--- /dev/null
+++ b/demos/embedded/desktopservices/resources/browser.png
Binary files differ
diff --git a/demos/embedded/desktopservices/resources/heart.svg b/demos/embedded/desktopservices/resources/heart.svg
new file mode 100644
index 0000000..ba5f050
--- /dev/null
+++ b/demos/embedded/desktopservices/resources/heart.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) --><svg viewBox="100 200 550 500" height="595.27559pt" id="svg1" inkscape:version="0.40+cvs" sodipodi:docbase="C:\Documents and Settings\Jon Phillips\My Documents\projects\clipart-project\submissions" sodipodi:docname="heart-left-highlight.svg" sodipodi:version="0.32" width="595.27559pt" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg">
+<metadata>
+<rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+<cc:Work rdf:about="">
+<dc:title>Heart Left-Highlight</dc:title>
+<dc:description>This is a normal valentines day heart.</dc:description>
+<dc:subject>
+<rdf:Bag>
+<rdf:li>holiday</rdf:li>
+<rdf:li>valentines</rdf:li>
+<rdf:li></rdf:li>
+<rdf:li>valentine</rdf:li>
+<rdf:li>hash(0x8a091c0)</rdf:li>
+<rdf:li>hash(0x8a0916c)</rdf:li>
+<rdf:li>signs_and_symbols</rdf:li>
+<rdf:li>hash(0x8a091f0)</rdf:li>
+<rdf:li>day</rdf:li>
+</rdf:Bag>
+</dc:subject>
+<dc:publisher>
+<cc:Agent rdf:about="http://www.openclipart.org">
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:publisher>
+<dc:creator>
+<cc:Agent>
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:creator>
+<dc:rights>
+<cc:Agent>
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:rights>
+<dc:date></dc:date>
+<dc:format>image/svg+xml</dc:format>
+<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+<cc:license rdf:resource="http://web.resource.org/cc/PublicDomain"/>
+<dc:language>en</dc:language>
+</cc:Work>
+<cc:License rdf:about="http://web.resource.org/cc/PublicDomain">
+<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+<cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+</cc:License>
+</rdf:RDF>
+</metadata>
+<defs id="defs3"/>
+<sodipodi:namedview bordercolor="#666666" borderopacity="1.0" id="base" inkscape:current-layer="layer1" inkscape:cx="549.40674" inkscape:cy="596.00159" inkscape:document-units="px" inkscape:guide-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="615" inkscape:window-width="866" inkscape:window-x="88" inkscape:window-y="116" inkscape:zoom="0.35000000" pagecolor="#ffffff" showguides="true"/>
+<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
+<path d="M 263.41570,235.14588 C 197.17570,235.14588 143.41575,288.90587 143.41575,355.14588 C 143.41575,489.90139 279.34890,525.23318 371.97820,658.45392 C 459.55244,526.05056 600.54070,485.59932 600.54070,355.14588 C 600.54070,288.90588 546.78080,235.14587 480.54070,235.14588 C 432.49280,235.14588 391.13910,263.51631 371.97820,304.33338 C 352.81740,263.51630 311.46370,235.14587 263.41570,235.14588 z " id="path7" sodipodi:nodetypes="ccccccc" style="fill:#e60000;fill-opacity:1.0000000;stroke:#000000;stroke-width:18.700001;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/>
+<path d="M 265.00000,253.59375 C 207.04033,253.59375 160.00000,300.63407 160.00000,358.59375 C 160.00000,476.50415 278.91857,507.43251 359.96875,624.00000 C 366.52868,614.08205 220.00000,478.47309 220.00000,378.59375 C 220.00000,320.63407 267.04033,273.59375 325.00000,273.59375 C 325.50453,273.59375 325.99718,273.64912 326.50000,273.65625 C 309.22436,261.07286 288.00557,253.59374 265.00000,253.59375 z " id="path220" sodipodi:nodetypes="ccccccc" style="fill:#e6e6e6;fill-opacity:0.64556962;stroke:none;stroke-width:18.700001;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/>
+</g>
+</svg>
diff --git a/demos/embedded/desktopservices/resources/message.png b/demos/embedded/desktopservices/resources/message.png
new file mode 100644
index 0000000..e30052b
--- /dev/null
+++ b/demos/embedded/desktopservices/resources/message.png
Binary files differ
diff --git a/demos/embedded/desktopservices/resources/music.png b/demos/embedded/desktopservices/resources/music.png
new file mode 100644
index 0000000..11a57bb
--- /dev/null
+++ b/demos/embedded/desktopservices/resources/music.png
Binary files differ
diff --git a/demos/embedded/desktopservices/resources/photo.png b/demos/embedded/desktopservices/resources/photo.png
new file mode 100644
index 0000000..5ba15c1
--- /dev/null
+++ b/demos/embedded/desktopservices/resources/photo.png
Binary files differ
diff --git a/demos/embedded/digiflip/digiflip.cpp b/demos/embedded/digiflip/digiflip.cpp
new file mode 100644
index 0000000..96d8e6a
--- /dev/null
+++ b/demos/embedded/digiflip/digiflip.cpp
@@ -0,0 +1,425 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+
+class Digits: public QWidget
+{
+ Q_OBJECT
+
+public:
+
+ enum {
+ Slide,
+ Flip,
+ Rotate
+ };
+
+ Digits(QWidget *parent)
+ : QWidget(parent)
+ , m_number(0)
+ , m_transition(Slide)
+ {
+ setAttribute(Qt::WA_OpaquePaintEvent, true);
+ setAttribute(Qt::WA_NoSystemBackground, true);
+ connect(&m_animator, SIGNAL(frameChanged(int)), SLOT(update()));
+ m_animator.setFrameRange(0, 100);
+ m_animator.setDuration(600);
+ m_animator.setCurveShape(QTimeLine::EaseInOutCurve);
+ }
+
+ void setTransition(int tr) {
+ m_transition = tr;
+ }
+
+ int transition() const {
+ return m_transition;
+ }
+
+ void setNumber(int n) {
+ if (m_number != n) {
+ m_number = qBound(0, n, 99);
+ preparePixmap();
+ update();
+ }
+ }
+
+ void flipTo(int n) {
+ if (m_number != n) {
+ m_number = qBound(0, n, 99);
+ m_lastPixmap = m_pixmap;
+ preparePixmap();
+ m_animator.stop();
+ m_animator.start();
+ }
+ }
+
+protected:
+
+ void drawFrame(QPainter *p, const QRect &rect) {
+ p->setPen(Qt::NoPen);
+ QLinearGradient gradient(rect.topLeft(), rect.bottomLeft());
+ gradient.setColorAt(0.00, QColor(245, 245, 245));
+ gradient.setColorAt(0.49, QColor(192, 192, 192));
+ gradient.setColorAt(0.51, QColor(245, 245, 245));
+ gradient.setColorAt(1.00, QColor(192, 192, 192));
+ p->setBrush(gradient);
+ QRect r = rect;
+ p->drawRoundedRect(r, 15, 15, Qt::RelativeSize);
+ r.adjust(1, 4, -1, -4);
+ p->setPen(QColor(181, 181, 181));
+ p->setBrush(Qt::NoBrush);
+ p->drawRoundedRect(r, 15, 15, Qt::RelativeSize);
+ p->setPen(QColor(159, 159, 159));
+ int y = rect.top() + rect.height() / 2 - 1;
+ p->drawLine(rect.left(), y, rect.right(), y);
+ }
+
+ QPixmap drawDigits(int n, const QRect &rect) {
+
+ int scaleFactor = 2;
+#if defined(Q_OS_SYMBIAN)
+ if (rect.height() > 240)
+ scaleFactor = 1;
+#endif
+
+ QString str = QString::number(n);
+ if (str.length() == 1)
+ str.prepend("0");
+
+ QFont font;
+ font.setFamily("Helvetica");
+ int fontHeight = scaleFactor * 0.55 * rect.height();
+ font.setPixelSize(fontHeight);
+ font.setBold(true);
+
+ QPixmap pixmap(rect.size() * scaleFactor);
+ pixmap.fill(Qt::transparent);
+
+ QLinearGradient gradient(QPoint(0, 0), QPoint(0, pixmap.height()));
+ gradient.setColorAt(0.00, QColor(128, 128, 128));
+ gradient.setColorAt(0.49, QColor(64, 64, 64));
+ gradient.setColorAt(0.51, QColor(128, 128, 128));
+ gradient.setColorAt(1.00, QColor(16, 16, 16));
+
+ QPainter p;
+ p.begin(&pixmap);
+ p.setFont(font);
+ QPen pen;
+ pen.setBrush(QBrush(gradient));
+ p.setPen(pen);
+ p.drawText(pixmap.rect(), Qt::AlignCenter, str);
+ p.end();
+
+ return pixmap.scaledToWidth(width(), Qt::SmoothTransformation);
+ }
+
+ void preparePixmap() {
+ m_pixmap = QPixmap(size());
+ m_pixmap.fill(Qt::transparent);
+ QPainter p;
+ p.begin(&m_pixmap);
+ p.drawPixmap(0, 0, drawDigits(m_number, rect()));
+ p.end();
+ }
+
+ void resizeEvent(QResizeEvent*) {
+ preparePixmap();
+ update();
+ }
+
+ void paintStatic() {
+ QPainter p(this);
+ p.fillRect(rect(), Qt::black);
+
+ int pad = width() / 10;
+ drawFrame(&p, rect().adjusted(pad, pad, -pad, -pad));
+ p.drawPixmap(0, 0, m_pixmap);
+ }
+
+ void paintSlide() {
+ QPainter p(this);
+ p.fillRect(rect(), Qt::black);
+
+ int pad = width() / 10;
+ QRect fr = rect().adjusted(pad, pad, -pad, -pad);
+ drawFrame(&p, fr);
+ p.setClipRect(fr);
+
+ int y = height() * m_animator.currentFrame() / 100;
+ p.drawPixmap(0, y, m_lastPixmap);
+ p.drawPixmap(0, y - height(), m_pixmap);
+ }
+
+ void paintFlip() {
+ QPainter p(this);
+#if !defined(Q_OS_SYMBIAN)
+ p.setRenderHint(QPainter::SmoothPixmapTransform, true);
+ p.setRenderHint(QPainter::Antialiasing, true);
+#endif
+ p.fillRect(rect(), Qt::black);
+
+ int hw = width() / 2;
+ int hh = height() / 2;
+
+ // behind is the new pixmap
+ int pad = width() / 10;
+ QRect fr = rect().adjusted(pad, pad, -pad, -pad);
+ drawFrame(&p, fr);
+ p.drawPixmap(0, 0, m_pixmap);
+
+ int index = m_animator.currentFrame();
+
+ if (index <= 50) {
+
+ // the top part of the old pixmap is flipping
+ int angle = -180 * index / 100;
+ QTransform transform;
+ transform.translate(hw, hh);
+ transform.rotate(angle, Qt::XAxis);
+ p.setTransform(transform);
+ drawFrame(&p, fr.adjusted(-hw, -hh, -hw, -hh));
+ p.drawPixmap(-hw, -hh, m_lastPixmap);
+
+ // the bottom part is still the old pixmap
+ p.resetTransform();
+ p.setClipRect(0, hh, width(), hh);
+ drawFrame(&p, fr);
+ p.drawPixmap(0, 0, m_lastPixmap);
+ } else {
+
+ p.setClipRect(0, hh, width(), hh);
+
+ // the bottom part is still the old pixmap
+ drawFrame(&p, fr);
+ p.drawPixmap(0, 0, m_lastPixmap);
+
+ // the bottom part of the new pixmap is flipping
+ int angle = 180 - 180 * m_animator.currentFrame() / 100;
+ QTransform transform;
+ transform.translate(hw, hh);
+ transform.rotate(angle, Qt::XAxis);
+ p.setTransform(transform);
+ drawFrame(&p, fr.adjusted(-hw, -hh, -hw, -hh));
+ p.drawPixmap(-hw, -hh, m_pixmap);
+
+ }
+
+ }
+
+ void paintRotate() {
+ QPainter p(this);
+
+ int pad = width() / 10;
+ QRect fr = rect().adjusted(pad, pad, -pad, -pad);
+ drawFrame(&p, fr);
+ p.setClipRect(fr);
+
+ int angle1 = -180 * m_animator.currentFrame() / 100;
+ int angle2 = 180 - 180 * m_animator.currentFrame() / 100;
+ int angle = (m_animator.currentFrame() <= 50) ? angle1 : angle2;
+ QPixmap pix = (m_animator.currentFrame() <= 50) ? m_lastPixmap : m_pixmap;
+
+ QTransform transform;
+ transform.translate(width() / 2, height() / 2);
+ transform.rotate(angle, Qt::XAxis);
+
+ p.setTransform(transform);
+ p.setRenderHint(QPainter::SmoothPixmapTransform, true);
+ p.drawPixmap(-width() / 2, -height() / 2, pix);
+ }
+
+ void paintEvent(QPaintEvent *event) {
+ Q_UNUSED(event);
+ if (m_animator.state() == QTimeLine::Running) {
+ if (m_transition == Slide)
+ paintSlide();
+ if (m_transition == Flip)
+ paintFlip();
+ if (m_transition == Rotate)
+ paintRotate();
+ } else {
+ paintStatic();
+ }
+ }
+
+private:
+ int m_number;
+ int m_transition;
+ QPixmap m_pixmap;
+ QPixmap m_lastPixmap;
+ QTimeLine m_animator;
+};
+
+class DigiFlip : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ DigiFlip(QWidget *parent = 0)
+ : QMainWindow(parent)
+ {
+ m_hour = new Digits(this);
+ m_hour->show();
+ m_minute = new Digits(this);
+ m_minute->show();
+
+ QPalette pal = palette();
+ pal.setColor(QPalette::Window, Qt::black);
+ setPalette(pal);
+
+ m_ticker.start(1000, this);
+ QTime t = QTime::currentTime();
+ m_hour->setNumber(t.hour());
+ m_minute->setNumber(t.minute());
+ updateTime();
+
+ QAction *slideAction = new QAction("&Slide", this);
+ QAction *flipAction = new QAction("&Flip", this);
+ QAction *rotateAction = new QAction("&Rotate", this);
+ connect(slideAction, SIGNAL(triggered()), SLOT(chooseSlide()));
+ connect(flipAction, SIGNAL(triggered()), SLOT(chooseFlip()));
+ connect(rotateAction, SIGNAL(triggered()), SLOT(chooseRotate()));
+#if defined(Q_OS_SYMBIAN)
+ menuBar()->addAction(slideAction);
+ menuBar()->addAction(flipAction);
+ menuBar()->addAction(rotateAction);
+#else
+ addAction(slideAction);
+ addAction(flipAction);
+ addAction(rotateAction);
+ setContextMenuPolicy(Qt::ActionsContextMenu);
+#endif
+ }
+
+ void updateTime() {
+ QTime t = QTime::currentTime();
+ m_hour->flipTo(t.hour());
+ m_minute->flipTo(t.minute());
+ QString str = t.toString("hh:mm:ss");
+ str.prepend(": ");
+ if (m_hour->transition() == Digits::Slide)
+ str.prepend("Slide");
+ if (m_hour->transition() == Digits::Flip)
+ str.prepend("Flip");
+ if (m_hour->transition() == Digits::Rotate)
+ str.prepend("Rotate");
+ setWindowTitle(str);
+ }
+
+ void switchTransition(int delta) {
+ int i = (m_hour->transition() + delta + 3) % 3;
+ m_hour->setTransition(i);
+ m_minute->setTransition(i);
+ updateTime();
+ }
+
+protected:
+ void resizeEvent(QResizeEvent*) {
+ int digitsWidth = width() / 2;
+ int digitsHeight = digitsWidth * 1.2;
+
+ int y = (height() - digitsHeight) / 3;
+
+ m_hour->resize(digitsWidth, digitsHeight);
+ m_hour->move(0, y);
+
+ m_minute->resize(digitsWidth, digitsHeight);
+ m_minute->move(width() / 2, y);
+ }
+
+ void timerEvent(QTimerEvent*) {
+ updateTime();
+ }
+
+ void keyPressEvent(QKeyEvent *event) {
+ if (event->key() == Qt::Key_Right) {
+ switchTransition(1);
+ event->accept();
+ }
+ if (event->key() == Qt::Key_Left) {
+ switchTransition(-1);
+ event->accept();
+ }
+ }
+
+private slots:
+ void chooseSlide() {
+ m_hour->setTransition(0);
+ m_minute->setTransition(0);
+ updateTime();
+ }
+
+ void chooseFlip() {
+ m_hour->setTransition(1);
+ m_minute->setTransition(1);
+ updateTime();
+ }
+
+ void chooseRotate() {
+ m_hour->setTransition(2);
+ m_minute->setTransition(2);
+ updateTime();
+ }
+
+private:
+ QBasicTimer m_ticker;
+ Digits *m_hour;
+ Digits *m_minute;
+};
+
+#include "digiflip.moc"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ DigiFlip time;
+#if defined(Q_OS_SYMBIAN)
+ time.showMaximized();
+#else
+ time.resize(320, 240);
+ time.show();
+#endif
+
+ return app.exec();
+}
diff --git a/demos/embedded/digiflip/digiflip.pro b/demos/embedded/digiflip/digiflip.pro
new file mode 100644
index 0000000..6654088
--- /dev/null
+++ b/demos/embedded/digiflip/digiflip.pro
@@ -0,0 +1 @@
+SOURCES = digiflip.cpp
diff --git a/demos/embedded/embedded.pro b/demos/embedded/embedded.pro
index 7428b9f..3d814f7 100644
--- a/demos/embedded/embedded.pro
+++ b/demos/embedded/embedded.pro
@@ -1,9 +1,22 @@
TEMPLATE = subdirs
-SUBDIRS = styledemo
+SUBDIRS = styledemo raycasting flickable digiflip
contains(QT_CONFIG, svg) {
SUBDIRS += embeddedsvgviewer \
- fluidlauncher
+ desktopservices
+ !vxworks:!qnx:SUBDIRS += fluidlauncher
+}
+
+contains(QT_CONFIG, network) {
+ SUBDIRS += lightmaps
+ SUBDIRS += flightinfo
+ contains(QT_CONFIG, svg) {
+ SUBDIRS += weatherinfo
+ }
+}
+
+contains(QT_CONFIG, webkit) {
+ SUBDIRS += anomaly
}
# install
@@ -11,3 +24,4 @@ sources.files = README *.pro
sources.path = $$[QT_INSTALL_DEMOS]/embedded
INSTALLS += sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp
index 949dc9f..9ca3530 100644
--- a/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp
+++ b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp
@@ -143,7 +143,7 @@ void EmbeddedSvgViewer::updateImageScale()
}
-void EmbeddedSvgViewer::resizeEvent ( QResizeEvent * event )
+void EmbeddedSvgViewer::resizeEvent ( QResizeEvent * /* event */ )
{
qreal origZoom = m_zoomLevel;
diff --git a/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro
index 505e607..9401871 100644
--- a/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro
+++ b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro
@@ -9,8 +9,13 @@ RESOURCES += embeddedsvgviewer.qrc
target.path = $$[QT_INSTALL_DEMOS]/embedded/embeddedsvgviewer
sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.html *.svg files
sources.path = $$[QT_INSTALL_DEMOS]/embedded/embeddedsvgviewer
-INSTALLS += target sources
+INSTALLS += target sources
-wince*: {
+wince* {
DEPLOYMENT_PLUGIN += qsvg
}
+
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ TARGET.UID3 = 0xA000A640
+}
diff --git a/demos/embedded/flickable/flickable.cpp b/demos/embedded/flickable/flickable.cpp
new file mode 100644
index 0000000..b2973cc
--- /dev/null
+++ b/demos/embedded/flickable/flickable.cpp
@@ -0,0 +1,284 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "flickable.h"
+
+#include <QtCore>
+#include <QtGui>
+
+class FlickableTicker: QObject
+{
+public:
+ FlickableTicker(Flickable *scroller) {
+ m_scroller = scroller;
+ }
+
+ void start(int interval) {
+ if (!m_timer.isActive())
+ m_timer.start(interval, this);
+ }
+
+ void stop() {
+ m_timer.stop();
+ }
+
+protected:
+ void timerEvent(QTimerEvent *event) {
+ Q_UNUSED(event);
+ m_scroller->tick();
+ }
+
+private:
+ Flickable *m_scroller;
+ QBasicTimer m_timer;
+};
+
+class FlickablePrivate
+{
+public:
+ typedef enum {
+ Steady,
+ Pressed,
+ ManualScroll,
+ AutoScroll,
+ Stop
+ } State;
+
+ State state;
+ int threshold;
+ QPoint pressPos;
+ QPoint offset;
+ QPoint delta;
+ QPoint speed;
+ FlickableTicker *ticker;
+ QTime timeStamp;
+ QWidget *target;
+ QList<QEvent*> ignoreList;
+};
+
+Flickable::Flickable()
+{
+ d = new FlickablePrivate;
+ d->state = FlickablePrivate::Steady;
+ d->threshold = 10;
+ d->ticker = new FlickableTicker(this);
+ d->timeStamp = QTime::currentTime();
+ d->target = 0;
+}
+
+Flickable::~Flickable()
+{
+ delete d;
+}
+
+void Flickable::setThreshold(int th)
+{
+ if (th >= 0)
+ d->threshold = th;
+}
+
+int Flickable::threshold() const
+{
+ return d->threshold;
+}
+
+void Flickable::setAcceptMouseClick(QWidget *target)
+{
+ d->target = target;
+}
+
+static QPoint deaccelerate(const QPoint &speed, int a = 1, int max = 64)
+{
+ int x = qBound(-max, speed.x(), max);
+ int y = qBound(-max, speed.y(), max);
+ x = (x == 0) ? x : (x > 0) ? qMax(0, x - a) : qMin(0, x + a);
+ y = (y == 0) ? y : (y > 0) ? qMax(0, y - a) : qMin(0, y + a);
+ return QPoint(x, y);
+}
+
+void Flickable::handleMousePress(QMouseEvent *event)
+{
+ event->ignore();
+
+ if (event->button() != Qt::LeftButton)
+ return;
+
+ if (d->ignoreList.removeAll(event))
+ return;
+
+ switch (d->state) {
+
+ case FlickablePrivate::Steady:
+ event->accept();
+ d->state = FlickablePrivate::Pressed;
+ d->pressPos = event->pos();
+ break;
+
+ case FlickablePrivate::AutoScroll:
+ event->accept();
+ d->state = FlickablePrivate::Stop;
+ d->speed = QPoint(0, 0);
+ d->pressPos = event->pos();
+ d->offset = scrollOffset();
+ d->ticker->stop();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Flickable::handleMouseRelease(QMouseEvent *event)
+{
+ event->ignore();
+
+ if (event->button() != Qt::LeftButton)
+ return;
+
+ if (d->ignoreList.removeAll(event))
+ return;
+
+ QPoint delta;
+
+ switch (d->state) {
+
+ case FlickablePrivate::Pressed:
+ event->accept();
+ d->state = FlickablePrivate::Steady;
+ if (d->target) {
+ QMouseEvent *event1 = new QMouseEvent(QEvent::MouseButtonPress,
+ d->pressPos, Qt::LeftButton,
+ Qt::LeftButton, Qt::NoModifier);
+ QMouseEvent *event2 = new QMouseEvent(*event);
+ d->ignoreList << event1;
+ d->ignoreList << event2;
+ QApplication::postEvent(d->target, event1);
+ QApplication::postEvent(d->target, event2);
+ }
+ break;
+
+ case FlickablePrivate::ManualScroll:
+ event->accept();
+ delta = event->pos() - d->pressPos;
+ if (d->timeStamp.elapsed() > 100) {
+ d->timeStamp = QTime::currentTime();
+ d->speed = delta - d->delta;
+ d->delta = delta;
+ }
+ d->offset = scrollOffset();
+ d->pressPos = event->pos();
+ if (d->speed == QPoint(0, 0)) {
+ d->state = FlickablePrivate::Steady;
+ } else {
+ d->speed /= 4;
+ d->state = FlickablePrivate::AutoScroll;
+ d->ticker->start(20);
+ }
+ break;
+
+ case FlickablePrivate::Stop:
+ event->accept();
+ d->state = FlickablePrivate::Steady;
+ d->offset = scrollOffset();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Flickable::handleMouseMove(QMouseEvent *event)
+{
+ event->ignore();
+
+ if (!(event->buttons() & Qt::LeftButton))
+ return;
+
+ if (d->ignoreList.removeAll(event))
+ return;
+
+ QPoint delta;
+
+ switch (d->state) {
+
+ case FlickablePrivate::Pressed:
+ case FlickablePrivate::Stop:
+ delta = event->pos() - d->pressPos;
+ if (delta.x() > d->threshold || delta.x() < -d->threshold ||
+ delta.y() > d->threshold || delta.y() < -d->threshold) {
+ d->timeStamp = QTime::currentTime();
+ d->state = FlickablePrivate::ManualScroll;
+ d->delta = QPoint(0, 0);
+ d->pressPos = event->pos();
+ event->accept();
+ }
+ break;
+
+ case FlickablePrivate::ManualScroll:
+ event->accept();
+ delta = event->pos() - d->pressPos;
+ setScrollOffset(d->offset - delta);
+ if (d->timeStamp.elapsed() > 100) {
+ d->timeStamp = QTime::currentTime();
+ d->speed = delta - d->delta;
+ d->delta = delta;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Flickable::tick()
+{
+ if (d->state == FlickablePrivate:: AutoScroll) {
+ d->speed = deaccelerate(d->speed);
+ setScrollOffset(d->offset - d->speed);
+ d->offset = scrollOffset();
+ if (d->speed == QPoint(0, 0)) {
+ d->state = FlickablePrivate::Steady;
+ d->ticker->stop();
+ }
+ } else {
+ d->ticker->stop();
+ }
+}
diff --git a/demos/embedded/flickable/flickable.h b/demos/embedded/flickable/flickable.h
new file mode 100644
index 0000000..16fc4ff
--- /dev/null
+++ b/demos/embedded/flickable/flickable.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FLICKABLE_H
+#define FLICKABLE_H
+
+class QMouseEvent;
+class QPoint;
+class QWidget;
+
+class FlickableTicker;
+class FlickablePrivate;
+
+class Flickable
+{
+public:
+
+ Flickable();
+ virtual ~Flickable();
+
+ void setThreshold(int threshold);
+ int threshold() const;
+
+ void setAcceptMouseClick(QWidget *target);
+
+ void handleMousePress(QMouseEvent *event);
+ void handleMouseMove(QMouseEvent *event);
+ void handleMouseRelease(QMouseEvent *event);
+
+protected:
+ virtual QPoint scrollOffset() const = 0;
+ virtual void setScrollOffset(const QPoint &offset) = 0;
+
+private:
+ void tick();
+
+private:
+ FlickablePrivate *d;
+ friend class FlickableTicker;
+};
+
+#endif // FLICKABLE_H
diff --git a/demos/embedded/flickable/flickable.pro b/demos/embedded/flickable/flickable.pro
new file mode 100644
index 0000000..3c021dd
--- /dev/null
+++ b/demos/embedded/flickable/flickable.pro
@@ -0,0 +1,2 @@
+SOURCES = flickable.cpp main.cpp
+HEADERS = flickable.h
diff --git a/demos/embedded/flickable/main.cpp b/demos/embedded/flickable/main.cpp
new file mode 100644
index 0000000..56aa666
--- /dev/null
+++ b/demos/embedded/flickable/main.cpp
@@ -0,0 +1,233 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+
+#include "flickable.h"
+
+// Returns a list of two-word color names
+static QStringList colorPairs(int max)
+{
+ // capitalize the first letter
+ QStringList colors = QColor::colorNames();
+ colors.removeAll("transparent");
+ int num = colors.count();
+ for (int c = 0; c < num; ++c)
+ colors[c] = colors[c][0].toUpper() + colors[c].mid(1);
+
+ // combine two colors, e.g. "lime skyblue"
+ QStringList combinedColors;
+ for (int i = 0; i < num; ++i)
+ for (int j = 0; j < num; ++j)
+ combinedColors << QString("%1 %2").arg(colors[i]).arg(colors[j]);
+
+ // randomize it
+ colors.clear();
+ while (combinedColors.count()) {
+ int i = qrand() % combinedColors.count();
+ colors << combinedColors[i];
+ combinedColors.removeAt(i);
+ if (colors.count() == max)
+ break;
+ }
+
+ return colors;
+}
+
+class ColorList : public QWidget, public Flickable
+{
+ Q_OBJECT
+
+public:
+ ColorList(QWidget *parent = 0)
+ : QWidget(parent) {
+ m_offset = 0;
+ m_height = QFontMetrics(font()).height() + 5;
+ m_highlight = -1;
+ m_selected = -1;
+
+ QStringList colors = colorPairs(999);
+ for (int i = 0; i < colors.count(); ++i) {
+ QString c = colors[i];
+ QString str;
+ str.sprintf("%4d", i + 1);
+ m_colorNames << (str + " " + c);
+
+ QStringList duet = c.split(' ');
+ m_firstColor << duet[0];
+ m_secondColor << duet[1];
+ }
+
+ setAttribute(Qt::WA_OpaquePaintEvent, true);
+ setAttribute(Qt::WA_NoSystemBackground, true);
+
+ setMouseTracking(true);
+ Flickable::setAcceptMouseClick(this);
+ }
+
+protected:
+ // reimplement from Flickable
+ virtual QPoint scrollOffset() const {
+ return QPoint(0, m_offset);
+ }
+
+ // reimplement from Flickable
+ virtual void setScrollOffset(const QPoint &offset) {
+ int yy = offset.y();
+ if (yy != m_offset) {
+ m_offset = qBound(0, yy, m_height * m_colorNames.count() - height());
+ update();
+ }
+ }
+
+protected:
+ void paintEvent(QPaintEvent *event) {
+ QPainter p(this);
+ p.fillRect(event->rect(), Qt::white);
+ int start = m_offset / m_height;
+ int y = start * m_height - m_offset;
+ if (m_offset <= 0) {
+ start = 0;
+ y = -m_offset;
+ }
+ int end = start + height() / m_height + 1;
+ if (end > m_colorNames.count() - 1)
+ end = m_colorNames.count() - 1;
+ for (int i = start; i <= end; ++i, y += m_height) {
+
+ p.setBrush(Qt::NoBrush);
+ p.setPen(Qt::black);
+ if (i == m_highlight) {
+ p.fillRect(0, y, width(), m_height, QColor(0, 64, 128));
+ p.setPen(Qt::white);
+ }
+ if (i == m_selected) {
+ p.fillRect(0, y, width(), m_height, QColor(0, 128, 240));
+ p.setPen(Qt::white);
+ }
+
+ p.drawText(m_height + 2, y, width(), m_height, Qt::AlignVCenter, m_colorNames[i]);
+
+ p.setPen(Qt::NoPen);
+ p.setBrush(m_firstColor[i]);
+ p.drawRect(1, y + 1, m_height - 2, m_height - 2);
+ p.setBrush(m_secondColor[i]);
+ p.drawRect(5, y + 5, m_height - 11, m_height - 11);
+ }
+ p.end();
+ }
+
+ void keyReleaseEvent(QKeyEvent *event) {
+ if (event->key() == Qt::Key_Down) {
+ m_offset += 20;
+ event->accept();
+ update();
+ return;
+ }
+ if (event->key() == Qt::Key_Up) {
+ m_offset -= 20;
+ event->accept();
+ update();
+ return;
+ }
+ }
+
+ void mousePressEvent(QMouseEvent *event) {
+ Flickable::handleMousePress(event);
+ if (event->isAccepted())
+ return;
+
+ if (event->button() == Qt::LeftButton) {
+ int y = event->pos().y() + m_offset;
+ int i = y / m_height;
+ if (i != m_highlight) {
+ m_highlight = i;
+ m_selected = -1;
+ update();
+ }
+ event->accept();
+ }
+ }
+
+ void mouseMoveEvent(QMouseEvent *event) {
+ Flickable::handleMouseMove(event);
+ }
+
+ void mouseReleaseEvent(QMouseEvent *event) {
+ Flickable::handleMouseRelease(event);
+ if (event->isAccepted())
+ return;
+
+ if (event->button() == Qt::LeftButton) {
+ m_selected = m_highlight;
+ event->accept();
+ update();
+ }
+ }
+
+private:
+ int m_offset;
+ int m_height;
+ int m_highlight;
+ int m_selected;
+ QStringList m_colorNames;
+ QList<QColor> m_firstColor;
+ QList<QColor> m_secondColor;
+};
+
+#include "main.moc"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ ColorList list;
+ list.setWindowTitle("Kinetic Scrolling");
+#ifdef Q_OS_SYMBIAN
+ list.showMaximized();
+#else
+ list.resize(320, 320);
+ list.show();
+#endif
+
+ return app.exec();
+}
diff --git a/demos/embedded/flightinfo/aircraft.png b/demos/embedded/flightinfo/aircraft.png
new file mode 100644
index 0000000..0845cb4
--- /dev/null
+++ b/demos/embedded/flightinfo/aircraft.png
Binary files differ
diff --git a/demos/embedded/flightinfo/flightinfo.cpp b/demos/embedded/flightinfo/flightinfo.cpp
new file mode 100644
index 0000000..29aeced
--- /dev/null
+++ b/demos/embedded/flightinfo/flightinfo.cpp
@@ -0,0 +1,415 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+#include <QtNetwork>
+
+#if defined (Q_OS_SYMBIAN)
+#include "sym_iap_util.h"
+#endif
+
+#include "ui_form.h"
+
+#define FLIGHTVIEW_URL "http://mobile.flightview.com/TrackByFlight.aspx"
+#define FLIGHTVIEW_RANDOM "http://mobile.flightview.com/TrackSampleFlight.aspx"
+
+// strips all invalid constructs that might trip QXmlStreamReader
+static QString sanitized(const QString &xml)
+{
+ QString data = xml;
+
+ // anything up to the html tag
+ int i = data.indexOf("<html");
+ if (i > 0)
+ data.remove(0, i - 1);
+
+ // everything inside the head tag
+ i = data.indexOf("<head");
+ if (i > 0)
+ data.remove(i, data.indexOf("</head>") - i + 7);
+
+ // invalid link for JavaScript code
+ while (true) {
+ i = data.indexOf("onclick=\"gotoUrl(");
+ if (i < 0)
+ break;
+ data.remove(i, data.indexOf('\"', i + 9) - i + 1);
+ }
+
+ // all inline frames
+ while (true) {
+ i = data.indexOf("<iframe");
+ if (i < 0)
+ break;
+ data.remove(i, data.indexOf("</iframe>") - i + 8);
+ }
+
+ // entities
+ data.remove("&nbsp;");
+ data.remove("&copy;");
+
+ return data;
+}
+
+class FlightInfo : public QMainWindow
+{
+ Q_OBJECT
+
+private:
+
+ Ui_Form ui;
+ QUrl m_url;
+ QDate m_searchDate;
+ QPixmap m_map;
+
+public:
+
+ FlightInfo(QMainWindow *parent = 0): QMainWindow(parent) {
+
+ QWidget *w = new QWidget(this);
+ ui.setupUi(w);
+ setCentralWidget(w);
+
+ ui.searchBar->hide();
+ ui.infoBox->hide();
+ connect(ui.searchButton, SIGNAL(clicked()), SLOT(startSearch()));
+ connect(ui.flightEdit, SIGNAL(returnPressed()), SLOT(startSearch()));
+
+ setWindowTitle("Flight Info");
+ QTimer::singleShot(0, this, SLOT(delayedInit()));
+
+ // Rendered from the public-domain vectorized aircraft
+ // http://openclipart.org/media/people/Jarno
+ m_map = QPixmap(":/aircraft.png");
+
+ QAction *searchTodayAction = new QAction("Today's Flight", this);
+ QAction *searchYesterdayAction = new QAction("Yesterday's Flight", this);
+ QAction *randomAction = new QAction("Random Flight", this);
+ connect(searchTodayAction, SIGNAL(triggered()), SLOT(today()));
+ connect(searchYesterdayAction, SIGNAL(triggered()), SLOT(yesterday()));
+ connect(randomAction, SIGNAL(triggered()), SLOT(randomFlight()));
+#if defined(Q_OS_SYMBIAN)
+ menuBar()->addAction(searchTodayAction);
+ menuBar()->addAction(searchYesterdayAction);
+ menuBar()->addAction(randomAction);
+#else
+ addAction(searchTodayAction);
+ addAction(searchYesterdayAction);
+ addAction(randomAction);
+ setContextMenuPolicy(Qt::ActionsContextMenu);
+#endif
+ }
+
+private slots:
+ void delayedInit() {
+#if defined(Q_OS_SYMBIAN)
+ qt_SetDefaultIap();
+#endif
+ }
+
+
+ void handleNetworkData(QNetworkReply *networkReply) {
+ if (!networkReply->error()) {
+ // Assume UTF-8 encoded
+ QByteArray data = networkReply->readAll();
+ QString xml = QString::fromUtf8(data);
+ digest(xml);
+ }
+ networkReply->deleteLater();
+ networkReply->manager()->deleteLater();
+ }
+
+ void handleMapData(QNetworkReply *networkReply) {
+ if (!networkReply->error()) {
+ m_map.loadFromData(networkReply->readAll());
+ update();
+ }
+ networkReply->deleteLater();
+ networkReply->manager()->deleteLater();
+ }
+
+ void today() {
+ QDateTime timestamp = QDateTime::currentDateTime();
+ m_searchDate = timestamp.date();
+ searchFlight();
+ }
+
+ void yesterday() {
+ QDateTime timestamp = QDateTime::currentDateTime();
+ timestamp = timestamp.addDays(-1);
+ m_searchDate = timestamp.date();
+ searchFlight();
+ }
+
+ void searchFlight() {
+ ui.searchBar->show();
+ ui.infoBox->hide();
+ ui.flightStatus->hide();
+ ui.flightName->setText("Enter flight number");
+ m_map = QPixmap();
+ update();
+ }
+
+ void startSearch() {
+ ui.searchBar->hide();
+ QString flight = ui.flightEdit->text().simplified();
+ if (!flight.isEmpty())
+ request(flight, m_searchDate);
+ }
+
+ void randomFlight() {
+ request(QString(), QDate::currentDate());
+ }
+
+public slots:
+
+ void request(const QString &flightCode, const QDate &date) {
+
+ setWindowTitle("Loading...");
+
+ QString code = flightCode.simplified();
+ QString airlineCode = code.left(2).toUpper();
+ QString flightNumber = code.mid(2, code.length());
+
+ ui.flightName->setText("Searching for " + code);
+
+ m_url = QUrl(FLIGHTVIEW_URL);
+ m_url.addEncodedQueryItem("view", "detail");
+ m_url.addEncodedQueryItem("al", QUrl::toPercentEncoding(airlineCode));
+ m_url.addEncodedQueryItem("fn", QUrl::toPercentEncoding(flightNumber));
+ m_url.addEncodedQueryItem("dpdat", QUrl::toPercentEncoding(date.toString("yyyyMMdd")));
+
+ if (code.isEmpty()) {
+ // random flight as sample
+ m_url = QUrl(FLIGHTVIEW_RANDOM);
+ ui.flightName->setText("Getting a random flight...");
+ }
+
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ connect(manager, SIGNAL(finished(QNetworkReply*)),
+ this, SLOT(handleNetworkData(QNetworkReply*)));
+ manager->get(QNetworkRequest(m_url));
+ }
+
+
+private:
+
+ void digest(const QString &content) {
+
+ setWindowTitle("Flight Info");
+ QString data = sanitized(content);
+
+ // do we only get the flight list?
+ // we grab the first leg in the flight list
+ // then fetch another URL for the real flight info
+ int i = data.indexOf("a href=\"?view=detail");
+ if (i > 0) {
+ QString href = data.mid(i, data.indexOf('\"', i + 8) - i + 1);
+ QRegExp regex("dpap=([A-Za-z0-9]+)");
+ regex.indexIn(href);
+ QString airport = regex.cap(1);
+ m_url.addEncodedQueryItem("dpap", QUrl::toPercentEncoding(airport));
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ connect(manager, SIGNAL(finished(QNetworkReply*)),
+ this, SLOT(handleNetworkData(QNetworkReply*)));
+ manager->get(QNetworkRequest(m_url));
+ return;
+ }
+
+ QXmlStreamReader xml(data);
+ bool inFlightName = false;
+ bool inFlightStatus = false;
+ bool inFlightMap = false;
+ bool inFieldName = false;
+ bool inFieldValue = false;
+
+ QString flightName;
+ QString flightStatus;
+ QStringList fieldNames;
+ QStringList fieldValues;
+
+ while (!xml.atEnd()) {
+ xml.readNext();
+
+ if (xml.tokenType() == QXmlStreamReader::StartElement) {
+ QStringRef className = xml.attributes().value("class");
+ inFlightName |= xml.name() == "h1";
+ inFlightStatus |= className == "FlightDetailHeaderStatus";
+ inFlightMap |= className == "flightMap";
+ if (xml.name() == "td" && !className.isEmpty()) {
+ QString cn = className.toString();
+ if (cn.contains("fieldTitle")) {
+ inFieldName = true;
+ fieldNames += QString();
+ fieldValues += QString();
+ }
+ if (cn.contains("fieldValue"))
+ inFieldValue = true;
+ }
+ if (xml.name() == "img" && inFlightMap) {
+ QString src = xml.attributes().value("src").toString();
+ src.prepend("http://mobile.flightview.com");
+ QUrl url = QUrl::fromPercentEncoding(src.toAscii());
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ connect(manager, SIGNAL(finished(QNetworkReply*)),
+ this, SLOT(handleMapData(QNetworkReply*)));
+ manager->get(QNetworkRequest(url));
+ }
+ }
+
+ if (xml.tokenType() == QXmlStreamReader::EndElement) {
+ inFlightName &= xml.name() != "h1";
+ inFlightStatus &= xml.name() != "div";
+ inFlightMap &= xml.name() != "div";
+ inFieldName &= xml.name() != "td";
+ inFieldValue &= xml.name() != "td";
+ }
+
+ if (xml.tokenType() == QXmlStreamReader::Characters) {
+ if (inFlightName)
+ flightName += xml.text();
+ if (inFlightStatus)
+ flightStatus += xml.text();
+ if (inFieldName)
+ fieldNames.last() += xml.text();
+ if (inFieldValue)
+ fieldValues.last() += xml.text();
+ }
+ }
+
+ if (fieldNames.isEmpty()) {
+ QString code = ui.flightEdit->text().simplified().left(10);
+ QString msg = QString("Flight %1 is not found").arg(code);
+ ui.flightName->setText(msg);
+ return;
+ }
+
+ ui.flightName->setText(flightName);
+ flightStatus.remove("Status: ");
+ ui.flightStatus->setText(flightStatus);
+ ui.flightStatus->show();
+
+ QStringList whiteList;
+ whiteList << "Departure";
+ whiteList << "Arrival";
+ whiteList << "Scheduled";
+ whiteList << "Takeoff";
+ whiteList << "Estimated";
+ whiteList << "Term-Gate";
+
+ QString text;
+ text = QString("<table width=%1>").arg(width() - 25);
+ for (int i = 0; i < fieldNames.count(); i++) {
+ QString fn = fieldNames[i].simplified();
+ if (fn.endsWith(':'))
+ fn = fn.left(fn.length() - 1);
+ if (!whiteList.contains(fn))
+ continue;
+
+ QString fv = fieldValues[i].simplified();
+ bool special = false;
+ special |= fn.startsWith("Departure");
+ special |= fn.startsWith("Arrival");
+ text += "<tr>";
+ if (special) {
+ text += "<td align=center colspan=2>";
+ text += "<b><font size=+1>" + fv + "</font></b>";
+ text += "</td>";
+ } else {
+ text += "<td align=right>";
+ text += fn;
+ text += " : ";
+ text += "&nbsp;";
+ text += "</td>";
+ text += "<td>";
+ text += fv;
+ text += "</td>";
+ }
+ text += "</tr>";
+ }
+ text += "</table>";
+ ui.detailedInfo->setText(text);
+ ui.infoBox->show();
+ }
+
+ void resizeEvent(QResizeEvent *event) {
+ Q_UNUSED(event);
+ ui.detailedInfo->setMaximumWidth(width() - 25);
+ }
+
+ void paintEvent(QPaintEvent *event) {
+ QMainWindow::paintEvent(event);
+ QPainter p(this);
+ p.fillRect(rect(), QColor(131, 171, 210));
+ if (!m_map.isNull()) {
+ int x = (width() - m_map.width()) / 2;
+ int space = ui.infoBox->pos().y();
+ if (!ui.infoBox->isVisible())
+ space = height();
+ int top = ui.titleBox->height();
+ int y = qMax(top, (space - m_map.height()) / 2);
+ p.drawPixmap(x, y, m_map);
+ }
+ p.end();
+ }
+
+};
+
+
+#include "flightinfo.moc"
+
+int main(int argc, char **argv)
+{
+ Q_INIT_RESOURCE(flightinfo);
+
+ QApplication app(argc, argv);
+
+ FlightInfo w;
+#if defined(Q_OS_SYMBIAN)
+ w.showMaximized();
+#else
+ w.resize(360, 504);
+ w.show();
+#endif
+
+ return app.exec();
+}
diff --git a/demos/embedded/flightinfo/flightinfo.pro b/demos/embedded/flightinfo/flightinfo.pro
new file mode 100644
index 0000000..5edb175
--- /dev/null
+++ b/demos/embedded/flightinfo/flightinfo.pro
@@ -0,0 +1,12 @@
+TEMPLATE = app
+TARGET = flightinfo
+SOURCES = flightinfo.cpp
+FORMS += form.ui
+RESOURCES = flightinfo.qrc
+QT += network
+
+symbian {
+ HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h
+ LIBS += -lesock -lconnmon
+ TARGET.CAPABILITY = NetworkServices
+}
diff --git a/demos/embedded/flightinfo/flightinfo.qrc b/demos/embedded/flightinfo/flightinfo.qrc
new file mode 100644
index 0000000..babea7e
--- /dev/null
+++ b/demos/embedded/flightinfo/flightinfo.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/" >
+ <file>aircraft.png</file>
+ </qresource>
+</RCC>
diff --git a/demos/embedded/flightinfo/form.ui b/demos/embedded/flightinfo/form.ui
new file mode 100644
index 0000000..3a24c75
--- /dev/null
+++ b/demos/embedded/flightinfo/form.ui
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>220</width>
+ <height>171</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QFrame" name="titleBox">
+ <property name="styleSheet">
+ <string>QFrame {
+background-color: #45629a;
+}
+
+QLabel {
+color: white;
+}</string>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>4</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="flightName">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Powered by FlightView</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="flightStatus">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="styleSheet">
+ <string>background-color: white;
+color: #45629a;</string>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>Ready</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="margin">
+ <number>4</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="searchBar">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="margin">
+ <number>5</number>
+ </property>
+ <item>
+ <widget class="QLineEdit" name="flightEdit">
+ <property name="styleSheet">
+ <string>color: black;
+border: 1px solid black;
+background: white;
+selection-background-color: lightgray;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="searchButton">
+ <property name="styleSheet">
+ <string>color: rgb(255, 255, 255);
+background-color: rgb(85, 85, 255);
+padding: 2px;
+border: 2px solid rgb(0, 0, 127);</string>
+ </property>
+ <property name="text">
+ <string>Search</string>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>58</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QFrame" name="infoBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string>QFrame { border: 2px solid white;
+border-radius: 10px;
+margin: 5px;
+background-color: rgba(69, 98, 154, 192); }</string>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>5</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="detailedInfo">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string>color: white;
+border: none;
+background-color: none;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::NoTextInteraction</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/demos/embedded/fluidlauncher/config_s60/config.xml b/demos/embedded/fluidlauncher/config_s60/config.xml
new file mode 100644
index 0000000..192a2e3
--- /dev/null
+++ b/demos/embedded/fluidlauncher/config_s60/config.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<demolauncher>
+ <demos>
+ <example filename="embeddedsvgviewer" name="SVG Viewer" image="screenshots/embeddedsvgviewer_s60.png" args="/data/images/qt/demos/embeddedsvgviewer/shapes.svg"/>
+ <example filename="styledemo" name="Stylesheets" image="screenshots/styledemo_s60.png"/>
+ <example filename="deform" name="Vector Deformation" image="screenshots/deform.png" args="-small-screen"/>
+ <example filename="pathstroke" name="Path Stroking" image="screenshots/pathstroke.png" args="-small-screen"/>
+ <example filename="wiggly" name="Wiggly Text" image="screenshots/wiggly_s60.png" args="-small-screen"/>
+ <example filename="ftp" name="Ftp Client" image="screenshots/ftp_s60.png"/>
+ <example filename="context2d" name="Context2d" image="screenshots/context2d_s60.png"/>
+ <example filename="saxbookmarks" name="SaxBookmarks" image="screenshots/saxbookmarks_s60.png"/>
+ <example filename="desktopservices" name="Desktop Services" image="screenshots/desktopservices_s60.png"/>
+ <example filename="fridgemagnets" name="Fridge Magnets" image="screenshots/fridgemagnets_s60.png" args="-small-screen"/>
+ <example filename="drilldown" name="Drilldown" image="screenshots/drilldown_s60.png"/>
+ <example filename="softkeys" name="Softkeys" image="screenshots/softkeys_s60.png"/>
+ <example filename="anomaly" name="Anomaly Browser" image="screenshots/anomaly_s60.png"/>
+ <example filename="raycasting" name="Ray casting" image="screenshots/raycasting.png"/>
+ <example filename="lightmaps" name="OpenStreetMap" image="screenshots/lightmaps.png"/>
+ <example filename="flightinfo" name="Flight Info" image="screenshots/flightinfo_s60.png"/>
+ <example filename="weatherinfo" name="Weather Info" image="screenshots/weatherinfo.png"/>
+ <example filename="flickable" name="Kinetic Scrolling" image="screenshots/flickable.png"/>
+ <example filename="digiflip" name="Flipping Clock" image="screenshots/digiflip.png"/>
+ </demos>
+ <slideshow timeout="60000" interval="10000">
+ <imagedir dir="slides"/>
+ </slideshow>
+</demolauncher>
diff --git a/demos/embedded/fluidlauncher/fluidlauncher.cpp b/demos/embedded/fluidlauncher/fluidlauncher.cpp
index f8bd008..3655f27 100644
--- a/demos/embedded/fluidlauncher/fluidlauncher.cpp
+++ b/demos/embedded/fluidlauncher/fluidlauncher.cpp
@@ -39,12 +39,14 @@
**
****************************************************************************/
-#include <QtXml>
+#include <QXmlStreamReader>
#include "fluidlauncher.h"
#define DEFAULT_INPUT_TIMEOUT 10000
+#define SIZING_FACTOR_HEIGHT 6/10
+#define SIZING_FACTOR_WIDTH 6/10
FluidLauncher::FluidLauncher(QStringList* args)
{
@@ -62,7 +64,11 @@ FluidLauncher::FluidLauncher(QStringList* args)
inputTimer->setSingleShot(true);
inputTimer->setInterval(DEFAULT_INPUT_TIMEOUT);
- pictureFlowWidget->setSlideSize(QSize( (screen_size.width()*2)/5, (screen_size.height()*2)/5 ));
+ const int h = screen_size.height() * SIZING_FACTOR_HEIGHT;
+ const int w = screen_size.width() * SIZING_FACTOR_WIDTH;
+ const int hh = qMin(h, w);
+ const int ww = hh / 3 * 2;
+ pictureFlowWidget->setSlideSize(QSize(ww, hh));
bool success;
int configIndex = args->indexOf("-config");
@@ -100,61 +106,97 @@ bool FluidLauncher::loadConfig(QString configPath)
slideShowWidget->clearImages();
- QDomDocument xmlDoc;
- xmlDoc.setContent(&xmlFile, true);
+ xmlFile.open(QIODevice::ReadOnly);
+ QXmlStreamReader reader(&xmlFile);
+ while (!reader.atEnd()) {
+ reader.readNext();
- QDomElement rootElement = xmlDoc.documentElement();
-
- // Process the demos node:
- QDomNodeList demoNodes = rootElement.firstChildElement("demos").elementsByTagName("example");
- for (int i=0; i<demoNodes.size(); i++) {
- QDomElement element = demoNodes.item(i).toElement();
-
- if (element.hasAttribute("filename")) {
- DemoApplication* newDemo = new DemoApplication(
- element.attribute("filename"),
- element.attribute("name", "Unamed Demo"),
- element.attribute("image"),
- element.attribute("args").split(" "));
- demoList.append(newDemo);
+ if (reader.isStartElement()) {
+ if (reader.name() == "demos")
+ parseDemos(reader);
+ else if(reader.name() == "slideshow")
+ parseSlideshow(reader);
}
}
+ if (reader.hasError()) {
+ qDebug() << QString("Error parsing %1 on line %2 column %3: \n%4")
+ .arg(configPath)
+ .arg(reader.lineNumber())
+ .arg(reader.columnNumber())
+ .arg(reader.errorString());
+ }
- // Process the slideshow node:
- QDomElement slideshowElement = rootElement.firstChildElement("slideshow");
+ // Append an exit Item
+ DemoApplication* exitItem = new DemoApplication(QString(), QLatin1String("Exit Embedded Demo"), QString(), QStringList());
+ demoList.append(exitItem);
- if (slideshowElement.hasAttribute("timeout")) {
- bool valid;
- int timeout = slideshowElement.attribute("timeout").toInt(&valid);
- if (valid)
- inputTimer->setInterval(timeout);
- }
+ return true;
+}
- if (slideshowElement.hasAttribute("interval")) {
- bool valid;
- int interval = slideshowElement.attribute("interval").toInt(&valid);
- if (valid)
- slideShowWidget->setSlideInterval(interval);
+
+void FluidLauncher::parseDemos(QXmlStreamReader& reader)
+{
+ while (!reader.atEnd()) {
+ reader.readNext();
+ if (reader.isStartElement() && reader.name() == "example") {
+ QXmlStreamAttributes attrs = reader.attributes();
+ QStringRef filename = attrs.value("filename");
+ if (!filename.isEmpty()) {
+ QStringRef name = attrs.value("name");
+ QStringRef image = attrs.value("image");
+ QStringRef args = attrs.value("args");
+
+ DemoApplication* newDemo = new DemoApplication(
+ filename.toString(),
+ name.isEmpty() ? "Unamed Demo" : name.toString(),
+ image.toString(),
+ args.toString().split(" "));
+ demoList.append(newDemo);
+ }
+ } else if(reader.isEndElement() && reader.name() == "demos") {
+ return;
+ }
}
+}
- for (QDomNode node=slideshowElement.firstChild(); !node.isNull(); node=node.nextSibling()) {
- QDomElement element = node.toElement();
+void FluidLauncher::parseSlideshow(QXmlStreamReader& reader)
+{
+ QXmlStreamAttributes attrs = reader.attributes();
+
+ QStringRef timeout = attrs.value("timeout");
+ bool valid;
+ if (!timeout.isEmpty()) {
+ int t = timeout.toString().toInt(&valid);
+ if (valid)
+ inputTimer->setInterval(t);
+ }
- if (element.tagName() == "imagedir")
- slideShowWidget->addImageDir(element.attribute("dir"));
- else if (element.tagName() == "image")
- slideShowWidget->addImage(element.attribute("image"));
+ QStringRef interval = attrs.value("interval");
+ if (!interval.isEmpty()) {
+ int i = interval.toString().toInt(&valid);
+ if (valid)
+ slideShowWidget->setSlideInterval(i);
}
- // Append an exit Item
- DemoApplication* exitItem = new DemoApplication(QString(), QLatin1String("Exit Embedded Demo"), QString(), QStringList());
- demoList.append(exitItem);
+ while (!reader.atEnd()) {
+ reader.readNext();
+ if (reader.isStartElement()) {
+ QXmlStreamAttributes attrs = reader.attributes();
+ if (reader.name() == "imagedir") {
+ QStringRef dir = attrs.value("dir");
+ slideShowWidget->addImageDir(dir.toString());
+ } else if(reader.name() == "image") {
+ QStringRef image = attrs.value("image");
+ slideShowWidget->addImage(image.toString());
+ }
+ } else if(reader.isEndElement() && reader.name() == "slideshow") {
+ return;
+ }
+ }
- return true;
}
-
void FluidLauncher::populatePictureFlow()
{
pictureFlowWidget->setSlideCount(demoList.count());
diff --git a/demos/embedded/fluidlauncher/fluidlauncher.h b/demos/embedded/fluidlauncher/fluidlauncher.h
index cf6bd3a..a280a2e 100644
--- a/demos/embedded/fluidlauncher/fluidlauncher.h
+++ b/demos/embedded/fluidlauncher/fluidlauncher.h
@@ -44,6 +44,7 @@
#include <QtGui>
#include <QTimer>
+#include <QStringRef>
#include "pictureflow.h"
#include "slideshow.h"
@@ -73,7 +74,8 @@ private:
bool loadConfig(QString configPath);
void populatePictureFlow();
void switchToSlideshow();
-
+ void parseDemos(QXmlStreamReader& reader);
+ void parseSlideshow(QXmlStreamReader& reader);
};
diff --git a/demos/embedded/fluidlauncher/fluidlauncher.pro b/demos/embedded/fluidlauncher/fluidlauncher.pro
index 76d12ad..522ccf3 100644
--- a/demos/embedded/fluidlauncher/fluidlauncher.pro
+++ b/demos/embedded/fluidlauncher/fluidlauncher.pro
@@ -1,8 +1,7 @@
TEMPLATE = app
-TARGET =
+TARGET =
DEPENDPATH += .
INCLUDEPATH += .
-QT += xml
# Input
HEADERS += \
@@ -40,7 +39,8 @@ wince*{
$$QT_BUILD_TREE/demos/pathstroke/$${BUILD_DIR}/pathstroke.exe \
$$QT_BUILD_TREE/examples/graphicsview/elasticnodes/$${BUILD_DIR}/elasticnodes.exe \
$$QT_BUILD_TREE/examples/widgets/wiggly/$${BUILD_DIR}/wiggly.exe \
- $$QT_BUILD_TREE/examples/painting/concentriccircles/$${BUILD_DIR}/concentriccircles.exe
+ $$QT_BUILD_TREE/examples/painting/concentriccircles/$${BUILD_DIR}/concentriccircles.exe \
+ $$QT_BUILD_TREE/examples/draganddrop/$${BUILD_DIR}/fridgemagnets.exe
executables.path = .
@@ -54,3 +54,92 @@ wince*{
DEPLOYMENT_PLUGIN += qgif qjpeg qmng qsvg
}
+
+symbian {
+ load(data_caging_paths)
+
+ TARGET.UID3 = 0xA000A641
+
+ executables.sources = \
+ embeddedsvgviewer.exe \
+ styledemo.exe \
+ deform.exe \
+ pathstroke.exe \
+ wiggly.exe \
+ ftp.exe \
+ saxbookmarks.exe \
+ desktopservices.exe \
+ fridgemagnets.exe \
+ drilldown.exe \
+ softkeys.exe
+
+ contains(QT_CONFIG, webkit): executables.sources += anomaly.exe
+ contains(QT_CONFIG, script): executables.sources += context2d.exe
+
+ executables.path = /sys/bin
+
+ reg_resource.sources = \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/embeddedsvgviewer_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/styledemo_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/deform_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/pathstroke_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/wiggly_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/ftp_reg.rsc\
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/saxbookmarks_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/desktopservices_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/fridgemagnets_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/drilldown_reg.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/softkeys_reg.rsc
+
+ contains(QT_CONFIG, webkit): reg_resource.sources += $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/anomaly_reg.rsc
+ contains(QT_CONFIG, script): reg_resource.sources += $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/context2d_reg.rsc
+
+ reg_resource.path = $$REG_RESOURCE_IMPORT_DIR
+
+ resource.sources = \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/embeddedsvgviewer.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/styledemo.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/deform.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/pathstroke.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/wiggly.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/ftp.rsc\
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/saxbookmarks.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/desktopservices.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/fridgemagnets.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/drilldown.rsc \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/softkeys.rsc
+ contains(QT_CONFIG, webkit): resource.sources += $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/anomaly.rsc
+ contains(QT_CONFIG, script): resource.sources += $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/context2d.rsc
+
+ resource.path = $$APP_RESOURCE_DIR
+
+ mifs.sources = \
+ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C611.mif
+ mifs.path = $$APP_RESOURCE_DIR
+
+ files.sources = $$PWD/screenshots $$PWD/slides
+ files.path = .
+
+ config.sources = $$PWD/config_s60/config.xml
+ config.path = .
+
+ viewerimages.sources = $$PWD/../embeddedsvgviewer/shapes.svg
+ viewerimages.path = /data/images/qt/demos/embeddedsvgviewer
+
+ desktopservices_music.sources = \
+ $$PWD/../desktopservices/data/*.mp3 \
+ $$PWD/../desktopservices/data/*.wav
+ desktopservices_music.path = /data/sounds
+
+ desktopservices_images.sources = $$PWD/../desktopservices/data/*.png
+ desktopservices_images.path = /data/images
+
+ saxbookmarks.sources = $$PWD/../../../examples/xml/saxbookmarks/frank.xbel
+ saxbookmarks.sources += $$PWD/../../../examples/xml/saxbookmarks/jennifer.xbel
+ saxbookmarks.path = /data/qt/saxbookmarks
+
+ DEPLOYMENT += config files executables viewerimages saxbookmarks reg_resource resource \
+ mifs desktopservices_music desktopservices_images
+
+ TARGET.EPOCHEAPSIZE = 100000 20000000
+}
diff --git a/demos/embedded/fluidlauncher/pictureflow.cpp b/demos/embedded/fluidlauncher/pictureflow.cpp
index 16e58a0..9eeaa26 100644
--- a/demos/embedded/fluidlauncher/pictureflow.cpp
+++ b/demos/embedded/fluidlauncher/pictureflow.cpp
@@ -3,6 +3,10 @@
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Nokia Corporation (qt-info@nokia.com)
**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** This is a version of the Pictureflow animated image show widget modified by Nokia.
+**
** This file is part of the ActiveQt framework of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
@@ -82,6 +86,14 @@
#include <QDebug>
+static const int captionFontSize =
+#ifdef Q_WS_S60
+ 8;
+#else
+ 14;
+#endif
+
+
// uncomment this to enable bilinear filtering for texture mapping
// gives much better rendering, at the cost of memory space
// #define PICTUREFLOW_BILINEAR_FILTER
@@ -134,134 +146,134 @@ inline PFreal floatToFixed(float val)
// warning: regenerate the table if IANGLE_MAX and PFREAL_SHIFT are changed!
static const PFreal sinTable[IANGLE_MAX] = {
- 3, 9, 15, 21, 28, 34, 40, 47,
- 53, 59, 65, 72, 78, 84, 90, 97,
- 103, 109, 115, 122, 128, 134, 140, 147,
- 153, 159, 165, 171, 178, 184, 190, 196,
- 202, 209, 215, 221, 227, 233, 239, 245,
- 251, 257, 264, 270, 276, 282, 288, 294,
- 300, 306, 312, 318, 324, 330, 336, 342,
- 347, 353, 359, 365, 371, 377, 383, 388,
- 394, 400, 406, 412, 417, 423, 429, 434,
- 440, 446, 451, 457, 463, 468, 474, 479,
- 485, 491, 496, 501, 507, 512, 518, 523,
- 529, 534, 539, 545, 550, 555, 561, 566,
- 571, 576, 581, 587, 592, 597, 602, 607,
- 612, 617, 622, 627, 632, 637, 642, 647,
- 652, 656, 661, 666, 671, 675, 680, 685,
- 690, 694, 699, 703, 708, 712, 717, 721,
- 726, 730, 735, 739, 743, 748, 752, 756,
- 760, 765, 769, 773, 777, 781, 785, 789,
- 793, 797, 801, 805, 809, 813, 816, 820,
- 824, 828, 831, 835, 839, 842, 846, 849,
- 853, 856, 860, 863, 866, 870, 873, 876,
- 879, 883, 886, 889, 892, 895, 898, 901,
- 904, 907, 910, 913, 916, 918, 921, 924,
- 927, 929, 932, 934, 937, 939, 942, 944,
- 947, 949, 951, 954, 956, 958, 960, 963,
- 965, 967, 969, 971, 973, 975, 977, 978,
- 980, 982, 984, 986, 987, 989, 990, 992,
- 994, 995, 997, 998, 999, 1001, 1002, 1003,
- 1004, 1006, 1007, 1008, 1009, 1010, 1011, 1012,
- 1013, 1014, 1015, 1015, 1016, 1017, 1018, 1018,
- 1019, 1019, 1020, 1020, 1021, 1021, 1022, 1022,
- 1022, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
- 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1022,
- 1022, 1022, 1021, 1021, 1020, 1020, 1019, 1019,
- 1018, 1018, 1017, 1016, 1015, 1015, 1014, 1013,
- 1012, 1011, 1010, 1009, 1008, 1007, 1006, 1004,
- 1003, 1002, 1001, 999, 998, 997, 995, 994,
- 992, 990, 989, 987, 986, 984, 982, 980,
- 978, 977, 975, 973, 971, 969, 967, 965,
- 963, 960, 958, 956, 954, 951, 949, 947,
- 944, 942, 939, 937, 934, 932, 929, 927,
- 924, 921, 918, 916, 913, 910, 907, 904,
- 901, 898, 895, 892, 889, 886, 883, 879,
- 876, 873, 870, 866, 863, 860, 856, 853,
- 849, 846, 842, 839, 835, 831, 828, 824,
- 820, 816, 813, 809, 805, 801, 797, 793,
- 789, 785, 781, 777, 773, 769, 765, 760,
- 756, 752, 748, 743, 739, 735, 730, 726,
- 721, 717, 712, 708, 703, 699, 694, 690,
- 685, 680, 675, 671, 666, 661, 656, 652,
- 647, 642, 637, 632, 627, 622, 617, 612,
- 607, 602, 597, 592, 587, 581, 576, 571,
- 566, 561, 555, 550, 545, 539, 534, 529,
- 523, 518, 512, 507, 501, 496, 491, 485,
- 479, 474, 468, 463, 457, 451, 446, 440,
- 434, 429, 423, 417, 412, 406, 400, 394,
- 388, 383, 377, 371, 365, 359, 353, 347,
- 342, 336, 330, 324, 318, 312, 306, 300,
- 294, 288, 282, 276, 270, 264, 257, 251,
- 245, 239, 233, 227, 221, 215, 209, 202,
- 196, 190, 184, 178, 171, 165, 159, 153,
- 147, 140, 134, 128, 122, 115, 109, 103,
- 97, 90, 84, 78, 72, 65, 59, 53,
- 47, 40, 34, 28, 21, 15, 9, 3,
- -4, -10, -16, -22, -29, -35, -41, -48,
- -54, -60, -66, -73, -79, -85, -91, -98,
- -104, -110, -116, -123, -129, -135, -141, -148,
- -154, -160, -166, -172, -179, -185, -191, -197,
- -203, -210, -216, -222, -228, -234, -240, -246,
- -252, -258, -265, -271, -277, -283, -289, -295,
- -301, -307, -313, -319, -325, -331, -337, -343,
- -348, -354, -360, -366, -372, -378, -384, -389,
- -395, -401, -407, -413, -418, -424, -430, -435,
- -441, -447, -452, -458, -464, -469, -475, -480,
- -486, -492, -497, -502, -508, -513, -519, -524,
- -530, -535, -540, -546, -551, -556, -562, -567,
- -572, -577, -582, -588, -593, -598, -603, -608,
- -613, -618, -623, -628, -633, -638, -643, -648,
- -653, -657, -662, -667, -672, -676, -681, -686,
- -691, -695, -700, -704, -709, -713, -718, -722,
- -727, -731, -736, -740, -744, -749, -753, -757,
- -761, -766, -770, -774, -778, -782, -786, -790,
- -794, -798, -802, -806, -810, -814, -817, -821,
- -825, -829, -832, -836, -840, -843, -847, -850,
- -854, -857, -861, -864, -867, -871, -874, -877,
- -880, -884, -887, -890, -893, -896, -899, -902,
- -905, -908, -911, -914, -917, -919, -922, -925,
- -928, -930, -933, -935, -938, -940, -943, -945,
- -948, -950, -952, -955, -957, -959, -961, -964,
- -966, -968, -970, -972, -974, -976, -978, -979,
- -981, -983, -985, -987, -988, -990, -991, -993,
- -995, -996, -998, -999, -1000, -1002, -1003, -1004,
- -1005, -1007, -1008, -1009, -1010, -1011, -1012, -1013,
- -1014, -1015, -1016, -1016, -1017, -1018, -1019, -1019,
- -1020, -1020, -1021, -1021, -1022, -1022, -1023, -1023,
- -1023, -1024, -1024, -1024, -1024, -1024, -1024, -1024,
- -1024, -1024, -1024, -1024, -1024, -1024, -1024, -1023,
- -1023, -1023, -1022, -1022, -1021, -1021, -1020, -1020,
- -1019, -1019, -1018, -1017, -1016, -1016, -1015, -1014,
- -1013, -1012, -1011, -1010, -1009, -1008, -1007, -1005,
- -1004, -1003, -1002, -1000, -999, -998, -996, -995,
- -993, -991, -990, -988, -987, -985, -983, -981,
- -979, -978, -976, -974, -972, -970, -968, -966,
- -964, -961, -959, -957, -955, -952, -950, -948,
- -945, -943, -940, -938, -935, -933, -930, -928,
- -925, -922, -919, -917, -914, -911, -908, -905,
- -902, -899, -896, -893, -890, -887, -884, -880,
- -877, -874, -871, -867, -864, -861, -857, -854,
- -850, -847, -843, -840, -836, -832, -829, -825,
- -821, -817, -814, -810, -806, -802, -798, -794,
- -790, -786, -782, -778, -774, -770, -766, -761,
- -757, -753, -749, -744, -740, -736, -731, -727,
- -722, -718, -713, -709, -704, -700, -695, -691,
- -686, -681, -676, -672, -667, -662, -657, -653,
- -648, -643, -638, -633, -628, -623, -618, -613,
- -608, -603, -598, -593, -588, -582, -577, -572,
- -567, -562, -556, -551, -546, -540, -535, -530,
- -524, -519, -513, -508, -502, -497, -492, -486,
- -480, -475, -469, -464, -458, -452, -447, -441,
- -435, -430, -424, -418, -413, -407, -401, -395,
- -389, -384, -378, -372, -366, -360, -354, -348,
- -343, -337, -331, -325, -319, -313, -307, -301,
- -295, -289, -283, -277, -271, -265, -258, -252,
- -246, -240, -234, -228, -222, -216, -210, -203,
- -197, -191, -185, -179, -172, -166, -160, -154,
- -148, -141, -135, -129, -123, -116, -110, -104,
- -98, -91, -85, -79, -73, -66, -60, -54,
- -48, -41, -35, -29, -22, -16, -10, -4
+ 3, 9, 15, 21, 28, 34, 40, 47,
+ 53, 59, 65, 72, 78, 84, 90, 97,
+ 103, 109, 115, 122, 128, 134, 140, 147,
+ 153, 159, 165, 171, 178, 184, 190, 196,
+ 202, 209, 215, 221, 227, 233, 239, 245,
+ 251, 257, 264, 270, 276, 282, 288, 294,
+ 300, 306, 312, 318, 324, 330, 336, 342,
+ 347, 353, 359, 365, 371, 377, 383, 388,
+ 394, 400, 406, 412, 417, 423, 429, 434,
+ 440, 446, 451, 457, 463, 468, 474, 479,
+ 485, 491, 496, 501, 507, 512, 518, 523,
+ 529, 534, 539, 545, 550, 555, 561, 566,
+ 571, 576, 581, 587, 592, 597, 602, 607,
+ 612, 617, 622, 627, 632, 637, 642, 647,
+ 652, 656, 661, 666, 671, 675, 680, 685,
+ 690, 694, 699, 703, 708, 712, 717, 721,
+ 726, 730, 735, 739, 743, 748, 752, 756,
+ 760, 765, 769, 773, 777, 781, 785, 789,
+ 793, 797, 801, 805, 809, 813, 816, 820,
+ 824, 828, 831, 835, 839, 842, 846, 849,
+ 853, 856, 860, 863, 866, 870, 873, 876,
+ 879, 883, 886, 889, 892, 895, 898, 901,
+ 904, 907, 910, 913, 916, 918, 921, 924,
+ 927, 929, 932, 934, 937, 939, 942, 944,
+ 947, 949, 951, 954, 956, 958, 960, 963,
+ 965, 967, 969, 971, 973, 975, 977, 978,
+ 980, 982, 984, 986, 987, 989, 990, 992,
+ 994, 995, 997, 998, 999, 1001, 1002, 1003,
+ 1004, 1006, 1007, 1008, 1009, 1010, 1011, 1012,
+ 1013, 1014, 1015, 1015, 1016, 1017, 1018, 1018,
+ 1019, 1019, 1020, 1020, 1021, 1021, 1022, 1022,
+ 1022, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
+ 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1022,
+ 1022, 1022, 1021, 1021, 1020, 1020, 1019, 1019,
+ 1018, 1018, 1017, 1016, 1015, 1015, 1014, 1013,
+ 1012, 1011, 1010, 1009, 1008, 1007, 1006, 1004,
+ 1003, 1002, 1001, 999, 998, 997, 995, 994,
+ 992, 990, 989, 987, 986, 984, 982, 980,
+ 978, 977, 975, 973, 971, 969, 967, 965,
+ 963, 960, 958, 956, 954, 951, 949, 947,
+ 944, 942, 939, 937, 934, 932, 929, 927,
+ 924, 921, 918, 916, 913, 910, 907, 904,
+ 901, 898, 895, 892, 889, 886, 883, 879,
+ 876, 873, 870, 866, 863, 860, 856, 853,
+ 849, 846, 842, 839, 835, 831, 828, 824,
+ 820, 816, 813, 809, 805, 801, 797, 793,
+ 789, 785, 781, 777, 773, 769, 765, 760,
+ 756, 752, 748, 743, 739, 735, 730, 726,
+ 721, 717, 712, 708, 703, 699, 694, 690,
+ 685, 680, 675, 671, 666, 661, 656, 652,
+ 647, 642, 637, 632, 627, 622, 617, 612,
+ 607, 602, 597, 592, 587, 581, 576, 571,
+ 566, 561, 555, 550, 545, 539, 534, 529,
+ 523, 518, 512, 507, 501, 496, 491, 485,
+ 479, 474, 468, 463, 457, 451, 446, 440,
+ 434, 429, 423, 417, 412, 406, 400, 394,
+ 388, 383, 377, 371, 365, 359, 353, 347,
+ 342, 336, 330, 324, 318, 312, 306, 300,
+ 294, 288, 282, 276, 270, 264, 257, 251,
+ 245, 239, 233, 227, 221, 215, 209, 202,
+ 196, 190, 184, 178, 171, 165, 159, 153,
+ 147, 140, 134, 128, 122, 115, 109, 103,
+ 97, 90, 84, 78, 72, 65, 59, 53,
+ 47, 40, 34, 28, 21, 15, 9, 3,
+ -4, -10, -16, -22, -29, -35, -41, -48,
+ -54, -60, -66, -73, -79, -85, -91, -98,
+ -104, -110, -116, -123, -129, -135, -141, -148,
+ -154, -160, -166, -172, -179, -185, -191, -197,
+ -203, -210, -216, -222, -228, -234, -240, -246,
+ -252, -258, -265, -271, -277, -283, -289, -295,
+ -301, -307, -313, -319, -325, -331, -337, -343,
+ -348, -354, -360, -366, -372, -378, -384, -389,
+ -395, -401, -407, -413, -418, -424, -430, -435,
+ -441, -447, -452, -458, -464, -469, -475, -480,
+ -486, -492, -497, -502, -508, -513, -519, -524,
+ -530, -535, -540, -546, -551, -556, -562, -567,
+ -572, -577, -582, -588, -593, -598, -603, -608,
+ -613, -618, -623, -628, -633, -638, -643, -648,
+ -653, -657, -662, -667, -672, -676, -681, -686,
+ -691, -695, -700, -704, -709, -713, -718, -722,
+ -727, -731, -736, -740, -744, -749, -753, -757,
+ -761, -766, -770, -774, -778, -782, -786, -790,
+ -794, -798, -802, -806, -810, -814, -817, -821,
+ -825, -829, -832, -836, -840, -843, -847, -850,
+ -854, -857, -861, -864, -867, -871, -874, -877,
+ -880, -884, -887, -890, -893, -896, -899, -902,
+ -905, -908, -911, -914, -917, -919, -922, -925,
+ -928, -930, -933, -935, -938, -940, -943, -945,
+ -948, -950, -952, -955, -957, -959, -961, -964,
+ -966, -968, -970, -972, -974, -976, -978, -979,
+ -981, -983, -985, -987, -988, -990, -991, -993,
+ -995, -996, -998, -999, -1000, -1002, -1003, -1004,
+ -1005, -1007, -1008, -1009, -1010, -1011, -1012, -1013,
+ -1014, -1015, -1016, -1016, -1017, -1018, -1019, -1019,
+ -1020, -1020, -1021, -1021, -1022, -1022, -1023, -1023,
+ -1023, -1024, -1024, -1024, -1024, -1024, -1024, -1024,
+ -1024, -1024, -1024, -1024, -1024, -1024, -1024, -1023,
+ -1023, -1023, -1022, -1022, -1021, -1021, -1020, -1020,
+ -1019, -1019, -1018, -1017, -1016, -1016, -1015, -1014,
+ -1013, -1012, -1011, -1010, -1009, -1008, -1007, -1005,
+ -1004, -1003, -1002, -1000, -999, -998, -996, -995,
+ -993, -991, -990, -988, -987, -985, -983, -981,
+ -979, -978, -976, -974, -972, -970, -968, -966,
+ -964, -961, -959, -957, -955, -952, -950, -948,
+ -945, -943, -940, -938, -935, -933, -930, -928,
+ -925, -922, -919, -917, -914, -911, -908, -905,
+ -902, -899, -896, -893, -890, -887, -884, -880,
+ -877, -874, -871, -867, -864, -861, -857, -854,
+ -850, -847, -843, -840, -836, -832, -829, -825,
+ -821, -817, -814, -810, -806, -802, -798, -794,
+ -790, -786, -782, -778, -774, -770, -766, -761,
+ -757, -753, -749, -744, -740, -736, -731, -727,
+ -722, -718, -713, -709, -704, -700, -695, -691,
+ -686, -681, -676, -672, -667, -662, -657, -653,
+ -648, -643, -638, -633, -628, -623, -618, -613,
+ -608, -603, -598, -593, -588, -582, -577, -572,
+ -567, -562, -556, -551, -546, -540, -535, -530,
+ -524, -519, -513, -508, -502, -497, -492, -486,
+ -480, -475, -469, -464, -458, -452, -447, -441,
+ -435, -430, -424, -418, -413, -407, -401, -395,
+ -389, -384, -378, -372, -366, -360, -354, -348,
+ -343, -337, -331, -325, -319, -313, -307, -301,
+ -295, -289, -283, -277, -271, -265, -258, -252,
+ -246, -240, -234, -228, -222, -216, -210, -203,
+ -197, -191, -185, -179, -172, -166, -160, -154,
+ -148, -141, -135, -129, -123, -116, -110, -104,
+ -98, -91, -85, -79, -73, -66, -60, -54,
+ -48, -41, -35, -29, -22, -16, -10, -4
};
// this is the program the generate the above table
@@ -304,7 +316,7 @@ inline PFreal fsin(int iangle)
while(iangle < 0)
iangle += IANGLE_MAX;
return sinTable[iangle & IANGLE_MASK];
-}
+}
inline PFreal fcos(int iangle)
{
@@ -420,7 +432,7 @@ PictureFlowPrivate::PictureFlowPrivate(PictureFlow* w)
triggerTimer.setSingleShot(true);
triggerTimer.setInterval(0);
QObject::connect(&triggerTimer, SIGNAL(timeout()), widget, SLOT(render()));
-
+
recalc(200, 200);
resetSlides();
}
@@ -479,7 +491,7 @@ void PictureFlowPrivate::setSlide(int index, const QImage& image)
slideImages[index] = image;
surfaceCache.remove(index);
triggerRender();
- }
+ }
}
int PictureFlowPrivate::getTarget() const
@@ -490,7 +502,7 @@ int PictureFlowPrivate::getTarget() const
int PictureFlowPrivate::currentSlide() const
{
return centerIndex;
-}
+}
void PictureFlowPrivate::setCurrentSlide(int index)
{
@@ -599,7 +611,7 @@ static QImage prepareSurface(QImage img, int w, int h)
int hofs = h / 3;
// offscreen buffer: black is sweet
- QImage result(hs, w, QImage::Format_RGB16);
+ QImage result(hs, w, QImage::Format_RGB16);
result.fill(0);
// transpose the image, this is to speed-up the rendering
@@ -676,7 +688,7 @@ QImage* PictureFlowPrivate::surface(int slideIndex)
}
-// Schedules rendering the slides. Call this function to avoid immediate
+// Schedules rendering the slides. Call this function to avoid immediate
// render and thus cause less flicker.
void PictureFlowPrivate::triggerRender()
{
@@ -704,7 +716,7 @@ void PictureFlowPrivate::render()
QRect rs = renderSlide(leftSlides[index], alpha, 0, c1-1);
if(!rs.isEmpty())
c1 = rs.left();
- }
+ }
for(int index = 0; index < nright-1; index++)
{
int alpha = (index < nright-2) ? 256 : 128;
@@ -716,14 +728,14 @@ void PictureFlowPrivate::render()
QPainter painter;
painter.begin(&buffer);
- QFont font("Arial", 14);
+ QFont font("Arial", captionFontSize);
font.setBold(true);
painter.setFont(font);
painter.setPen(Qt::white);
//painter.setPen(QColor(255,255,255,127));
if (!captions.isEmpty())
- painter.drawText( QRect(0,0, buffer.width(), (buffer.height() - slideSize().height())/2),
+ painter.drawText( QRect(0,0, buffer.width(), (buffer.height() - slideSize().height())/4),
Qt::AlignCenter, captions[centerIndex]);
painter.end();
@@ -746,7 +758,7 @@ void PictureFlowPrivate::render()
c1 = rs.left();
alpha = (step > 0) ? 256-fade/2 : 256;
- }
+ }
for(int index = 0; index < nright; index++)
{
int alpha = (index < nright-2) ? 256 : 128;
@@ -761,26 +773,23 @@ void PictureFlowPrivate::render()
c2 = rs.right();
}
-
-
QPainter painter;
painter.begin(&buffer);
- QFont font("Arial", 14);
+ QFont font("Arial", captionFontSize);
font.setBold(true);
painter.setFont(font);
int leftTextIndex = (step>0) ? centerIndex : centerIndex-1;
painter.setPen(QColor(255,255,255, (255-fade) ));
- painter.drawText( QRect(0,0, buffer.width(), (buffer.height() - slideSize().height())/2),
+ painter.drawText( QRect(0,0, buffer.width(), (buffer.height() - slideSize().height())/4),
Qt::AlignCenter, captions[leftTextIndex]);
painter.setPen(QColor(255,255,255, fade));
- painter.drawText( QRect(0,0, buffer.width(), (buffer.height() - slideSize().height())/2),
+ painter.drawText( QRect(0,0, buffer.width(), (buffer.height() - slideSize().height())/4),
Qt::AlignCenter, captions[leftTextIndex+1]);
-
painter.end();
}
}
@@ -810,8 +819,8 @@ int col1, int col2)
if(!src)
return QRect();
- QRect rect(0, 0, 0, 0);
-
+ QRect rect(0, 0, 0, 0);
+
#ifdef PICTUREFLOW_BILINEAR_FILTER
int sw = src->height() / BILINEAR_STRETCH_HOR;
int sh = src->width() / BILINEAR_STRETCH_VER;
@@ -876,10 +885,10 @@ int col1, int col2)
if(column < 0)
continue;
- rect.setRight(x);
+ rect.setRight(x);
if(!flag)
rect.setLeft(x);
- flag = true;
+ flag = true;
int y1 = h/2;
int y2 = y1+ 1;
@@ -909,7 +918,7 @@ int col1, int col2)
y2++;
pixel1 -= pixelstep;
pixel2 += pixelstep;
- }
+ }
else
while((y1 >= 0) && (y2 < h) && (p1 >= 0))
{
@@ -935,8 +944,8 @@ int col1, int col2)
y2++;
pixel1 -= pixelstep;
pixel2 += pixelstep;
- }
- }
+ }
+ }
rect.setTop(0);
rect.setBottom(h-1);
@@ -1014,7 +1023,7 @@ void PictureFlowPrivate::updateAnimation()
const int max = 2 * 65536;
int fi = slideFrame;
- fi -= (target << 16);
+ fi -= (target << 16);
if(fi < 0)
fi = -fi;
fi = qMin(fi, max);
@@ -1029,7 +1038,7 @@ void PictureFlowPrivate::updateAnimation()
int pos = slideFrame & 0xffff;
int neg = 65536 - pos;
int tick = (step < 0) ? neg : pos;
- PFreal ftick = (tick * PFREAL_ONE) >> 16;
+ PFreal ftick = (tick * PFREAL_ONE) >> 16;
// the leftmost and rightmost slide must fade away
fade = pos / 256;
@@ -1059,7 +1068,7 @@ void PictureFlowPrivate::updateAnimation()
step = 0;
fade = 256;
return;
- }
+ }
for(int i = 0; i < leftSlides.count(); i++)
{
@@ -1090,7 +1099,7 @@ void PictureFlowPrivate::updateAnimation()
leftSlides[0].angle = (pos * itilt) >> 16;
leftSlides[0].cx = -fmul(offsetX, ftick);
leftSlides[0].cy = fmul(offsetY, ftick);
- }
+ }
// must change direction ?
if(target < index) if(step > 0)
@@ -1126,7 +1135,7 @@ PictureFlow::PictureFlow(QWidget* parent): QWidget(parent)
PictureFlow::~PictureFlow()
{
delete d;
-}
+}
int PictureFlow::slideCount() const
{
@@ -1226,7 +1235,7 @@ void PictureFlow::keyPressEvent(QKeyEvent* event)
{
if(event->modifiers() == Qt::ControlModifier)
showSlide(currentSlide()-10);
- else
+ else
showPrevious();
event->accept();
return;
@@ -1242,6 +1251,12 @@ void PictureFlow::keyPressEvent(QKeyEvent* event)
return;
}
+ if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Select) {
+ emit itemActivated(d->getTarget());
+ event->accept();
+ return;
+ }
+
event->ignore();
}
@@ -1276,7 +1291,7 @@ void PictureFlow::mouseMoveEvent(QMouseEvent* event)
{
speed = ((qAbs(event->pos().x()-d->previousPos.x())*1000) / d->previousPosTimestamp.elapsed())
/ (d->buffer.width() / 10);
-
+
if (speed < SPEED_LOWER_THRESHOLD)
speed = SPEED_LOWER_THRESHOLD;
else if (speed > SPEED_UPPER_LIMIT)
@@ -1284,19 +1299,17 @@ void PictureFlow::mouseMoveEvent(QMouseEvent* event)
else {
speed = SPEED_LOWER_THRESHOLD + (speed / 3);
// qDebug() << "ACCELERATION ENABLED Speed = " << speed << ", Distance = " << distanceMovedSinceLastEvent;
-
}
}
-
// qDebug() << "Speed = " << speed;
// int incr = ((event->pos().x() - d->previousPos.x())/10) * speed;
-
+
// qDebug() << "Incremented by " << incr;
int incr = (distanceMovedSinceLastEvent * speed);
-
+
//qDebug() << "(distanceMovedSinceLastEvent * speed) = " << incr;
if (incr > d->pixelsToMovePerSlide*2) {
@@ -1326,8 +1339,6 @@ void PictureFlow::mouseMoveEvent(QMouseEvent* event)
d->pixelDistanceMoved = 0;
*/
}
-
-
}
d->previousPos = event->pos();
diff --git a/demos/embedded/fluidlauncher/pictureflow.h b/demos/embedded/fluidlauncher/pictureflow.h
index 747f09c..7ae2a88 100644
--- a/demos/embedded/fluidlauncher/pictureflow.h
+++ b/demos/embedded/fluidlauncher/pictureflow.h
@@ -3,7 +3,7 @@
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the ActiveQt framework of the Qt Toolkit.
+** This is a version of the Pictureflow animated image show widget modified by Nokia.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
@@ -35,6 +35,7 @@
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
** $QT_END_LICENSE$
**
+**
****************************************************************************/
/*
@@ -71,15 +72,15 @@
class PictureFlowPrivate;
/*!
- Class PictureFlow implements an image show widget with animation effect
- like Apple's CoverFlow (in iTunes and iPod). Images are arranged in form
- of slides, one main slide is shown at the center with few slides on
- the left and right sides of the center slide. When the next or previous
- slide is brought to the front, the whole slides flow to the right or
- the right with smooth animation effect; until the new slide is finally
+ Class PictureFlow implements an image show widget with animation effect
+ like Apple's CoverFlow (in iTunes and iPod). Images are arranged in form
+ of slides, one main slide is shown at the center with few slides on
+ the left and right sides of the center slide. When the next or previous
+ slide is brought to the front, the whole slides flow to the right or
+ the right with smooth animation effect; until the new slide is finally
placed at the center.
- */
+ */
class PictureFlow : public QWidget
{
Q_OBJECT
@@ -92,7 +93,7 @@ Q_OBJECT
public:
/*!
Creates a new PictureFlow widget.
- */
+ */
PictureFlow(QWidget* parent = 0);
/*!
@@ -112,17 +113,17 @@ public:
/*!
Returns the dimension of each slide (in pixels).
- */
+ */
QSize slideSize() const;
/*!
Sets the dimension of each slide (in pixels).
- */
+ */
void setSlideSize(QSize size);
/*!
Sets the zoom factor (in percent).
- */
+ */
void setZoomFactor(int zoom);
/*!
@@ -139,13 +140,13 @@ public:
Returns QImage of specified slide.
This function will be called only whenever necessary, e.g. the 100th slide
will not be retrived when only the first few slides are visible.
- */
+ */
virtual QImage slide(int index) const;
/*!
Sets an image for specified slide. If the slide already exists,
it will be replaced.
- */
+ */
virtual void setSlide(int index, const QImage& image);
virtual void setSlideCaption(int index, QString caption);
@@ -153,20 +154,20 @@ public:
/*!
Sets a pixmap for specified slide. If the slide already exists,
it will be replaced.
- */
+ */
virtual void setSlide(int index, const QPixmap& pixmap);
/*!
Returns the index of slide currently shown in the middle of the viewport.
- */
+ */
int currentSlide() const;
public slots:
/*!
- Sets slide to be shown in the middle of the viewport. No animation
+ Sets slide to be shown in the middle of the viewport. No animation
effect will be produced, unlike using showSlide.
- */
+ */
void setCurrentSlide(int index);
/*!
diff --git a/demos/embedded/fluidlauncher/screenshots/anomaly_s60.png b/demos/embedded/fluidlauncher/screenshots/anomaly_s60.png
new file mode 100644
index 0000000..8d537f4
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/anomaly_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/context2d_s60.png b/demos/embedded/fluidlauncher/screenshots/context2d_s60.png
new file mode 100644
index 0000000..c7225c7
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/context2d_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/desktopservices_s60.png b/demos/embedded/fluidlauncher/screenshots/desktopservices_s60.png
new file mode 100644
index 0000000..a429be3
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/desktopservices_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/digiflip.png b/demos/embedded/fluidlauncher/screenshots/digiflip.png
new file mode 100644
index 0000000..117b61b
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/digiflip.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/drilldown_s60.png b/demos/embedded/fluidlauncher/screenshots/drilldown_s60.png
new file mode 100644
index 0000000..d4fd44f
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/drilldown_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/embeddedsvgviewer_s60.png b/demos/embedded/fluidlauncher/screenshots/embeddedsvgviewer_s60.png
new file mode 100644
index 0000000..74f4ad1
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/embeddedsvgviewer_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/flickable.png b/demos/embedded/fluidlauncher/screenshots/flickable.png
new file mode 100644
index 0000000..7080fc1
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/flickable.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/flightinfo_s60.png b/demos/embedded/fluidlauncher/screenshots/flightinfo_s60.png
new file mode 100644
index 0000000..8a304eb
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/flightinfo_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/fridgemagnets_s60.png b/demos/embedded/fluidlauncher/screenshots/fridgemagnets_s60.png
new file mode 100644
index 0000000..d31875d
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/fridgemagnets_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/ftp_s60.png b/demos/embedded/fluidlauncher/screenshots/ftp_s60.png
new file mode 100644
index 0000000..5858daf
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/ftp_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/lightmaps.png b/demos/embedded/fluidlauncher/screenshots/lightmaps.png
new file mode 100644
index 0000000..7cbe2e4
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/lightmaps.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/raycasting.png b/demos/embedded/fluidlauncher/screenshots/raycasting.png
new file mode 100644
index 0000000..d3c86e9
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/raycasting.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/saxbookmarks_s60.png b/demos/embedded/fluidlauncher/screenshots/saxbookmarks_s60.png
new file mode 100644
index 0000000..54b6321
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/saxbookmarks_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/softkeys_s60.png b/demos/embedded/fluidlauncher/screenshots/softkeys_s60.png
new file mode 100644
index 0000000..df090e2
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/softkeys_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/styledemo_s60.png b/demos/embedded/fluidlauncher/screenshots/styledemo_s60.png
new file mode 100644
index 0000000..57480fb
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/styledemo_s60.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/weatherinfo.png b/demos/embedded/fluidlauncher/screenshots/weatherinfo.png
new file mode 100644
index 0000000..b18608d
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/weatherinfo.png
Binary files differ
diff --git a/demos/embedded/fluidlauncher/screenshots/wiggly_s60.png b/demos/embedded/fluidlauncher/screenshots/wiggly_s60.png
new file mode 100644
index 0000000..9c4cab3
--- /dev/null
+++ b/demos/embedded/fluidlauncher/screenshots/wiggly_s60.png
Binary files differ
diff --git a/demos/embedded/lightmaps/lightmaps.cpp b/demos/embedded/lightmaps/lightmaps.cpp
new file mode 100644
index 0000000..442716c
--- /dev/null
+++ b/demos/embedded/lightmaps/lightmaps.cpp
@@ -0,0 +1,579 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+#include <QtNetwork>
+
+#if defined (Q_OS_SYMBIAN)
+#include "sym_iap_util.h"
+#endif
+
+#include <math.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+// how long (milliseconds) the user need to hold (after a tap on the screen)
+// before triggering the magnifying glass feature
+// 701, a prime number, is the sum of 229, 233, 239
+// (all three are also prime numbers, consecutive!)
+#define HOLD_TIME 701
+
+// maximum size of the magnifier
+// Hint: see above to find why I picked this one :)
+#define MAX_MAGNIFIER 229
+
+uint qHash(const QPoint& p)
+{
+ return p.x() * 17 ^ p.y();
+}
+
+// tile size in pixels
+const int tdim = 256;
+
+QPointF tileForCoordinate(qreal lat, qreal lng, int zoom)
+{
+ qreal zn = static_cast<qreal>(1 << zoom);
+ qreal tx = (lng + 180.0) / 360.0;
+ qreal ty = (1.0 - log(tan(lat * M_PI / 180.0) +
+ 1.0 / cos(lat * M_PI / 180.0)) / M_PI) / 2.0;
+ return QPointF(tx * zn, ty * zn);
+}
+
+qreal longitudeFromTile(qreal tx, int zoom)
+{
+ qreal zn = static_cast<qreal>(1 << zoom);
+ qreal lat = tx / zn * 360.0 - 180.0;
+ return lat;
+}
+
+qreal latitudeFromTile(qreal ty, int zoom)
+{
+ qreal zn = static_cast<qreal>(1 << zoom);
+ qreal n = M_PI - 2 * M_PI * ty / zn;
+ qreal lng = 180.0 / M_PI * atan(0.5 * (exp(n) - exp(-n)));
+ return lng;
+}
+
+class SlippyMap: public QObject
+{
+ Q_OBJECT
+
+public:
+ int width;
+ int height;
+ int zoom;
+ qreal latitude;
+ qreal longitude;
+
+ SlippyMap(QObject *parent = 0)
+ : QObject(parent)
+ , width(400)
+ , height(300)
+ , zoom(15)
+ , latitude(59.9138204)
+ , longitude(10.7387413) {
+ m_emptyTile = QPixmap(tdim, tdim);
+ m_emptyTile.fill(Qt::lightGray);
+
+ QNetworkDiskCache *cache = new QNetworkDiskCache;
+ cache->setCacheDirectory(QDesktopServices::storageLocation
+ (QDesktopServices::CacheLocation));
+ m_manager.setCache(cache);
+ connect(&m_manager, SIGNAL(finished(QNetworkReply*)),
+ this, SLOT(handleNetworkData(QNetworkReply*)));
+ }
+
+ void invalidate() {
+ if (width <= 0 || height <= 0)
+ return;
+
+ QPointF ct = tileForCoordinate(latitude, longitude, zoom);
+ qreal tx = ct.x();
+ qreal ty = ct.y();
+
+ // top-left corner of the center tile
+ int xp = width / 2 - (tx - floor(tx)) * tdim;
+ int yp = height / 2 - (ty - floor(ty)) * tdim;
+
+ // first tile vertical and horizontal
+ int xa = (xp + tdim - 1) / tdim;
+ int ya = (yp + tdim - 1) / tdim;
+ int xs = static_cast<int>(tx) - xa;
+ int ys = static_cast<int>(ty) - ya;
+
+ // offset for top-left tile
+ m_offset = QPoint(xp - xa * tdim, yp - ya * tdim);
+
+ // last tile vertical and horizontal
+ int xe = static_cast<int>(tx) + (width - xp - 1) / tdim;
+ int ye = static_cast<int>(ty) + (height - yp - 1) / tdim;
+
+ // build a rect
+ m_tilesRect = QRect(xs, ys, xe - xs + 1, ye - ys + 1);
+
+ if (m_url.isEmpty())
+ download();
+
+ emit updated(QRect(0, 0, width, height));
+ }
+
+ void render(QPainter *p, const QRect &rect) {
+ for (int x = 0; x <= m_tilesRect.width(); ++x)
+ for (int y = 0; y <= m_tilesRect.height(); ++y) {
+ QPoint tp(x + m_tilesRect.left(), y + m_tilesRect.top());
+ QRect box = tileRect(tp);
+ if (rect.intersects(box)) {
+ if (m_tilePixmaps.contains(tp))
+ p->drawPixmap(box, m_tilePixmaps.value(tp));
+ else
+ p->drawPixmap(box, m_emptyTile);
+ }
+ }
+ }
+
+ void pan(const QPoint &delta) {
+ QPointF dx = QPointF(delta) / qreal(tdim);
+ QPointF center = tileForCoordinate(latitude, longitude, zoom) - dx;
+ latitude = latitudeFromTile(center.y(), zoom);
+ longitude = longitudeFromTile(center.x(), zoom);
+ invalidate();
+ }
+
+private slots:
+
+ void handleNetworkData(QNetworkReply *reply) {
+ QImage img;
+ QPoint tp = reply->request().attribute(QNetworkRequest::User).toPoint();
+ QUrl url = reply->url();
+ if (!reply->error())
+ if (!img.load(reply, 0))
+ img = QImage();
+ reply->deleteLater();
+ m_tilePixmaps[tp] = QPixmap::fromImage(img);
+ if (img.isNull())
+ m_tilePixmaps[tp] = m_emptyTile;
+ emit updated(tileRect(tp));
+
+ // purge unused spaces
+ QRect bound = m_tilesRect.adjusted(-2, -2, 2, 2);
+ foreach(QPoint tp, m_tilePixmaps.keys())
+ if (!bound.contains(tp))
+ m_tilePixmaps.remove(tp);
+
+ download();
+ }
+
+ void download() {
+ QPoint grab(0, 0);
+ for (int x = 0; x <= m_tilesRect.width(); ++x)
+ for (int y = 0; y <= m_tilesRect.height(); ++y) {
+ QPoint tp = m_tilesRect.topLeft() + QPoint(x, y);
+ if (!m_tilePixmaps.contains(tp)) {
+ grab = tp;
+ break;
+ }
+ }
+ if (grab == QPoint(0, 0)) {
+ m_url = QUrl();
+ return;
+ }
+
+ QString path = "http://tile.openstreetmap.org/%1/%2/%3.png";
+ m_url = QUrl(path.arg(zoom).arg(grab.x()).arg(grab.y()));
+ QNetworkRequest request;
+ request.setUrl(m_url);
+ request.setRawHeader("User-Agent", "Nokia (Qt) Graphics Dojo 1.0");
+ request.setAttribute(QNetworkRequest::User, QVariant(grab));
+ m_manager.get(request);
+ }
+
+signals:
+ void updated(const QRect &rect);
+
+protected:
+ QRect tileRect(const QPoint &tp) {
+ QPoint t = tp - m_tilesRect.topLeft();
+ int x = t.x() * tdim + m_offset.x();
+ int y = t.y() * tdim + m_offset.y();
+ return QRect(x, y, tdim, tdim);
+ }
+
+private:
+ QPoint m_offset;
+ QRect m_tilesRect;
+ QPixmap m_emptyTile;
+ QHash<QPoint, QPixmap> m_tilePixmaps;
+ QNetworkAccessManager m_manager;
+ QUrl m_url;
+};
+
+class LightMaps: public QWidget
+{
+ Q_OBJECT
+
+public:
+ LightMaps(QWidget *parent = 0)
+ : QWidget(parent)
+ , pressed(false)
+ , snapped(false)
+ , zoomed(false)
+ , invert(false) {
+ m_normalMap = new SlippyMap(this);
+ m_largeMap = new SlippyMap(this);
+ connect(m_normalMap, SIGNAL(updated(QRect)), SLOT(updateMap(QRect)));
+ connect(m_largeMap, SIGNAL(updated(QRect)), SLOT(update()));
+ }
+
+ void setCenter(qreal lat, qreal lng) {
+ m_normalMap->latitude = lat;
+ m_normalMap->longitude = lng;
+ m_normalMap->invalidate();
+ m_largeMap->invalidate();
+ }
+
+public slots:
+ void toggleNightMode() {
+ invert = !invert;
+ update();
+ }
+
+private slots:
+ void updateMap(const QRect &r) {
+ update(r);
+ }
+
+protected:
+
+ void activateZoom() {
+ zoomed = true;
+ tapTimer.stop();
+ m_largeMap->zoom = m_normalMap->zoom + 1;
+ m_largeMap->width = m_normalMap->width * 2;
+ m_largeMap->height = m_normalMap->height * 2;
+ m_largeMap->latitude = m_normalMap->latitude;
+ m_largeMap->longitude = m_normalMap->longitude;
+ m_largeMap->invalidate();
+ update();
+ }
+
+ void resizeEvent(QResizeEvent *) {
+ m_normalMap->width = width();
+ m_normalMap->height = height();
+ m_normalMap->invalidate();
+ m_largeMap->width = m_normalMap->width * 2;
+ m_largeMap->height = m_normalMap->height * 2;
+ m_largeMap->invalidate();
+ }
+
+ void paintEvent(QPaintEvent *event) {
+ QPainter p;
+ p.begin(this);
+ m_normalMap->render(&p, event->rect());
+ p.setPen(Qt::black);
+#if defined(Q_OS_SYMBIAN)
+ QFont font = p.font();
+ font.setPixelSize(13);
+ p.setFont(font);
+#endif
+ p.drawText(rect(), Qt::AlignBottom | Qt::TextWordWrap,
+ "Map data CCBYSA 2009 OpenStreetMap.org contributors");
+ p.end();
+
+ if (zoomed) {
+ int dim = qMin(width(), height());
+ int magnifierSize = qMin(MAX_MAGNIFIER, dim * 2 / 3);
+ int radius = magnifierSize / 2;
+ int ring = radius - 15;
+ QSize box = QSize(magnifierSize, magnifierSize);
+
+ // reupdate our mask
+ if (maskPixmap.size() != box) {
+ maskPixmap = QPixmap(box);
+ maskPixmap.fill(Qt::transparent);
+
+ QRadialGradient g;
+ g.setCenter(radius, radius);
+ g.setFocalPoint(radius, radius);
+ g.setRadius(radius);
+ g.setColorAt(1.0, QColor(255, 255, 255, 0));
+ g.setColorAt(0.5, QColor(128, 128, 128, 255));
+
+ QPainter mask(&maskPixmap);
+ mask.setRenderHint(QPainter::Antialiasing);
+ mask.setCompositionMode(QPainter::CompositionMode_Source);
+ mask.setBrush(g);
+ mask.setPen(Qt::NoPen);
+ mask.drawRect(maskPixmap.rect());
+ mask.setBrush(QColor(Qt::transparent));
+ mask.drawEllipse(g.center(), ring, ring);
+ mask.end();
+ }
+
+ QPoint center = dragPos - QPoint(0, radius);
+ center = center + QPoint(0, radius / 2);
+ QPoint corner = center - QPoint(radius, radius);
+
+ QPoint xy = center * 2 - QPoint(radius, radius);
+
+ // only set the dimension to the magnified portion
+ if (zoomPixmap.size() != box) {
+ zoomPixmap = QPixmap(box);
+ zoomPixmap.fill(Qt::lightGray);
+ }
+ if (true) {
+ QPainter p(&zoomPixmap);
+ p.translate(-xy);
+ m_largeMap->render(&p, QRect(xy, box));
+ p.end();
+ }
+
+ QPainterPath clipPath;
+ clipPath.addEllipse(center, ring, ring);
+
+ QPainter p(this);
+ p.setRenderHint(QPainter::Antialiasing);
+ p.setClipPath(clipPath);
+ p.drawPixmap(corner, zoomPixmap);
+ p.setClipping(false);
+ p.drawPixmap(corner, maskPixmap);
+ p.setPen(Qt::gray);
+ p.drawPath(clipPath);
+ }
+ if (invert) {
+ QPainter p(this);
+ p.setCompositionMode(QPainter::CompositionMode_Difference);
+ p.fillRect(event->rect(), Qt::white);
+ p.end();
+ }
+ }
+
+ void timerEvent(QTimerEvent *) {
+ if (!zoomed)
+ activateZoom();
+ update();
+ }
+
+ void mousePressEvent(QMouseEvent *event) {
+ if (event->buttons() != Qt::LeftButton)
+ return;
+ pressed = snapped = true;
+ pressPos = dragPos = event->pos();
+ tapTimer.stop();
+ tapTimer.start(HOLD_TIME, this);
+ }
+
+ void mouseMoveEvent(QMouseEvent *event) {
+ if (!event->buttons())
+ return;
+ if (!zoomed) {
+ if (!pressed || !snapped) {
+ QPoint delta = event->pos() - pressPos;
+ pressPos = event->pos();
+ m_normalMap->pan(delta);
+ return;
+ } else {
+ const int threshold = 10;
+ QPoint delta = event->pos() - pressPos;
+ if (snapped) {
+ snapped &= delta.x() < threshold;
+ snapped &= delta.y() < threshold;
+ snapped &= delta.x() > -threshold;
+ snapped &= delta.y() > -threshold;
+ }
+ if (!snapped)
+ tapTimer.stop();
+ }
+ } else {
+ dragPos = event->pos();
+ update();
+ }
+ }
+
+ void mouseReleaseEvent(QMouseEvent *) {
+ zoomed = false;
+ update();
+ }
+
+ void keyPressEvent(QKeyEvent *event) {
+ if (!zoomed) {
+ if (event->key() == Qt::Key_Left)
+ m_normalMap->pan(QPoint(20, 0));
+ if (event->key() == Qt::Key_Right)
+ m_normalMap->pan(QPoint(-20, 0));
+ if (event->key() == Qt::Key_Up)
+ m_normalMap->pan(QPoint(0, 20));
+ if (event->key() == Qt::Key_Down)
+ m_normalMap->pan(QPoint(0, -20));
+ if (event->key() == Qt::Key_Z || event->key() == Qt::Key_Select) {
+ dragPos = QPoint(width() / 2, height() / 2);
+ activateZoom();
+ }
+ } else {
+ if (event->key() == Qt::Key_Z || event->key() == Qt::Key_Select) {
+ zoomed = false;
+ update();
+ }
+ QPoint delta(0, 0);
+ if (event->key() == Qt::Key_Left)
+ delta = QPoint(-15, 0);
+ if (event->key() == Qt::Key_Right)
+ delta = QPoint(15, 0);
+ if (event->key() == Qt::Key_Up)
+ delta = QPoint(0, -15);
+ if (event->key() == Qt::Key_Down)
+ delta = QPoint(0, 15);
+ if (delta != QPoint(0, 0)) {
+ dragPos += delta;
+ update();
+ }
+ }
+ }
+
+private:
+ SlippyMap *m_normalMap;
+ SlippyMap *m_largeMap;
+ bool pressed;
+ bool snapped;
+ QPoint pressPos;
+ QPoint dragPos;
+ QBasicTimer tapTimer;
+ bool zoomed;
+ QPixmap zoomPixmap;
+ QPixmap maskPixmap;
+ bool invert;
+};
+
+class MapZoom : public QMainWindow
+{
+ Q_OBJECT
+
+private:
+ LightMaps *map;
+
+public:
+ MapZoom(): QMainWindow(0) {
+ map = new LightMaps(this);
+ setCentralWidget(map);
+ map->setFocus();
+
+ QAction *osloAction = new QAction("&Oslo", this);
+ QAction *berlinAction = new QAction("&Berlin", this);
+ QAction *jakartaAction = new QAction("&Jakarta", this);
+ QAction *nightModeAction = new QAction("Night Mode", this);
+ nightModeAction->setCheckable(true);
+ nightModeAction->setChecked(false);
+ QAction *osmAction = new QAction("About OpenStreetMap", this);
+ connect(osloAction, SIGNAL(triggered()), SLOT(chooseOslo()));
+ connect(berlinAction, SIGNAL(triggered()), SLOT(chooseBerlin()));
+ connect(jakartaAction, SIGNAL(triggered()), SLOT(chooseJakarta()));
+ connect(nightModeAction, SIGNAL(triggered()), map, SLOT(toggleNightMode()));
+ connect(osmAction, SIGNAL(triggered()), SLOT(aboutOsm()));
+
+#if defined(Q_OS_SYMBIAN)
+ menuBar()->addAction(osloAction);
+ menuBar()->addAction(berlinAction);
+ menuBar()->addAction(jakartaAction);
+ menuBar()->addAction(nightModeAction);
+ menuBar()->addAction(osmAction);
+#else
+ QMenu *menu = menuBar()->addMenu("&Options");
+ menu->addAction(osloAction);
+ menu->addAction(berlinAction);
+ menu->addAction(jakartaAction);
+ menu->addSeparator();
+ menu->addAction(nightModeAction);
+ menu->addAction(osmAction);
+#endif
+
+ QTimer::singleShot(0, this, SLOT(delayedInit()));
+ }
+
+private slots:
+
+ void delayedInit() {
+#if defined(Q_OS_SYMBIAN)
+ qt_SetDefaultIap();
+#endif
+ }
+
+ void chooseOslo() {
+ map->setCenter(59.9138204, 10.7387413);
+ }
+
+ void chooseBerlin() {
+ map->setCenter(52.52958999943302, 13.383053541183472);
+ }
+
+ void chooseJakarta() {
+ map->setCenter(-6.211544, 106.845172);
+ }
+
+ void aboutOsm() {
+ QDesktopServices::openUrl(QUrl("http://www.openstreetmap.org"));
+ }
+};
+
+
+#include "lightmaps.moc"
+
+int main(int argc, char **argv)
+{
+#if defined(Q_WS_X11)
+ QApplication::setGraphicsSystem("raster");
+#endif
+
+ QApplication app(argc, argv);
+ app.setApplicationName("LightMaps");
+
+ MapZoom w;
+ w.setWindowTitle("OpenStreetMap");
+#if defined(Q_OS_SYMBIAN)
+ w.showMaximized();
+#else
+ w.resize(600, 450);
+ w.show();
+#endif
+
+ return app.exec();
+}
diff --git a/demos/embedded/lightmaps/lightmaps.pro b/demos/embedded/lightmaps/lightmaps.pro
new file mode 100644
index 0000000..e57d15d
--- /dev/null
+++ b/demos/embedded/lightmaps/lightmaps.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+SOURCES = lightmaps.cpp
+QT += network
+
+symbian {
+ HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h
+ LIBS += -lesock -lconnmon
+ TARGET.CAPABILITY = NetworkServices
+ TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
+}
diff --git a/demos/embedded/raycasting/raycasting.cpp b/demos/embedded/raycasting/raycasting.cpp
new file mode 100644
index 0000000..3885268
--- /dev/null
+++ b/demos/embedded/raycasting/raycasting.cpp
@@ -0,0 +1,310 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+
+#include <math.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define WORLD_SIZE 8
+int world_map[WORLD_SIZE][WORLD_SIZE] = {
+ { 1, 1, 1, 1, 6, 1, 1, 1 },
+ { 1, 0, 0, 1, 0, 0, 0, 7 },
+ { 1, 1, 0, 1, 0, 1, 1, 1 },
+ { 6, 0, 0, 0, 0, 0, 0, 3 },
+ { 1, 8, 8, 0, 8, 0, 8, 1 },
+ { 2, 2, 0, 0, 8, 8, 7, 1 },
+ { 3, 0, 0, 0, 0, 0, 0, 5 },
+ { 2, 2, 2, 2, 7, 4, 4, 4 },
+};
+
+#define TEXTURE_SIZE 64
+#define TEXTURE_BLOCK (TEXTURE_SIZE * TEXTURE_SIZE)
+
+class Raycasting: public QWidget
+{
+public:
+ Raycasting(QWidget *parent = 0)
+ : QWidget(parent)
+ , angle(0.5)
+ , playerPos(1.5, 1.5)
+ , angleDelta(0)
+ , moveDelta(0) {
+
+ // http://www.areyep.com/RIPandMCS-TextureLibrary.html
+ textureImg.load(":/textures.png");
+ textureImg = textureImg.convertToFormat(QImage::Format_ARGB32);
+ Q_ASSERT(textureImg.width() == TEXTURE_SIZE * 2);
+ Q_ASSERT(textureImg.bytesPerLine() == 4 * TEXTURE_SIZE * 2);
+ textureCount = textureImg.height() / TEXTURE_SIZE;
+
+ watch.start();
+ ticker.start(25, this);
+ setAttribute(Qt::WA_OpaquePaintEvent, true);
+ }
+
+ void updatePlayer() {
+ int interval = qBound(20, watch.elapsed(), 250);
+ watch.start();
+ angle += angleDelta * interval / 1000;
+ qreal step = moveDelta * interval / 1000;
+ qreal dx = cos(angle) * step;
+ qreal dy = sin(angle) * step;
+ QPointF pos = playerPos + 3 * QPointF(dx, dy);
+ int xi = static_cast<int>(pos.x());
+ int yi = static_cast<int>(pos.y());
+ if (world_map[yi][xi] == 0)
+ playerPos = playerPos + QPointF(dx, dy);
+ }
+
+ void showFps() {
+ static QTime frameTick;
+ static int totalFrame = 0;
+ if (!(totalFrame & 31)) {
+ int elapsed = frameTick.elapsed();
+ frameTick.start();
+ int fps = 32 * 1000 / (1 + elapsed);
+ setWindowTitle(QString("Raycasting (%1 FPS)").arg(fps));
+ }
+ totalFrame++;
+ }
+
+ void render() {
+
+ // setup the screen surface
+ if (buffer.size() != size())
+ buffer = QImage(size(), QImage::Format_ARGB32);
+ int bufw = buffer.width();
+ int bufh = buffer.height();
+
+ // we intentionally cheat here, to avoid detach
+ const uchar *ptr = buffer.bits();
+ QRgb *start = (QRgb*)(ptr);
+ QRgb stride = buffer.bytesPerLine() / 4;
+ QRgb *finish = start + stride * bufh;
+
+ // prepare the texture pointer
+ const uchar *src = textureImg.bits();
+ const QRgb *texsrc = reinterpret_cast<const QRgb*>(src);
+
+ // cast all rays here
+ qreal sina = sin(angle);
+ qreal cosa = cos(angle);
+ qreal u = cosa - sina;
+ qreal v = sina + cosa;
+ qreal du = 2 * sina / bufw;
+ qreal dv = -2 * cosa / bufw;
+
+ for (int ray = 0; ray < bufw; ++ray, u += du, v += dv) {
+ // everytime this ray advances 'u' units in x direction,
+ // it also advanced 'v' units in y direction
+ qreal uu = (u < 0) ? -u : u;
+ qreal vv = (v < 0) ? -v : v;
+ qreal duu = 1 / uu;
+ qreal dvv = 1 / vv;
+ int stepx = (u < 0) ? -1 : 1;
+ int stepy = (v < 0) ? -1 : 1;
+
+ // the cell in the map that we need to check
+ qreal px = playerPos.x();
+ qreal py = playerPos.y();
+ int mapx = static_cast<int>(px);
+ int mapy = static_cast<int>(py);
+
+ // the position and texture for the hit
+ int texture = 0;
+ qreal hitdist = 0.1;
+ qreal texofs = 0;
+ bool dark = false;
+
+ // first hit at constant x and constant y lines
+ qreal distx = (u > 0) ? (mapx + 1 - px) * duu : (px - mapx) * duu;
+ qreal disty = (v > 0) ? (mapy + 1 - py) * dvv : (py - mapy) * dvv;
+
+ // loop until we hit something
+ while (texture <= 0) {
+ if (distx > disty) {
+ // shorter distance to a hit in constant y line
+ hitdist = disty;
+ disty += dvv;
+ mapy += stepy;
+ texture = world_map[mapy][mapx];
+ if (texture > 0) {
+ dark = true;
+ if (stepy > 0) {
+ qreal ofs = px + u * (mapy - py) / v;
+ texofs = ofs - floor(ofs);
+ } else {
+ qreal ofs = px + u * (mapy + 1 - py) / v;
+ texofs = ofs - floor(ofs);
+ }
+ }
+ } else {
+ // shorter distance to a hit in constant x line
+ hitdist = distx;
+ distx += duu;
+ mapx += stepx;
+ texture = world_map[mapy][mapx];
+ if (texture > 0) {
+ if (stepx > 0) {
+ qreal ofs = py + v * (mapx - px) / u;
+ texofs = ofs - floor(ofs);
+ } else {
+ qreal ofs = py + v * (mapx + 1 - px) / u;
+ texofs = ceil(ofs) - ofs;
+ }
+ }
+ }
+ }
+
+ // get the texture, note that the texture image
+ // has two textures horizontally, "normal" vs "dark"
+ int col = static_cast<int>(texofs * TEXTURE_SIZE);
+ col = qBound(0, col, TEXTURE_SIZE - 1);
+ texture = (texture - 1) % textureCount;
+ const QRgb *tex = texsrc + TEXTURE_BLOCK * texture * 2 +
+ (TEXTURE_SIZE * 2 * col);
+ if (dark)
+ tex += TEXTURE_SIZE;
+
+ // start from the texture center (horizontally)
+ int h = static_cast<int>(bufw / hitdist / 2);
+ int dy = (TEXTURE_SIZE << 12) / h;
+ int p1 = ((TEXTURE_SIZE / 2) << 12) - dy;
+ int p2 = p1 + dy;
+
+ // start from the screen center (vertically)
+ // y1 will go up (decrease), y2 will go down (increase)
+ int y1 = bufh / 2;
+ int y2 = y1 + 1;
+ QRgb *pixel1 = start + y1 * stride + ray;
+ QRgb *pixel2 = pixel1 + stride;
+
+ // map the texture to the sliver
+ while (y1 >= 0 && y2 < bufh && p1 >= 0) {
+ *pixel1 = tex[p1 >> 12];
+ *pixel2 = tex[p2 >> 12];
+ p1 -= dy;
+ p2 += dy;
+ --y1;
+ ++y2;
+ pixel1 -= stride;
+ pixel2 += stride;
+ }
+
+ // ceiling and floor
+ for (; pixel1 > start; pixel1 -= stride)
+ *pixel1 = qRgb(0, 0, 0);
+ for (; pixel2 < finish; pixel2 += stride)
+ *pixel2 = qRgb(96, 96, 96);
+ }
+
+ update();
+ }
+
+protected:
+
+ void timerEvent(QTimerEvent*) {
+ updatePlayer();
+ render();
+ showFps();
+ }
+
+ void paintEvent(QPaintEvent *event) {
+ QPainter p(this);
+ p.drawImage(event->rect(), buffer, event->rect());
+ }
+
+ void keyPressEvent(QKeyEvent *event) {
+ event->accept();
+ if (event->key() == Qt::Key_Left)
+ angleDelta = 1.3 * M_PI;
+ if (event->key() == Qt::Key_Right)
+ angleDelta = -1.3 * M_PI;
+ if (event->key() == Qt::Key_Up)
+ moveDelta = 2.5;
+ if (event->key() == Qt::Key_Down)
+ moveDelta = -2.5;
+ }
+
+ void keyReleaseEvent(QKeyEvent *event) {
+ event->accept();
+ if (event->key() == Qt::Key_Left)
+ angleDelta = (angleDelta > 0) ? 0 : angleDelta;
+ if (event->key() == Qt::Key_Right)
+ angleDelta = (angleDelta < 0) ? 0 : angleDelta;
+ if (event->key() == Qt::Key_Up)
+ moveDelta = (moveDelta > 0) ? 0 : moveDelta;
+ if (event->key() == Qt::Key_Down)
+ moveDelta = (moveDelta < 0) ? 0 : moveDelta;
+ }
+
+private:
+ QTime watch;
+ QBasicTimer ticker;
+ QImage buffer;
+ qreal angle;
+ QPointF playerPos;
+ qreal angleDelta;
+ qreal moveDelta;
+ QImage textureImg;
+ int textureCount;
+};
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+
+ Raycasting w;
+ w.setWindowTitle("Raycasting");
+#if defined(Q_OS_SYMBIAN)
+ w.showMaximized();
+#else
+ w.resize(640, 480);
+ w.show();
+#endif
+
+ return app.exec();
+}
diff --git a/demos/embedded/raycasting/raycasting.pro b/demos/embedded/raycasting/raycasting.pro
new file mode 100644
index 0000000..dae9412
--- /dev/null
+++ b/demos/embedded/raycasting/raycasting.pro
@@ -0,0 +1,3 @@
+TEMPLATE = app
+SOURCES = raycasting.cpp
+RESOURCES += raycasting.qrc
diff --git a/demos/embedded/raycasting/raycasting.qrc b/demos/embedded/raycasting/raycasting.qrc
new file mode 100644
index 0000000..974a060
--- /dev/null
+++ b/demos/embedded/raycasting/raycasting.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/" >
+ <file>textures.png</file>
+ </qresource>
+</RCC>
diff --git a/demos/embedded/raycasting/textures.png b/demos/embedded/raycasting/textures.png
new file mode 100644
index 0000000..839488b
--- /dev/null
+++ b/demos/embedded/raycasting/textures.png
Binary files differ
diff --git a/demos/embedded/styledemo/files/application.qss b/demos/embedded/styledemo/files/application.qss
index a632ad1..432fe6b 100644
--- a/demos/embedded/styledemo/files/application.qss
+++ b/demos/embedded/styledemo/files/application.qss
@@ -6,7 +6,7 @@ QWidget#StyleWidget
QLabel, QAbstractButton
{
- font: 18px bold;
+ font: bold;
color: beige;
}
diff --git a/demos/embedded/styledemo/files/blue.qss b/demos/embedded/styledemo/files/blue.qss
index aa87277..ac8671b 100644
--- a/demos/embedded/styledemo/files/blue.qss
+++ b/demos/embedded/styledemo/files/blue.qss
@@ -5,7 +5,7 @@
QLabel, QAbstractButton
{
- font: 10pt bold;
+ font: bold;
color: yellow;
}
@@ -28,7 +28,6 @@ QAbstractButton
border-style: solid;
border-radius: 5;
padding: 3px;
- qproperty-focusPolicy: NoFocus;
}
QAbstractButton:pressed
diff --git a/demos/embedded/styledemo/files/khaki.qss b/demos/embedded/styledemo/files/khaki.qss
index 9c0f77c..b0d4a0f 100644
--- a/demos/embedded/styledemo/files/khaki.qss
+++ b/demos/embedded/styledemo/files/khaki.qss
@@ -16,7 +16,6 @@ QPushButton, QToolButton {
padding: 3px;
/* min-width: 96px; */
/* min-height: 48px; */
- qproperty-focusPolicy: NoFocus
}
QPushButton:hover, QToolButton:hover {
@@ -30,7 +29,7 @@ QPushButton:pressed, QToolButton:pressed {
}
QLabel, QAbstractButton {
- font: italic 11pt "Times New Roman";
+ font: italic "Times New Roman";
}
QFrame, QLabel#title {
diff --git a/demos/embedded/styledemo/files/transparent.qss b/demos/embedded/styledemo/files/transparent.qss
index e3a9912..b38eb36 100644
--- a/demos/embedded/styledemo/files/transparent.qss
+++ b/demos/embedded/styledemo/files/transparent.qss
@@ -6,7 +6,6 @@ QWidget#StyleWidget
QLabel, QAbstractButton
{
- font: 13pt;
color: beige;
}
diff --git a/demos/embedded/styledemo/styledemo.pro b/demos/embedded/styledemo/styledemo.pro
index ee5e4d6..7107798 100644
--- a/demos/embedded/styledemo/styledemo.pro
+++ b/demos/embedded/styledemo/styledemo.pro
@@ -10,3 +10,8 @@ target.path = $$[QT_INSTALL_DEMOS]/embedded/styledemo
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro *.html
sources.path = $$[QT_INSTALL_DEMOS]/embedded/styledemo
INSTALLS += target sources
+
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ TARGET.UID3 = 0xA000A63F
+}
diff --git a/demos/embedded/styledemo/stylewidget.ui b/demos/embedded/styledemo/stylewidget.ui
index 586faea..a084dde 100644
--- a/demos/embedded/styledemo/stylewidget.ui
+++ b/demos/embedded/styledemo/stylewidget.ui
@@ -1,135 +1,139 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
<class>StyleWidget</class>
- <widget class="QWidget" name="StyleWidget" >
- <property name="geometry" >
+ <widget class="QWidget" name="StyleWidget">
+ <property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>339</width>
- <height>230</height>
+ <width>174</width>
+ <height>220</height>
</rect>
</property>
- <property name="windowTitle" >
+ <property name="windowTitle">
<string>Form</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout" >
- <property name="margin" >
- <number>3</number>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <property name="margin">
+ <number>4</number>
</property>
<item>
- <widget class="QGroupBox" name="groupBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+ <widget class="QGroupBox" name="groupBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="title" >
+ <property name="title">
<string>Styles</string>
</property>
- <layout class="QHBoxLayout" >
- <property name="spacing" >
- <number>3</number>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="margin">
+ <number>4</number>
</property>
- <property name="margin" >
- <number>3</number>
+ <property name="spacing">
+ <number>4</number>
</property>
- <item>
- <widget class="QPushButton" name="noStyle" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="MinimumExpanding" hsizetype="Minimum" >
+ <item row="0" column="0">
+ <widget class="QPushButton" name="transparentStyle">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="focusPolicy" >
- <enum>Qt::NoFocus</enum>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
</property>
- <property name="text" >
- <string>No-Style</string>
+ <property name="text">
+ <string>Transp.</string>
</property>
- <property name="checkable" >
+ <property name="checkable">
<bool>true</bool>
</property>
- <property name="checked" >
- <bool>true</bool>
+ <property name="checked">
+ <bool>false</bool>
</property>
- <property name="autoExclusive" >
+ <property name="autoExclusive">
<bool>true</bool>
</property>
</widget>
</item>
- <item>
- <widget class="QPushButton" name="blueStyle" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="MinimumExpanding" hsizetype="Minimum" >
+ <item row="2" column="0">
+ <widget class="QPushButton" name="blueStyle">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="focusPolicy" >
- <enum>Qt::NoFocus</enum>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
</property>
- <property name="text" >
+ <property name="text">
<string>Blue</string>
</property>
- <property name="checkable" >
+ <property name="checkable">
<bool>true</bool>
</property>
- <property name="checked" >
+ <property name="checked">
<bool>false</bool>
</property>
- <property name="autoExclusive" >
+ <property name="autoExclusive">
<bool>true</bool>
</property>
</widget>
</item>
- <item>
- <widget class="QPushButton" name="khakiStyle" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="MinimumExpanding" hsizetype="Minimum" >
+ <item row="0" column="1">
+ <widget class="QPushButton" name="khakiStyle">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="focusPolicy" >
- <enum>Qt::NoFocus</enum>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
</property>
- <property name="text" >
+ <property name="text">
<string>Khaki</string>
</property>
- <property name="checkable" >
+ <property name="checkable">
<bool>true</bool>
</property>
- <property name="checked" >
+ <property name="checked">
<bool>false</bool>
</property>
- <property name="autoExclusive" >
+ <property name="autoExclusive">
<bool>true</bool>
</property>
</widget>
</item>
- <item>
- <widget class="QPushButton" name="transparentStyle" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="MinimumExpanding" hsizetype="Minimum" >
+ <item row="2" column="1">
+ <widget class="QPushButton" name="noStyle">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="focusPolicy" >
- <enum>Qt::NoFocus</enum>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
</property>
- <property name="text" >
- <string>Transparent</string>
+ <property name="text">
+ <string>None</string>
</property>
- <property name="checkable" >
+ <property name="checkable">
<bool>true</bool>
</property>
- <property name="checked" >
- <bool>false</bool>
+ <property name="checked">
+ <bool>true</bool>
</property>
- <property name="autoExclusive" >
+ <property name="autoExclusive">
<bool>true</bool>
</property>
</widget>
@@ -138,11 +142,11 @@
</widget>
</item>
<item>
- <spacer name="verticalSpacer_3" >
- <property name="orientation" >
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
<enum>Qt::Vertical</enum>
</property>
- <property name="sizeHint" stdset="0" >
+ <property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
@@ -151,56 +155,56 @@
</spacer>
</item>
<item>
- <widget class="QFrame" name="frame" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="MinimumExpanding" hsizetype="Expanding" >
+ <widget class="QFrame" name="frame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="frameShape" >
+ <property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
- <property name="frameShadow" >
+ <property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
- <layout class="QVBoxLayout" name="frameLayout" >
- <property name="margin" >
- <number>3</number>
+ <layout class="QVBoxLayout" name="frameLayout">
+ <property name="margin">
+ <number>0</number>
</property>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout" >
+ <layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="QLabel" name="label" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Preferred" hsizetype="MinimumExpanding" >
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="text" >
+ <property name="text">
<string>My Value is:</string>
</property>
- <property name="alignment" >
+ <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
- <widget class="QSpinBox" name="spinBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <widget class="QSpinBox" name="spinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="focusPolicy" >
- <enum>Qt::NoFocus</enum>
+ <property name="focusPolicy">
+ <enum>Qt::WheelFocus</enum>
</property>
- <property name="alignment" >
+ <property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
- <property name="keyboardTracking" >
+ <property name="keyboardTracking">
<bool>false</bool>
</property>
</widget>
@@ -208,85 +212,88 @@
</layout>
</item>
<item>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QScrollBar" name="horizontalScrollBar" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QScrollBar" name="horizontalScrollBar">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="minimumSize" >
+ <property name="minimumSize">
<size>
<width>0</width>
<height>24</height>
</size>
</property>
- <property name="orientation" >
+ <property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
- <item row="1" column="0" >
- <widget class="QPushButton" name="pushButton_2" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="MinimumExpanding" hsizetype="MinimumExpanding" >
+ <item row="1" column="0">
+ <widget class="QPushButton" name="pushButton_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="focusPolicy" >
- <enum>Qt::NoFocus</enum>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
</property>
- <property name="text" >
- <string>Show Scroller</string>
+ <property name="text">
+ <string>Show</string>
</property>
- <property name="checkable" >
+ <property name="checkable">
<bool>true</bool>
</property>
- <property name="checked" >
+ <property name="checked">
<bool>true</bool>
</property>
- <property name="flat" >
+ <property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
- <item row="0" column="1" >
- <widget class="QScrollBar" name="horizontalScrollBar_2" >
- <property name="minimumSize" >
+ <item row="0" column="1">
+ <widget class="QScrollBar" name="horizontalScrollBar_2">
+ <property name="minimumSize">
<size>
<width>0</width>
<height>24</height>
</size>
</property>
- <property name="orientation" >
+ <property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
- <item row="1" column="1" >
- <widget class="QPushButton" name="pushButton" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="MinimumExpanding" hsizetype="MinimumExpanding" >
+ <item row="1" column="1">
+ <widget class="QPushButton" name="pushButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
- <property name="focusPolicy" >
- <enum>Qt::NoFocus</enum>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
</property>
- <property name="text" >
- <string>Enable Scroller</string>
+ <property name="text">
+ <string>Enable</string>
</property>
- <property name="checkable" >
+ <property name="checkable">
<bool>true</bool>
</property>
- <property name="checked" >
+ <property name="checked">
<bool>true</bool>
</property>
- <property name="flat" >
+ <property name="flat">
<bool>false</bool>
</property>
</widget>
@@ -297,14 +304,14 @@
</widget>
</item>
<item>
- <spacer name="verticalSpacer" >
- <property name="orientation" >
+ <spacer name="verticalSpacer">
+ <property name="orientation">
<enum>Qt::Vertical</enum>
</property>
- <property name="sizeType" >
+ <property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
- <property name="sizeHint" stdset="0" >
+ <property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
@@ -313,13 +320,13 @@
</spacer>
</item>
<item>
- <layout class="QHBoxLayout" >
+ <layout class="QHBoxLayout">
<item>
<spacer>
- <property name="orientation" >
+ <property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
- <property name="sizeHint" stdset="0" >
+ <property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
@@ -328,11 +335,11 @@
</spacer>
</item>
<item>
- <widget class="QPushButton" name="close" >
- <property name="focusPolicy" >
- <enum>Qt::NoFocus</enum>
+ <widget class="QPushButton" name="close">
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
</property>
- <property name="text" >
+ <property name="text">
<string>Close</string>
</property>
</widget>
@@ -342,7 +349,7 @@
</layout>
</widget>
<resources>
- <include location="StyleDemo.qrc" />
+ <include location="StyleDemo.qrc"/>
</resources>
<connections>
<connection>
@@ -351,13 +358,13 @@
<receiver>horizontalScrollBar_2</receiver>
<slot>setValue(int)</slot>
<hints>
- <hint type="sourcelabel" >
- <x>134</x>
- <y>196</y>
+ <hint type="sourcelabel">
+ <x>84</x>
+ <y>147</y>
</hint>
- <hint type="destinationlabel" >
- <x>523</x>
- <y>193</y>
+ <hint type="destinationlabel">
+ <x>166</x>
+ <y>147</y>
</hint>
</hints>
</connection>
@@ -367,13 +374,13 @@
<receiver>horizontalScrollBar</receiver>
<slot>setValue(int)</slot>
<hints>
- <hint type="sourcelabel" >
- <x>577</x>
- <y>199</y>
+ <hint type="sourcelabel">
+ <x>166</x>
+ <y>147</y>
</hint>
- <hint type="destinationlabel" >
- <x>127</x>
- <y>207</y>
+ <hint type="destinationlabel">
+ <x>84</x>
+ <y>147</y>
</hint>
</hints>
</connection>
@@ -383,13 +390,13 @@
<receiver>horizontalScrollBar_2</receiver>
<slot>setEnabled(bool)</slot>
<hints>
- <hint type="sourcelabel" >
- <x>566</x>
- <y>241</y>
+ <hint type="sourcelabel">
+ <x>166</x>
+ <y>175</y>
</hint>
- <hint type="destinationlabel" >
- <x>492</x>
- <y>207</y>
+ <hint type="destinationlabel">
+ <x>166</x>
+ <y>147</y>
</hint>
</hints>
</connection>
@@ -399,13 +406,13 @@
<receiver>horizontalScrollBar</receiver>
<slot>setVisible(bool)</slot>
<hints>
- <hint type="sourcelabel" >
- <x>123</x>
- <y>239</y>
+ <hint type="sourcelabel">
+ <x>84</x>
+ <y>175</y>
</hint>
- <hint type="destinationlabel" >
- <x>123</x>
- <y>184</y>
+ <hint type="destinationlabel">
+ <x>84</x>
+ <y>147</y>
</hint>
</hints>
</connection>
@@ -415,13 +422,29 @@
<receiver>horizontalScrollBar_2</receiver>
<slot>setValue(int)</slot>
<hints>
- <hint type="sourcelabel" >
- <x>603</x>
- <y>136</y>
+ <hint type="sourcelabel">
+ <x>166</x>
+ <y>115</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>166</x>
+ <y>147</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>horizontalScrollBar_2</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>spinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>132</x>
+ <y>132</y>
</hint>
- <hint type="destinationlabel" >
- <x>575</x>
- <y>199</y>
+ <hint type="destinationlabel">
+ <x>135</x>
+ <y>110</y>
</hint>
</hints>
</connection>
diff --git a/demos/embedded/weatherinfo/icons/README.txt b/demos/embedded/weatherinfo/icons/README.txt
new file mode 100644
index 0000000..d384153
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/README.txt
@@ -0,0 +1,5 @@
+The scalable icons are from:
+
+http://tango.freedesktop.org/Tango_Icon_Library
+http://darkobra.deviantart.com/art/Tango-Weather-Icon-Pack-98024429
+
diff --git a/demos/embedded/weatherinfo/icons/weather-few-clouds.svg b/demos/embedded/weatherinfo/icons/weather-few-clouds.svg
new file mode 100644
index 0000000..57d45e9
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-few-clouds.svg
@@ -0,0 +1,738 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/garrett/Source/tango-icon-theme/scalable/status"
+ sodipodi:docname="weather-few-clouds.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective108" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient6724"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient6722"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient6720"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient6718"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient6716"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient6714"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient6712"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient6839"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient6837"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient6835"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient6833"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient6831"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient6829"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient6827"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ id="linearGradient4083">
+ <stop
+ id="stop4085"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0.75"
+ id="stop4089" />
+ <stop
+ id="stop4087"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4032">
+ <stop
+ id="stop4034"
+ offset="0"
+ style="stop-color:#fff7c2;stop-opacity:0.63829786" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0.18348624;"
+ offset="0.59394139"
+ id="stop4036" />
+ <stop
+ id="stop4038"
+ offset="0.83850551"
+ style="stop-color:#fcaf3e;stop-opacity:0.50458717;" />
+ <stop
+ id="stop4040"
+ offset="1"
+ style="stop-color:#fcaf3e;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4026">
+ <stop
+ id="stop4028"
+ offset="0"
+ style="stop-color:#fff9c6;stop-opacity:1" />
+ <stop
+ style="stop-color:#fff28c;stop-opacity:1;"
+ offset="0.54166669"
+ id="stop4042" />
+ <stop
+ id="stop4030"
+ offset="1"
+ style="stop-color:#ffea85;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4026"
+ id="linearGradient3168"
+ gradientUnits="userSpaceOnUse"
+ x1="-28.968945"
+ y1="-25.326815"
+ x2="-37.19698"
+ y2="-9.5590506" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4032"
+ id="radialGradient4020"
+ cx="-33.519073"
+ cy="-22.113297"
+ fx="-33.519073"
+ fy="-22.113297"
+ r="9.5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.487739,1.292402,-1.10267,0.497242,-41.77393,32.41492)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4083"
+ id="radialGradient4081"
+ cx="23.99999"
+ cy="23.381506"
+ fx="23.99999"
+ fy="23.381506"
+ r="19.141981"
+ gradientTransform="matrix(1.006701,2.235326e-16,-2.23715e-16,1.007522,-0.160816,0.426981)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="10.54135"
+ inkscape:cx="8.0181254"
+ inkscape:cy="24.950603"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="859"
+ inkscape:window-height="818"
+ inkscape:window-x="0"
+ inkscape:window-y="30"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-clear</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan Collier (pseudo)</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>applet</rdf:li>
+ <rdf:li>notification</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Garrett LeSage</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g6783"
+ transform="translate(-263.99,459.9855)">
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path6785"
+ d="M 280.50000,-445.50000 C 278.22917,-445.50000 276.39009,-443.94972 275.78125,-441.87500 C 275.08802,-442.23883 274.33674,-442.50000 273.50000,-442.50000 C 270.74000,-442.50000 268.49999,-440.26001 268.50000,-437.50000 C 268.50000,-436.92107 268.66252,-436.39230 268.84375,-435.87500 C 267.47028,-435.10426 266.50000,-433.68600 266.50000,-432.00000 C 266.50000,-429.51600 268.51600,-427.49999 271.00000,-427.50000 C 271.17713,-427.50000 289.82287,-427.50000 290.00000,-427.50000 C 292.48399,-427.50000 294.50000,-429.51600 294.50000,-432.00000 C 294.50000,-433.68600 293.52972,-435.10426 292.15625,-435.87500 C 292.33749,-436.39229 292.50000,-436.92108 292.50000,-437.50000 C 292.50000,-440.26000 290.26000,-442.49999 287.50000,-442.50000 C 286.66326,-442.50000 285.91198,-442.23883 285.21875,-441.87500 C 284.60991,-443.94972 282.77083,-445.50000 280.50000,-445.50000 z "
+ style="fill:#c4c5c2;fill-opacity:1.0000000;stroke:#888a85;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path6787"
+ d="M 280.50000,-445.00000 C 278.31028,-445.00000 276.77640,-443.66423 276.10445,-441.15648 C 275.43599,-441.50010 274.55686,-441.98983 273.75000,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.11240,-434.89433 267.00000,-433.73178 267.00000,-432.24973 C 267.00000,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294.00000,-429.90368 294.00000,-432.24973 C 294.00000,-433.84210 292.88760,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.05100 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.60820,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445.00000 280.50000,-445.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient6827);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <g
+ id="g6789">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6791"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6829);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6793"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)" />
+ </g>
+ <rect
+ y="-438.00000"
+ x="271.00000"
+ height="9.0000000"
+ width="20.000000"
+ id="rect6795"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830195,-35.68869)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path6797"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <g
+ id="g6799">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6801"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19811,24.86321)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6831);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6803"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19818,24.86331)" />
+ </g>
+ <g
+ id="g6805">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6807"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6833);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6809"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ </g>
+ <g
+ transform="translate(-1.000000,0.000000)"
+ id="g6811">
+ <path
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274.00000,-438.04812 274.00000,-434.46875 C 274.00000,-432.09807 275.34943,-430.13096 277.25000,-429.00000 L 283.71875,-429.00000 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.50000 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z "
+ id="path6813" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient6835);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-441.00000 C 276.91200,-441.00000 274.00000,-438.08799 274.00000,-434.50000 C 274.00000,-432.12360 275.34485,-430.13368 277.25000,-429.00000 L 283.75000,-429.00000 C 285.65515,-430.13368 287.00000,-432.12360 287.00000,-434.50000 C 287.00000,-438.08800 284.08800,-440.99999 280.50000,-441.00000 z "
+ id="path6815" />
+ </g>
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830296,-35.68884)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path6817"
+ style="opacity:1.0000000;fill:url(#linearGradient6837);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path6819"
+ d="M 292.95640,-437.33396 C 292.95487,-434.64940 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.95640,-437.33396 292.95640,-437.33396 z "
+ style="fill:#888a85;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <g
+ transform="matrix(1.142857,0.000000,0.000000,1.142857,-28.57139,67.00008)"
+ id="g6821">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6823"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6839);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6825"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ </g>
+ </g>
+ <g
+ id="g3936">
+ <g
+ style="opacity:0.7"
+ id="g4091">
+ <path
+ style="fill:#fce94f;fill-opacity:1;stroke:#fcaf3e;stroke-width:0.73732895;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24 2.5 L 21.625 9.1875 C 22.399034 9.0641318 23.191406 9 24 9 C 24.808594 9 25.600966 9.0641317 26.375 9.1875 L 24 2.5 z M 8.8125 8.78125 L 11.84375 15.21875 C 12.779034 13.928569 13.928569 12.779034 15.21875 11.84375 L 8.8125 8.78125 z M 39.21875 8.78125 L 32.78125 11.84375 C 34.071431 12.779034 35.220966 13.928569 36.15625 15.21875 L 39.21875 8.78125 z M 9.1875 21.59375 L 2.5 23.96875 L 9.1875 26.34375 C 9.0673373 25.57952 9 24.797813 9 24 C 9 23.180625 9.0608858 22.377571 9.1875 21.59375 z M 38.8125 21.625 C 38.935868 22.399034 39 23.191406 39 24 C 39 24.808594 38.935868 25.600966 38.8125 26.375 L 45.5 24 L 38.8125 21.625 z M 11.84375 32.78125 L 8.8125 39.1875 L 15.21875 36.15625 C 13.928569 35.220966 12.779034 34.071431 11.84375 32.78125 z M 36.15625 32.78125 C 35.229789 34.05926 34.087617 35.194799 32.8125 36.125 L 39.21875 39.1875 L 36.15625 32.78125 z M 21.625 38.8125 L 24 45.5 L 26.375 38.8125 C 25.600966 38.935868 24.808594 39 24 39 C 23.191406 39 22.399034 38.935868 21.625 38.8125 z "
+ id="path7492" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#radialGradient4081);stroke-width:0.84646249;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24 5.25 L 22.65625 9.0625 C 23.098888 9.0231486 23.547187 9 24 9 C 24.452813 9 24.901112 9.0231486 25.34375 9.0625 L 24 5.25 z M 10.78125 10.75 L 12.5 14.375 C 13.071538 13.694089 13.724004 13.038745 14.40625 12.46875 L 10.78125 10.75 z M 37.25 10.75 L 33.625 12.46875 C 34.304675 13.038189 34.961811 13.695325 35.53125 14.375 L 37.25 10.75 z M 9.0625 22.625 L 5.28125 23.96875 L 9.0625 25.3125 C 9.024981 24.880146 9 24.442031 9 24 C 9 23.536406 9.0212735 23.077908 9.0625 22.625 z M 38.9375 22.65625 C 38.976851 23.098888 39 23.547187 39 24 C 39 24.452813 38.976851 24.901112 38.9375 25.34375 L 42.71875 24 L 38.9375 22.65625 z M 35.53125 33.59375 C 34.958293 34.27954 34.309985 34.957363 33.625 35.53125 L 37.25 37.25 L 35.53125 33.59375 z M 12.5 33.625 L 10.78125 37.21875 L 14.375 35.5 C 13.702932 34.935884 13.064116 34.297068 12.5 33.625 z M 22.65625 38.9375 L 24 42.71875 L 25.34375 38.9375 C 24.901112 38.976851 24.452813 39 24 39 C 23.547187 39 23.098888 38.976851 22.65625 38.9375 z "
+ id="path7494" />
+ </g>
+ <g
+ id="g4046">
+ <g
+ id="g3931">
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(0.778062,-1.061285,1.061287,0.778062,67.47952,3.641324)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7498"
+ style="fill:#ffee54;fill-opacity:1;stroke:#fcaf3e;stroke-width:0.75991178;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(1.244257,-0.167707,0.216642,1.251844,67.61648,40.527)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7500"
+ style="fill:url(#radialGradient4020);fill-opacity:1;stroke:none;stroke-width:1.01737845;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(0.715791,-0.976349,0.97635,0.715792,64.00044,5.269544)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7502"
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient3168);stroke-width:0.82601947;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g6668"
+ transform="translate(-248.99,467.9855)">
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path6670"
+ d="M 280.50000,-445.50000 C 278.22917,-445.50000 276.39009,-443.94972 275.78125,-441.87500 C 275.08802,-442.23883 274.33674,-442.50000 273.50000,-442.50000 C 270.74000,-442.50000 268.49999,-440.26001 268.50000,-437.50000 C 268.50000,-436.92107 268.66252,-436.39230 268.84375,-435.87500 C 267.47028,-435.10426 266.50000,-433.68600 266.50000,-432.00000 C 266.50000,-429.51600 268.51600,-427.49999 271.00000,-427.50000 C 271.17713,-427.50000 289.82287,-427.50000 290.00000,-427.50000 C 292.48399,-427.50000 294.50000,-429.51600 294.50000,-432.00000 C 294.50000,-433.68600 293.52972,-435.10426 292.15625,-435.87500 C 292.33749,-436.39229 292.50000,-436.92108 292.50000,-437.50000 C 292.50000,-440.26000 290.26000,-442.49999 287.50000,-442.50000 C 286.66326,-442.50000 285.91198,-442.23883 285.21875,-441.87500 C 284.60991,-443.94972 282.77083,-445.50000 280.50000,-445.50000 z "
+ style="fill:#c4c5c2;fill-opacity:1.0000000;stroke:#888a85;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path6672"
+ d="M 280.50000,-445.00000 C 278.31028,-445.00000 276.77640,-443.66423 276.10445,-441.15648 C 275.43599,-441.50010 274.55686,-441.98983 273.75000,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.11240,-434.89433 267.00000,-433.73178 267.00000,-432.24973 C 267.00000,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294.00000,-429.90368 294.00000,-432.24973 C 294.00000,-433.84210 292.88760,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.05100 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.60820,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445.00000 280.50000,-445.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient6712);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <g
+ id="g6674">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6676"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6714);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6678"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)" />
+ </g>
+ <rect
+ y="-438.00000"
+ x="271.00000"
+ height="9.0000000"
+ width="20.000000"
+ id="rect6680"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830195,-35.68869)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path6682"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <g
+ id="g6684">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6686"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19811,24.86321)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6716);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6688"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19818,24.86331)" />
+ </g>
+ <g
+ id="g6690">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6692"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6718);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6694"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ </g>
+ <g
+ transform="translate(-1.000000,0.000000)"
+ id="g6696">
+ <path
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274.00000,-438.04812 274.00000,-434.46875 C 274.00000,-432.09807 275.34943,-430.13096 277.25000,-429.00000 L 283.71875,-429.00000 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.50000 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z "
+ id="path6698" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient6720);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-441.00000 C 276.91200,-441.00000 274.00000,-438.08799 274.00000,-434.50000 C 274.00000,-432.12360 275.34485,-430.13368 277.25000,-429.00000 L 283.75000,-429.00000 C 285.65515,-430.13368 287.00000,-432.12360 287.00000,-434.50000 C 287.00000,-438.08800 284.08800,-440.99999 280.50000,-441.00000 z "
+ id="path6700" />
+ </g>
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830296,-35.68884)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path6702"
+ style="opacity:1.0000000;fill:url(#linearGradient6722);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path6704"
+ d="M 292.95640,-437.33396 C 292.95487,-434.64940 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.95640,-437.33396 292.95640,-437.33396 z "
+ style="fill:#888a85;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <g
+ transform="matrix(1.142857,0.000000,0.000000,1.142857,-28.57139,67.00008)"
+ id="g6706">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6708"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6724);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6710"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-fog.svg b/demos/embedded/weatherinfo/icons/weather-fog.svg
new file mode 100644
index 0000000..a9a4ca8
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-fog.svg
@@ -0,0 +1,1585 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48"
+ height="48"
+ id="svg2670"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ version="1.0"
+ sodipodi:docname="weather-fog.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs2672">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7834">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop7836" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop7838" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8397">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8400" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8315">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8317" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8319" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8381">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8383" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8385" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8331">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8333" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8335" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8302">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8304" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8306" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2678" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient4844"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69.00259,102)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient4846"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient4848"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient4850"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient4852"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7834"
+ id="linearGradient4854"
+ gradientUnits="userSpaceOnUse"
+ x1="-156.29044"
+ y1="-100.53421"
+ x2="-153.09810"
+ y2="-96.544556" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient4856"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient4858"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient4860"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient4862"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient4864"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient4866"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient4868"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient4870"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient4872"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient4874"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient4876"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient4878"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient4880"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient4882"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient5018"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69.00259,102)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient5020"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient5022"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient5024"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient5026"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7834"
+ id="linearGradient5028"
+ gradientUnits="userSpaceOnUse"
+ x1="-156.29044"
+ y1="-100.53421"
+ x2="-153.09810"
+ y2="-96.544556" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5030"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5032"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5034"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5036"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5038"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5040"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5042"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5044"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5046"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5048"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5050"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5052"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5054"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5056"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient5119"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-245.83994,432.62036)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5122"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5124"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5126"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5128"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5130"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5132"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5134"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5156"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991"
+ gradientTransform="translate(-276.83994,492.62036)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5159"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5161"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5163"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5165"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5167"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5169"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5171"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5193"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991"
+ gradientTransform="translate(-291.84253,488.62036)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5221"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-291.84253,488.62036)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient5298"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69.00259,102)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient5300"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient5302"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient5304"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient5306"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7834"
+ id="linearGradient5308"
+ gradientUnits="userSpaceOnUse"
+ x1="-156.29044"
+ y1="-100.53421"
+ x2="-153.09810"
+ y2="-96.544556" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5310"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5312"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5314"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5316"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5318"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5320"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5322"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5324"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5326"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5328"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5330"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5332"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5334"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5336"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient5399"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-217.99871,406.5)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient5432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-245.83994,432.62036)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-276.83994,492.62036)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-291.84253,488.62036)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient5515"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-217.99871,406.5)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient5517"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient5519"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient5521"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient5523"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7834"
+ id="linearGradient5525"
+ gradientUnits="userSpaceOnUse"
+ x1="-156.29044"
+ y1="-100.53421"
+ x2="-153.09810"
+ y2="-96.544556" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5527"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5529"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5531"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5533"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5535"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5537"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5539"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5541"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5543"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5545"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5547"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5549"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5551"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5553"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5689"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5691"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5693"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5695"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5697"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5699"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5701"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient5703"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient5705"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient5707"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5709"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient5711"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient5713"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient5715"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16.270833"
+ inkscape:cx="12.725406"
+ inkscape:cy="24"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1272"
+ inkscape:window-height="965"
+ inkscape:window-x="0"
+ inkscape:window-y="0" />
+ <metadata
+ id="metadata2675">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g5641"
+ transform="translate(5e-6,-4)">
+ <g
+ style="opacity:0.45"
+ transform="translate(-248.99871,466.5)"
+ id="g7794">
+ <path
+ style="fill:#c4c5c2;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 280.5,-445.5 C 278.22917,-445.5 276.39009,-443.94972 275.78125,-441.875 C 275.08802,-442.23883 274.33674,-442.5 273.5,-442.5 C 270.74,-442.5 268.49999,-440.26001 268.5,-437.5 C 268.5,-436.92107 268.66252,-436.3923 268.84375,-435.875 C 267.47028,-435.10426 266.5,-433.686 266.5,-432 C 266.5,-429.516 268.516,-427.49999 271,-427.5 C 271.17713,-427.5 289.82287,-427.5 290,-427.5 C 292.48399,-427.5 294.5,-429.516 294.5,-432 C 294.5,-433.686 293.52972,-435.10426 292.15625,-435.875 C 292.33749,-436.39229 292.5,-436.92108 292.5,-437.5 C 292.5,-440.26 290.26,-442.49999 287.5,-442.5 C 286.66326,-442.5 285.91198,-442.23883 285.21875,-441.875 C 284.60991,-443.94972 282.77083,-445.5 280.5,-445.5 z"
+ id="path7796"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1;fill:url(#linearGradient5689);fill-opacity:1;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 280.5,-445 C 278.31028,-445 276.7764,-443.66423 276.10445,-441.15648 C 275.43599,-441.5001 274.55686,-441.98983 273.75,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.1124,-434.89433 267,-433.73178 267,-432.24973 C 267,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294,-429.90368 294,-432.24973 C 294,-433.8421 292.8876,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.051 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.6082,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445 280.5,-445 z"
+ id="path7798"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <g
+ id="g7800">
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-24.19818,21.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7802"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-24.19818,21.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7804"
+ style="opacity:1;fill:url(#linearGradient5691);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <rect
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7806"
+ width="20"
+ height="9"
+ x="271"
+ y="-438" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path7808"
+ sodipodi:cx="288.375"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125"
+ sodipodi:ry="3.3125"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ transform="matrix(0.90566,0,0,0.90566,9.830195,-35.68869)" />
+ <g
+ id="g7810">
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-17.19811,24.86321)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7812"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-17.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7814"
+ style="opacity:1;fill:url(#linearGradient5693);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7816">
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-31.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7818"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-31.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7820"
+ style="opacity:1;fill:url(#linearGradient5695);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7822"
+ transform="translate(-1,0)">
+ <path
+ id="path7824"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274,-438.04812 274,-434.46875 C 274,-432.09807 275.34943,-430.13096 277.25,-429 L 283.71875,-429 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.5 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path7826"
+ d="M 280.5,-441 C 276.912,-441 274,-438.08799 274,-434.5 C 274,-432.1236 275.34485,-430.13368 277.25,-429 L 283.75,-429 C 285.65515,-430.13368 287,-432.1236 287,-434.5 C 287,-438.088 284.088,-440.99999 280.5,-441 z"
+ style="opacity:1;fill:url(#linearGradient5697);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#linearGradient5699);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path7828"
+ sodipodi:cx="288.375"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125"
+ sodipodi:ry="3.3125"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ transform="matrix(0.90566,0,0,0.90566,9.830296,-35.68884)" />
+ <path
+ style="fill:#888a85;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 292.9564,-437.33396 C 292.95487,-434.6494 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.9564,-437.33396 292.9564,-437.33396 z"
+ id="path7830"
+ sodipodi:nodetypes="ccss" />
+ <g
+ id="g7832"
+ transform="matrix(1.142857,0,0,1.142857,-28.57139,67.00008)">
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-31.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7834"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-31.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7836"
+ style="opacity:1;fill:url(#linearGradient5701);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path4934"
+ d="M 31.501294,21.49982 C 29.311574,21.49982 27.777694,22.83559 27.105744,25.34334 C 26.437284,24.99972 25.558154,24.50999 24.751294,24.50999 C 22.034784,24.50999 19.996154,26.44881 19.996164,29.05553 C 19.996164,29.6023 20.263374,30.38897 20.438124,30.87754 C 19.113694,31.60549 18.001294,32.76804 18.001294,34.25009 C 18.001294,36.59614 19.547464,38.50018 22.340574,38.50018 C 22.511384,38.50018 40.491214,38.50018 40.662014,38.50018 C 43.433024,38.50018 45.001294,36.59614 45.001294,34.25009 C 45.001294,32.65772 43.888894,31.5834 42.564464,30.85545 C 42.739224,30.36689 43.028534,29.60229 43.028534,29.05553 C 43.028534,26.44882 40.912724,24.4879 38.251304,24.48789 C 37.444434,24.48789 36.609494,24.97763 35.941034,25.32125 C 35.292184,22.89971 33.691024,21.49982 31.501294,21.49982 z"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <g
+ style="opacity:0.45"
+ transform="translate(-264.0013,462.5)"
+ id="g7852">
+ <path
+ style="fill:#c4c5c2;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 280.5,-445.5 C 278.22917,-445.5 276.39009,-443.94972 275.78125,-441.875 C 275.08802,-442.23883 274.33674,-442.5 273.5,-442.5 C 270.74,-442.5 268.49999,-440.26001 268.5,-437.5 C 268.5,-436.92107 268.66252,-436.3923 268.84375,-435.875 C 267.47028,-435.10426 266.5,-433.686 266.5,-432 C 266.5,-429.516 268.516,-427.49999 271,-427.5 C 271.17713,-427.5 289.82287,-427.5 290,-427.5 C 292.48399,-427.5 294.5,-429.516 294.5,-432 C 294.5,-433.686 293.52972,-435.10426 292.15625,-435.875 C 292.33749,-436.39229 292.5,-436.92108 292.5,-437.5 C 292.5,-440.26 290.26,-442.49999 287.5,-442.5 C 286.66326,-442.5 285.91198,-442.23883 285.21875,-441.875 C 284.60991,-443.94972 282.77083,-445.5 280.5,-445.5 z"
+ id="path7854"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1;fill:url(#linearGradient5703);fill-opacity:1;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 280.5,-445 C 278.31028,-445 276.7764,-443.66423 276.10445,-441.15648 C 275.43599,-441.5001 274.55686,-441.98983 273.75,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.1124,-434.89433 267,-433.73178 267,-432.24973 C 267,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294,-429.90368 294,-432.24973 C 294,-433.8421 292.8876,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.051 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.6082,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445 280.5,-445 z"
+ id="path7856"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <g
+ id="g7858">
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-24.19818,21.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7860"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-24.19818,21.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7862"
+ style="opacity:1;fill:url(#linearGradient5705);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <rect
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7864"
+ width="20"
+ height="9"
+ x="271"
+ y="-438" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path7866"
+ sodipodi:cx="288.375"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125"
+ sodipodi:ry="3.3125"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ transform="matrix(0.90566,0,0,0.90566,9.830195,-35.68869)" />
+ <g
+ id="g7868">
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-17.19811,24.86321)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7870"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-17.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7872"
+ style="opacity:1;fill:url(#linearGradient5707);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7874">
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-31.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7876"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-31.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7878"
+ style="opacity:1;fill:url(#linearGradient5709);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7880"
+ transform="translate(-1,0)">
+ <path
+ id="path7882"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274,-438.04812 274,-434.46875 C 274,-432.09807 275.34943,-430.13096 277.25,-429 L 283.71875,-429 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.5 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path7884"
+ d="M 280.5,-441 C 276.912,-441 274,-438.08799 274,-434.5 C 274,-432.1236 275.34485,-430.13368 277.25,-429 L 283.75,-429 C 285.65515,-430.13368 287,-432.1236 287,-434.5 C 287,-438.088 284.088,-440.99999 280.5,-441 z"
+ style="opacity:1;fill:url(#linearGradient5711);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#linearGradient5713);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path7886"
+ sodipodi:cx="288.375"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125"
+ sodipodi:ry="3.3125"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ transform="matrix(0.90566,0,0,0.90566,9.830296,-35.68884)" />
+ <path
+ style="fill:#888a85;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 292.9564,-437.33396 C 292.95487,-434.6494 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.9564,-437.33396 292.9564,-437.33396 z"
+ id="path7888"
+ sodipodi:nodetypes="ccss" />
+ <g
+ id="g7890"
+ transform="matrix(1.142857,0,0,1.142857,-28.57139,67.00008)">
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-31.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7892"
+ style="opacity:1;fill:#c4c5c2;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0,0,1.056604,-31.19818,24.86331)"
+ d="M 291.6875,-437.59375 A 3.3125,3.3125 0 1 1 285.0625,-437.59375 A 3.3125,3.3125 0 1 1 291.6875,-437.59375 z"
+ sodipodi:ry="3.3125"
+ sodipodi:rx="3.3125"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.375"
+ id="path7896"
+ style="opacity:1;fill:url(#linearGradient5715);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path4978"
+ d="M 16.498705,17.499819 C 14.308985,17.499819 12.775105,18.835589 12.103155,21.343339 C 11.434695,20.999719 10.555565,20.509989 9.748705,20.509989 C 7.032195,20.509989 4.993565,22.448809 4.993575,25.055529 C 4.993575,25.602299 5.260785,26.388969 5.435535,26.877539 C 4.111105,27.605489 2.998705,28.768039 2.998705,30.250089 C 2.998705,32.596139 4.544875,34.500179 7.337985,34.500179 C 7.508795,34.500179 25.488624,34.500179 25.659424,34.500179 C 28.430434,34.500179 29.998704,32.596139 29.998704,30.250089 C 29.998704,28.657719 28.886304,27.583399 27.561874,26.855449 C 27.736634,26.366889 28.025944,25.602289 28.025944,25.055529 C 28.025944,22.448819 25.910134,20.487899 23.248714,20.487889 C 22.441844,20.487889 21.606904,20.977629 20.938444,21.321249 C 20.289594,18.899709 18.688434,17.499819 16.498705,17.499819 z"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-haze.svg b/demos/embedded/weatherinfo/icons/weather-haze.svg
new file mode 100644
index 0000000..f2d6671
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-haze.svg
@@ -0,0 +1,1121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48"
+ height="48"
+ id="svg14353"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ version="1.0"
+ sodipodi:docname="weather-haze.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-122"
+ inkscape:cy="24"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:showpageshadow="false"
+ showborder="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="982"
+ inkscape:window-height="965"
+ inkscape:window-x="1281"
+ inkscape:window-y="29"
+ borderlayer="false" />
+ <defs
+ id="defs14355">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8371">
+ <stop
+ style="stop-color:#e8d277;stop-opacity:1;"
+ offset="0"
+ id="stop8373" />
+ <stop
+ style="stop-color:#e8d277;stop-opacity:0;"
+ offset="1"
+ id="stop8375" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient9810">
+ <stop
+ style="stop-color:#ddc76e;stop-opacity:1;"
+ offset="0"
+ id="stop9812" />
+ <stop
+ style="stop-color:#e6d965;stop-opacity:0;"
+ offset="1"
+ id="stop9814" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient9636">
+ <stop
+ style="stop-color:#fce94f;stop-opacity:1;"
+ offset="0"
+ id="stop9638" />
+ <stop
+ style="stop-color:#fce94f;stop-opacity:0;"
+ offset="1"
+ id="stop9640" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient9362">
+ <stop
+ id="stop9364"
+ offset="0"
+ style="stop-color:#392100;stop-opacity:1;" />
+ <stop
+ id="stop9366"
+ offset="1"
+ style="stop-color:#392100;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7010">
+ <stop
+ style="stop-color:#aec2d7;stop-opacity:1;"
+ offset="0"
+ id="stop7012" />
+ <stop
+ id="stop9915"
+ offset="1"
+ style="stop-color:#81a0c1;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6825">
+ <stop
+ style="stop-color:#3a2400;stop-opacity:1;"
+ offset="0"
+ id="stop6827" />
+ <stop
+ id="stop6833"
+ offset="0.28565985"
+ style="stop-color:#8c5600;stop-opacity:1;" />
+ <stop
+ style="stop-color:#a36400;stop-opacity:1;"
+ offset="1"
+ id="stop6829" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6772">
+ <stop
+ style="stop-color:#888a85;stop-opacity:1;"
+ offset="0"
+ id="stop6774" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="1"
+ id="stop6776" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6764">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop6766" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop6768" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6746">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop6748" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop6750" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6728">
+ <stop
+ style="stop-color:#babdb6;stop-opacity:1;"
+ offset="0"
+ id="stop6730" />
+ <stop
+ style="stop-color:#babdb6;stop-opacity:0;"
+ offset="1"
+ id="stop6732" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6685">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6687" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop6689" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6631">
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0"
+ id="stop6633" />
+ <stop
+ id="stop6639"
+ offset="0.0343047"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.06714281"
+ id="stop6641" />
+ <stop
+ id="stop6643"
+ offset="0.08441304"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.13726114"
+ id="stop6645" />
+ <stop
+ id="stop6647"
+ offset="0.15779018"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.21104114"
+ id="stop6649" />
+ <stop
+ id="stop6651"
+ offset="0.23053712"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.27452311"
+ id="stop6653" />
+ <stop
+ id="stop6655"
+ offset="0.29490501"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.34954464"
+ id="stop6657" />
+ <stop
+ id="stop6659"
+ offset="0.36960241"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.4220143"
+ id="stop6675" />
+ <stop
+ id="stop6677"
+ offset="0.44345734"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.50078195"
+ id="stop6679" />
+ <stop
+ id="stop6681"
+ offset="0.52629334"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.57410157"
+ id="stop6683" />
+ <stop
+ id="stop6693"
+ offset="0.5898369"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.64333093"
+ id="stop6695" />
+ <stop
+ id="stop6697"
+ offset="0.66151941"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0.70865703"
+ id="stop6699" />
+ <stop
+ id="stop6701"
+ offset="0.72415513"
+ style="stop-color:#eeeeec;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="1"
+ id="stop6661" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient15161">
+ <stop
+ style="stop-color:#c3b49d;stop-opacity:0.3539823;"
+ offset="0"
+ id="stop15163" />
+ <stop
+ id="stop9310"
+ offset="1"
+ style="stop-color:#dcd070;stop-opacity:1;" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective14361" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15161"
+ id="linearGradient15167"
+ x1="21.285088"
+ y1="33.110512"
+ x2="21.285088"
+ y2="-0.0017124993"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9479167,0,0,0.9479167,1.2500007,1.2500003)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15161"
+ id="linearGradient15250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9479167,0,0,0.9479167,1.2500007,1.2500003)"
+ x1="21.285088"
+ y1="33.110512"
+ x2="21.285088"
+ y2="-0.0017124993" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6631"
+ id="linearGradient6637"
+ x1="-0.52151477"
+ y1="29.500589"
+ x2="18.516363"
+ y2="14.809909"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6685"
+ id="radialGradient6691"
+ cx="122"
+ cy="401.95938"
+ fx="122"
+ fy="401.95938"
+ r="6.7283827"
+ gradientTransform="matrix(-0.5944965,-3.8328271e-7,4.1781509e-7,-0.6480585,194.52841,528.49324)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6728"
+ id="linearGradient6734"
+ x1="15.072129"
+ y1="21.263441"
+ x2="17.008948"
+ y2="21.263441"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6728"
+ id="linearGradient6742"
+ x1="15.133464"
+ y1="32.587334"
+ x2="17.008692"
+ y2="32.587334"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6746"
+ id="linearGradient6752"
+ x1="15.526249"
+ y1="2.097311"
+ x2="15.526249"
+ y2="14.758003"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6764"
+ id="linearGradient6770"
+ x1="11.884123"
+ y1="10.724713"
+ x2="6.123559"
+ y2="29.316263"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6772"
+ id="linearGradient6778"
+ x1="7.8838124"
+ y1="18.558826"
+ x2="7.8838124"
+ y2="34.97258"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6825"
+ id="linearGradient6831"
+ x1="37.997959"
+ y1="18.245197"
+ x2="37.997959"
+ y2="39.658928"
+ gradientUnits="userSpaceOnUse" />
+ <pattern
+ patternUnits="userSpaceOnUse"
+ width="45.991676"
+ height="45.991676"
+ patternTransform="translate(-0.532328,52.691734)"
+ id="pattern7396">
+ <rect
+ y="0"
+ x="0"
+ height="45.991676"
+ width="45.991676"
+ id="rect15159"
+ style="fill:url(#linearGradient7399);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </pattern>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15161"
+ id="linearGradient7399"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9479167,0,0,0.9479167,0.2458325,0.2458356)"
+ x1="21.285088"
+ y1="33.110512"
+ x2="21.285088"
+ y2="-0.0017124993" />
+ <filter
+ id="filter8124"
+ inkscape:label="filter1"
+ width="11.589999999999989" />
+ <filter
+ id="filter8126"
+ inkscape:label="filter2" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient9360"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient9370"
+ gradientUnits="userSpaceOnUse"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056"
+ gradientTransform="translate(25.006402,2.9778958e-7)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient9374"
+ gradientUnits="userSpaceOnUse"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056"
+ gradientTransform="translate(35.006405,2.9778958e-7)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient9981"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.6999999,18,-122.2)"
+ x1="96"
+ y1="36"
+ x2="96"
+ y2="30" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient9983"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,90.020139,-27.933112)"
+ x1="6.0670195"
+ y1="46"
+ x2="6.0670195"
+ y2="20.59375" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient9985"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,93.329052,-27.775305)"
+ x1="14.197642"
+ y1="46"
+ x2="14.197642"
+ y2="20.593699" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient9987"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,96.870945,-27.775305)"
+ x1="23.1"
+ y1="46"
+ x2="23.1"
+ y2="20.592798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient9989"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,99.712841,-27.775305)"
+ x1="32.200001"
+ y1="46"
+ x2="32.200001"
+ y2="20.59375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7010"
+ id="radialGradient6968"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2893727,-0.2474294,0.6139915,0.7180729,9.91225,5.2335615)"
+ cx="17.055056"
+ cy="3.5953908"
+ fx="17.055056"
+ fy="3.5953908"
+ r="24" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient6977"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,4.6999999,-72,-123.2)"
+ x1="96"
+ y1="35.333096"
+ x2="96"
+ y2="30" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient6979"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,2.0139e-2,-28.933112)"
+ x1="6.0670195"
+ y1="46"
+ x2="6.0670195"
+ y2="20.59375" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient6981"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,3.329052,-28.775305)"
+ x1="14.197642"
+ y1="46"
+ x2="14.197642"
+ y2="20.593699" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient6983"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,6.870945,-28.775305)"
+ x1="23.1"
+ y1="46"
+ x2="23.1"
+ y2="20.592798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient6985"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,9.712841,-28.775305)"
+ x1="32.200001"
+ y1="46"
+ x2="32.200001"
+ y2="20.59375" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6825"
+ id="linearGradient7066"
+ gradientUnits="userSpaceOnUse"
+ x1="37.997959"
+ y1="18.245197"
+ x2="37.997959"
+ y2="39.658928" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6772"
+ id="linearGradient7068"
+ gradientUnits="userSpaceOnUse"
+ x1="7.8838124"
+ y1="18.558826"
+ x2="7.8838124"
+ y2="34.97258" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6728"
+ id="linearGradient7070"
+ gradientUnits="userSpaceOnUse"
+ x1="15.133464"
+ y1="32.587334"
+ x2="17.008692"
+ y2="32.587334" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6631"
+ id="linearGradient7072"
+ gradientUnits="userSpaceOnUse"
+ x1="-0.52151477"
+ y1="29.500589"
+ x2="18.516363"
+ y2="14.809909" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6685"
+ id="radialGradient7074"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.5944965,-3.8328271e-7,4.1781509e-7,-0.6480585,194.52841,528.49324)"
+ cx="122"
+ cy="401.95938"
+ fx="122"
+ fy="401.95938"
+ r="6.7283827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6728"
+ id="linearGradient7076"
+ gradientUnits="userSpaceOnUse"
+ x1="15.072129"
+ y1="21.263441"
+ x2="17.008948"
+ y2="21.263441" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6746"
+ id="linearGradient7078"
+ gradientUnits="userSpaceOnUse"
+ x1="15.526249"
+ y1="2.097311"
+ x2="15.526249"
+ y2="14.758003" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6764"
+ id="linearGradient7080"
+ gradientUnits="userSpaceOnUse"
+ x1="11.884123"
+ y1="10.724713"
+ x2="6.123559"
+ y2="29.316263" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient7082"
+ gradientUnits="userSpaceOnUse"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient7084"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(25.006402,2.9778958e-7)"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient7086"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(35.006405,2.9778958e-7)"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6825"
+ id="linearGradient7132"
+ gradientUnits="userSpaceOnUse"
+ x1="37.997959"
+ y1="18.245197"
+ x2="37.997959"
+ y2="39.658928" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6772"
+ id="linearGradient7134"
+ gradientUnits="userSpaceOnUse"
+ x1="7.8838124"
+ y1="18.558826"
+ x2="7.8838124"
+ y2="34.97258" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6728"
+ id="linearGradient7136"
+ gradientUnits="userSpaceOnUse"
+ x1="15.133464"
+ y1="32.587334"
+ x2="17.008692"
+ y2="32.587334" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6631"
+ id="linearGradient7138"
+ gradientUnits="userSpaceOnUse"
+ x1="-0.52151477"
+ y1="29.500589"
+ x2="18.516363"
+ y2="14.809909" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6685"
+ id="radialGradient7140"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.5944965,-3.8328271e-7,4.1781509e-7,-0.6480585,194.52841,528.49324)"
+ cx="122"
+ cy="401.95938"
+ fx="122"
+ fy="401.95938"
+ r="6.7283827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6728"
+ id="linearGradient7142"
+ gradientUnits="userSpaceOnUse"
+ x1="15.072129"
+ y1="21.263441"
+ x2="17.008948"
+ y2="21.263441" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6746"
+ id="linearGradient7144"
+ gradientUnits="userSpaceOnUse"
+ x1="15.526249"
+ y1="2.097311"
+ x2="15.526249"
+ y2="14.758003" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6764"
+ id="linearGradient7146"
+ gradientUnits="userSpaceOnUse"
+ x1="11.884123"
+ y1="10.724713"
+ x2="6.123559"
+ y2="29.316263" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient7148"
+ gradientUnits="userSpaceOnUse"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient7150"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(25.006402,2.9778958e-7)"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9362"
+ id="linearGradient7152"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(35.006405,2.9778958e-7)"
+ x1="8.5806656"
+ y1="20.995518"
+ x2="8.5806656"
+ y2="23.085056" />
+ <filter
+ inkscape:collect="always"
+ id="filter7663"
+ x="-0.1147047"
+ width="1.2294094"
+ y="-0.12580788"
+ height="1.2516158">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2006423"
+ id="feGaussianBlur7665" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient7668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,9.712841,-28.775305)"
+ x1="32.200001"
+ y1="46"
+ x2="32.200001"
+ y2="20.59375" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient7671"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,6.870945,-28.775305)"
+ x1="23.1"
+ y1="46"
+ x2="23.1"
+ y2="32.256355" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient7674"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,3.329052,-28.775305)"
+ x1="14.197642"
+ y1="46"
+ x2="14.197642"
+ y2="20.593699" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9810"
+ id="linearGradient7677"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6289807,2.0139e-2,-28.933112)"
+ x1="6.0670195"
+ y1="46"
+ x2="6.0670195"
+ y2="33.256096" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8371"
+ id="linearGradient8377"
+ x1="24"
+ y1="45.998173"
+ x2="24"
+ y2="2.0644991"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <metadata
+ id="metadata14358">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:url(#radialGradient6968);fill-opacity:1;fill-rule:evenodd;stroke:#132c50;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14363"
+ width="47"
+ height="47"
+ x="0.5"
+ y="0.5" />
+ <g
+ id="g7018"
+ transform="translate(-1.6037056e-2,3.090275e-2)">
+ <path
+ sodipodi:nodetypes="cccccccccccccccccc"
+ id="path7020"
+ d="M 1.5112736,46.463508 L 46.518528,46.463508 L 46.518528,20.097311 L 42.49936,11.994593 L 37.997439,20.097311 L 33.503201,11.994593 L 29.51269,20.097311 L 29.51269,40.518226 L 17.513556,40.518226 L 17.513556,15.979513 L 18.991385,15.979513 L 15.625234,5.482499 L 11.994559,15.979622 L 13.487574,15.979622 L 13.487574,22.494238 L 8.5736236,16.493825 L 1.5112736,16.493825 L 1.5112736,46.463508 z"
+ style="fill:#888a85;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path7022"
+ d="M 46.499202,19.996278 L 46.499164,39.496968 L 29.497928,39.514749 L 29.496716,20.073218 L 33.471729,13.30179 L 37.969149,19.742327 L 42.464705,13.30179 L 46.499202,19.996278 z"
+ style="fill:url(#linearGradient7066);fill-opacity:1;fill-rule:evenodd;stroke:#331f00;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path7024"
+ d="M 30.4991,19.359794 L 30.495194,38.512814 L 45.998784,38.497189"
+ style="opacity:0.25;fill:none;fill-rule:evenodd;stroke:#eeeeec;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <rect
+ y="14.973112"
+ x="13.484319"
+ height="24.544136"
+ width="4.027225"
+ id="rect7026"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="25.958162"
+ x="1.5003295"
+ height="13.560402"
+ width="14.000328"
+ id="rect7028"
+ style="fill:url(#linearGradient7068);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path7030"
+ d="M 16.000204,26.158288 L 17.008692,26.165076 L 17.006997,39.016383 L 16.000204,39.016383 L 16.000204,26.158288 z"
+ style="fill:url(#linearGradient7070);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path7032"
+ d="M 1.5018555,16.471187 L 1.5018555,26.192359 L 16.519497,26.192359 L 8.5470601,16.471187 L 1.5018555,16.471187 z"
+ style="fill:#7f4f01;fill-opacity:1;fill-rule:evenodd;stroke:#392100;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path7034"
+ d="M 46.494238,19.981528 L 42.46863,15.428034 L 37.978753,20.107557 L 33.495519,15.782001 L 28.445309,22.028089 L 33.475653,11.989135 L 37.973073,19.908885 L 42.468629,12.0045 L 46.494238,19.981528 z"
+ style="fill:#d3d7cf;fill-rule:evenodd;stroke:#d3d7cf;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path7036"
+ d="M 1.9983315,16.96932 L 1.9983315,25.690091 L 15.466816,25.690091 L 8.3170492,16.96932 L 1.9983315,16.96932 z"
+ style="opacity:0.5;fill:url(#linearGradient7072);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient7074);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path7038"
+ d="M 15.632485,5.4903604 L 12.001677,15.991016 L 19.003769,15.992368 L 15.632485,5.4903604 z"
+ style="fill:#532323;fill-opacity:1;fill-rule:evenodd;stroke:#2a1111;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccscc"
+ id="path7040"
+ d="M 13.983416,22.32144 L 13.983416,16.492941 L 17.007669,16.492941 L 17.007669,21.219904 L 17.008948,26.033783 C 17.008949,26.039055 16.935124,25.911261 16.894583,25.856332 L 13.983416,22.32144 z"
+ style="fill:url(#linearGradient7076);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path7042"
+ d="M 15.595391,8.6350832 L 13.413573,14.980794 L 17.638924,14.980794 L 15.595391,8.6350832 z"
+ style="opacity:0.5;fill:none;fill-rule:evenodd;stroke:url(#linearGradient7078);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path7044"
+ d="M 1.9974392,25.190652 L 14.412292,25.190652 L 8.0819463,17.470171 L 2.0013455,17.470171"
+ style="opacity:0.5;fill:none;fill-rule:evenodd;stroke:url(#linearGradient7080);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <g
+ style="fill:#fce94f"
+ id="g7046">
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7048"
+ width="2"
+ height="2"
+ x="30.999861"
+ y="22.002562" />
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7050"
+ width="2"
+ height="2"
+ x="34.001801"
+ y="22.000923" />
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7052"
+ width="2"
+ height="2"
+ x="40.997707"
+ y="22.000923" />
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7054"
+ width="2"
+ height="2"
+ x="9.0004454"
+ y="22.002562" />
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7056"
+ width="2"
+ height="2"
+ x="6.0018048"
+ y="22.002562" />
+ </g>
+ <g
+ id="g7058">
+ <path
+ style="fill:url(#linearGradient7082);fill-opacity:1;fill-rule:evenodd;stroke:#392100;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 4.4711906,23.06274 L 5.7618436,21.495518 L 11.216391,21.495518 L 12.507043,23.06274"
+ id="path7060"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:url(#linearGradient7084);fill-opacity:1;fill-rule:evenodd;stroke:#392100;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 29.477593,23.06274 L 30.768246,21.495518 L 36.222793,21.495518 L 37.513445,23.06274"
+ id="path7062"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:url(#linearGradient7086);fill-opacity:1;fill-rule:evenodd;stroke:#392100;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 39.477596,23.06274 L 40.768249,21.495518 L 43.203584,21.495518 L 44.822027,23.06274"
+ id="path7064"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ <g
+ id="g6993"
+ transform="translate(-7.6824584e-3,3.0729835e-2)"
+ style="filter:url(#filter7663);opacity:0.6">
+ <path
+ sodipodi:nodetypes="cccccccccccccccccc"
+ id="path15135"
+ d="M 1.4995548,46.463508 L 46.518528,46.463508 L 46.518528,20.097311 L 42.49936,11.994593 L 37.997439,20.097311 L 33.503201,11.994593 L 29.51269,20.097311 L 29.51269,40.518226 L 17.513556,40.518226 L 17.513556,15.979513 L 18.991385,15.979513 L 15.625234,5.482499 L 11.994559,15.979622 L 13.487574,15.979622 L 13.487574,22.494238 L 8.5736236,16.493825 L 1.4995548,16.493825 L 1.4995548,46.463508 z"
+ style="fill:#888a85;fill-rule:evenodd;stroke:#888a85;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path6819"
+ d="M 46.499202,19.996278 L 46.499164,39.496968 L 29.497928,39.514749 L 29.496716,20.073218 L 33.471729,13.30179 L 37.969149,19.742327 L 42.464705,13.30179 L 46.499202,19.996278 z"
+ style="fill:url(#linearGradient7132);fill-opacity:1;fill-rule:evenodd;stroke:#331f00;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path6843"
+ d="M 30.4991,19.359794 L 30.495194,38.512814 L 45.998784,38.497189"
+ style="opacity:0.25000000000000000;fill:none;fill-rule:evenodd;stroke:#eeeeec;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <rect
+ y="14.973112"
+ x="13.484319"
+ height="24.544136"
+ width="4.027225"
+ id="rect6714"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="25.958162"
+ x="1.5003295"
+ height="13.560402"
+ width="14.000328"
+ id="rect6611"
+ style="fill:url(#linearGradient7134);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path6718"
+ d="M 16.000204,26.158288 L 17.008692,26.165076 L 17.006997,39.016383 L 16.000204,39.016383 L 16.000204,26.158288 z"
+ style="fill:url(#linearGradient7136);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path6607"
+ d="M 1.5018555,16.471187 L 1.5018555,26.192359 L 16.519497,26.192359 L 8.5470601,16.471187 L 1.5018555,16.471187 z"
+ style="fill:#7f4f01;fill-opacity:1;fill-rule:evenodd;stroke:#392100;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path6817"
+ d="M 46.494238,19.981528 L 42.46863,15.428034 L 37.978753,20.107557 L 33.495519,15.782001 L 28.445309,22.028089 L 33.475653,11.989135 L 37.973073,19.908885 L 42.468629,12.0045 L 46.494238,19.981528 z"
+ style="fill:#d3d7cf;fill-rule:evenodd;stroke:#d3d7cf;stroke-width:1.10000002000000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path6629"
+ d="M 1.9983315,16.96932 L 1.9983315,25.690091 L 15.466816,25.690091 L 8.3170492,16.96932 L 1.9983315,16.96932 z"
+ style="opacity:0.50000000000000000;fill:url(#linearGradient7138);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient7140);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6712"
+ d="M 15.632485,5.4903604 L 12.001677,15.991016 L 19.003769,15.992368 L 15.632485,5.4903604 z"
+ style="fill:#532323;fill-opacity:1;fill-rule:evenodd;stroke:#2a1111;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccscc"
+ id="path6716"
+ d="M 13.983416,22.32144 L 13.983416,16.492941 L 17.007669,16.492941 L 17.007669,21.219904 L 17.008948,26.033783 C 17.008949,26.039055 16.935124,25.911261 16.894583,25.856332 L 13.983416,22.32144 z"
+ style="fill:url(#linearGradient7142);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6744"
+ d="M 15.595391,8.6350832 L 13.413573,14.980794 L 17.638924,14.980794 L 15.595391,8.6350832 z"
+ style="opacity:0.50000000000000000;fill:none;fill-rule:evenodd;stroke:url(#linearGradient7144);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6754"
+ d="M 1.9974392,25.190652 L 14.412292,25.190652 L 8.0819463,17.470171 L 2.0013455,17.470171"
+ style="opacity:0.50000000000000000;fill:none;fill-rule:evenodd;stroke:url(#linearGradient7146);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <g
+ style="fill:#fce94f"
+ id="g6598">
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect15193"
+ width="2"
+ height="2"
+ x="30.999861"
+ y="22.002562" />
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect15201"
+ width="2"
+ height="2"
+ x="34.001801"
+ y="22.000923" />
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect15213"
+ width="2"
+ height="2"
+ x="40.997707"
+ y="22.000923" />
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect15231"
+ width="2"
+ height="2"
+ x="9.0004454"
+ y="22.002562" />
+ <rect
+ style="fill:#fce94f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect15235"
+ width="2"
+ height="2"
+ x="6.0018048"
+ y="22.002562" />
+ </g>
+ <g
+ id="g6422">
+ <path
+ style="fill:url(#linearGradient7148);fill-opacity:1;fill-rule:evenodd;stroke:#392100;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 4.4711906,23.06274 L 5.7618436,21.495518 L 11.216391,21.495518 L 12.507043,23.06274"
+ id="path9350"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:url(#linearGradient7150);fill-opacity:1;fill-rule:evenodd;stroke:#392100;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 29.477593,23.06274 L 30.768246,21.495518 L 36.222793,21.495518 L 37.513445,23.06274"
+ id="path9368"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:url(#linearGradient7152);fill-opacity:1;fill-rule:evenodd;stroke:#392100;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 39.477596,23.06274 L 40.768249,21.495518 L 43.203584,21.495518 L 44.822027,23.06274"
+ id="path9372"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ <rect
+ style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#eeeeec;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect15237"
+ width="45"
+ height="45"
+ x="1.5"
+ y="1.5" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient8377);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect9717"
+ width="44"
+ height="43.933674"
+ x="2"
+ y="2.0644991" />
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-icy.svg b/demos/embedded/weatherinfo/icons/weather-icy.svg
new file mode 100644
index 0000000..fe42860
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-icy.svg
@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48"
+ height="48"
+ id="svg6619"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ version="1.0"
+ sodipodi:docname="weather-icy.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs6621">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7440">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop7442" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop7444" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7430">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop7432" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop7434" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7392">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop7394" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop7396" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7380">
+ <stop
+ style="stop-color:#cedeef;stop-opacity:1;"
+ offset="0"
+ id="stop7382" />
+ <stop
+ style="stop-color:#cedeef;stop-opacity:0;"
+ offset="1"
+ id="stop7384" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective6627" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7380"
+ id="linearGradient7386"
+ x1="18.165867"
+ y1="9.2548895"
+ x2="20.711481"
+ y2="21.572344"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7392"
+ id="radialGradient7398"
+ cx="17.700384"
+ cy="13.797695"
+ fx="17.700384"
+ fy="13.797695"
+ r="1.4135723"
+ gradientTransform="matrix(1,0,0,1.0652174,6.1248392e-7,-0.8998502)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7392"
+ id="radialGradient7402"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0652174,6.1248392e-7,-0.8998502)"
+ cx="17.700384"
+ cy="13.797695"
+ fx="17.700384"
+ fy="13.797695"
+ r="1.4135723" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7430"
+ id="radialGradient7438"
+ cx="10.693982"
+ cy="16.471191"
+ fx="10.693982"
+ fy="16.471191"
+ r="0.553137"
+ gradientTransform="matrix(2.1647007,0,0,0.8888889,-12.455288,1.8301322)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7440"
+ id="radialGradient7448"
+ cx="10.693982"
+ cy="16.471191"
+ fx="10.693982"
+ fy="16.471191"
+ r="0.553137"
+ gradientTransform="matrix(2.2783611,0,0,0.8888889,-13.670771,1.8301322)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="31.408407"
+ inkscape:cy="30.326192"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="982"
+ inkscape:window-height="965"
+ inkscape:window-x="1280"
+ inkscape:window-y="28" />
+ <metadata
+ id="metadata6624">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g7906">
+ <path
+ id="path7342"
+ d="M 24 10.375 C 11.701921 10.375 1.71875 12.767211 1.71875 15.71875 C 1.71875 17.498261 5.3609075 19.059125 10.9375 20.03125 L 14.3125 46.90625 L 17.9375 26.1875 L 21.3125 41.90625 L 25.5625 23.71875 L 28.03125 37.6875 L 32.3125 22.9375 L 34.84375 33.0625 L 38.375 19.8125 C 43.199321 18.83144 46.28125 17.354051 46.28125 15.71875 C 46.28125 12.767211 36.298079 10.375 24 10.375 z "
+ style="fill:#729fcf;fill-rule:evenodd;stroke:#204a87;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cssssscssssscscssssszsssssc"
+ id="path7150"
+ d="M 24.013525,20.535861 C 29.915498,20.535861 35.256377,19.860148 39.169775,19.061611 C 41.126474,18.662343 42.702812,18.185066 43.857275,17.628422 C 45.011738,17.071777 45.794775,16.382816 45.794775,15.758562 C 45.794775,15.111496 45.011739,14.383887 43.857275,13.827243 C 42.702811,13.270598 41.126474,12.706404 39.169775,12.307136 C 35.256377,11.508599 29.915498,10.878502 24.013525,10.878502 C 18.111552,10.878502 12.739423,11.552057 8.826025,12.350594 C 6.8693258,12.749862 5.2929887,13.270598 4.138525,13.827243 C 2.9840613,14.383887 2.201025,14.939123 2.201025,15.758562 C 2.201025,16.578001 2.9840613,17.071777 4.138525,17.628422 C 5.2929887,18.185066 6.8693258,18.662343 8.826025,19.061611 M 8.826025,19.061611 C 12.739423,19.860148 18.111552,20.535861 24.013525,20.535861 M 24.013525,11.738416 C 29.832893,11.738416 35.083852,12.397075 38.857275,13.16705 C 40.743987,13.552037 42.268014,14.087721 43.263525,14.567724 C 44.259036,15.047727 44.669775,15.382119 44.669775,15.758562 C 44.669775,16.135005 44.259035,16.407937 43.263525,16.88794 C 42.268015,17.367943 40.743986,17.840596 38.857275,18.225584 C 35.083852,18.995559 29.832893,19.652061 24.013525,19.652061 C 18.194157,19.652061 12.911948,18.995559 9.138525,18.225584 C 7.2518134,17.840596 5.7277856,17.367943 4.732275,16.88794 C 3.7367644,16.407937 3.326025,16.135005 3.326025,15.758562 C 3.326025,15.382119 3.7367644,15.047727 4.732275,14.567724 C 5.7277856,14.087721 7.2518134,13.595495 9.138525,13.210508 C 12.911948,12.440533 18.194157,11.738416 24.013525,11.738416 z"
+ style="opacity:0.5;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.14379668;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path7140"
+ d="M 20.220231,11.00128 L 29.138835,20.368103 L 24.21511,20.523801 L 15.180538,11.370038 L 20.220231,11.00128 z"
+ style="fill:#cedeef;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccccccccc"
+ id="path7355"
+ d="M 11.915494,19.751601 L 14.481435,40.163892 L 16.883534,26.331262 C 17.063009,24.706837 18.883373,24.906404 18.990928,26.307141 L 21.349551,37.344431 L 24.506026,23.859196 C 24.638961,22.408831 26.471791,22.275606 26.60475,23.905247 L 28.263765,33.272727 L 31.29544,22.83487 C 31.632247,21.540581 33.13534,21.733731 33.309125,22.813719 L 34.878361,29.055058 L 37.413573,19.544174"
+ style="fill:none;fill-rule:evenodd;stroke:#eeeeec;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:7;stroke-dasharray:none;opacity:0.5" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path7358"
+ d="M 24.796795,10.87836 L 33.030717,20.024802 L 31.057055,20.187957 L 22.768625,10.889409 L 24.796795,10.87836 z"
+ style="fill:#cedeef;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path7364"
+ d="M 28.334973,10.980368 L 36.114053,19.582843 L 35.115621,19.734949 L 27.305235,10.925125 L 28.334973,10.980368 z"
+ style="fill:#cedeef;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ id="path7372"
+ d="M 24.276568,13.090909 C 16.315524,13.346336 6.9039601,14.217661 2.7042254,16.717029 C 1.2906531,14.934699 3.0729833,13.828425 9.2804097,12.230474 C 14.942786,11.172151 20.784867,10.869471 24.346019,10.869471 C 29.101893,10.979193 33.366216,11.259555 39.81653,12.450903 C 39.81653,12.450903 46.858243,14.197968 45.56759,16.287597 C 41.461334,13.814622 33.948682,12.944657 24.276568,13.090909 z"
+ style="fill:url(#linearGradient7386);fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
+ <path
+ transform="matrix(2.1222827,0,0,1.9923469,-21.167011,-16.108233)"
+ d="M 19.113956,13.797695 A 1.4135723,1.5057619 0 1 1 16.286812,13.797695 A 1.4135723,1.5057619 0 1 1 19.113956,13.797695 z"
+ sodipodi:ry="1.5057619"
+ sodipodi:rx="1.4135723"
+ sodipodi:cy="13.797695"
+ sodipodi:cx="17.700384"
+ id="path7390"
+ style="opacity:1;fill:url(#radialGradient7398);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:7;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.8078704,0,0,1.0169271,-3.0298763,-5.1757356)"
+ d="M 11.247119,16.471191 A 0.553137,0.49167734 0 1 1 10.140845,16.471191 A 0.553137,0.49167734 0 1 1 11.247119,16.471191 z"
+ sodipodi:ry="0.49167734"
+ sodipodi:rx="0.553137"
+ sodipodi:cy="16.471191"
+ sodipodi:cx="10.693982"
+ id="path7416"
+ style="opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:7;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(4.4701088,0,0,4.6249999,-65.908816,-42.825863)"
+ d="M 19.113956,13.797695 A 1.4135723,1.5057619 0 1 1 16.286812,13.797695 A 1.4135723,1.5057619 0 1 1 19.113956,13.797695 z"
+ sodipodi:ry="1.5057619"
+ sodipodi:rx="1.4135723"
+ sodipodi:cy="13.797695"
+ sodipodi:cx="17.700384"
+ id="path7400"
+ style="opacity:1;fill:url(#radialGradient7402);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:7;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(4.5196759,0,0,1.0169271,-35.029811,3.0059967)"
+ d="M 11.247119,16.471191 A 0.553137,0.49167734 0 1 1 10.140845,16.471191 A 0.553137,0.49167734 0 1 1 11.247119,16.471191 z"
+ sodipodi:ry="0.49167734"
+ sodipodi:rx="0.553137"
+ sodipodi:cy="16.471191"
+ sodipodi:cx="10.693982"
+ id="path7418"
+ style="opacity:1;fill:url(#radialGradient7438);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:7;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0,4.5196759,-2.0338541,0,46.913063,-27.253478)"
+ d="M 11.247119,16.471191 A 0.553137,0.49167734 0 1 1 10.140845,16.471191 A 0.553137,0.49167734 0 1 1 11.247119,16.471191 z"
+ sodipodi:ry="0.49167734"
+ sodipodi:rx="0.553137"
+ sodipodi:cy="16.471191"
+ sodipodi:cx="10.693982"
+ id="path7420"
+ style="opacity:1;fill:url(#radialGradient7448);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:7;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-overcast.svg b/demos/embedded/weatherinfo/icons/weather-overcast.svg
new file mode 100644
index 0000000..35fb4a4
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-overcast.svg
@@ -0,0 +1,3036 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/rcollier/Work/Novell/Tango/weather"
+ sodipodi:docname="weather-overcast.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective361" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient10670"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient10668"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient10666"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient10664"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient10662"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient10660"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient10658"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient10656"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient10654"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient10652"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient10650"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient10648"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient10646"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient10644"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7834">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop7836" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop7838" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7834"
+ id="linearGradient10642"
+ gradientUnits="userSpaceOnUse"
+ x1="-156.29044"
+ y1="-100.53421"
+ x2="-153.09810"
+ y2="-96.544556" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8397">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8400" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient10640"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8315">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8317" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8319" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient10638"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8381">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8383" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8385" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient10636"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8331">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8333" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8335" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient10634"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8302">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8304" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8306" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient10632"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69.00259,102.0000)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3019">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3021" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3023" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2298"
+ id="linearGradient2861"
+ gradientUnits="userSpaceOnUse"
+ x1="-27.006643"
+ y1="-37.550461"
+ x2="-34.700153"
+ y2="-4.4493785" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient2859"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient2857"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4488">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4490" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4492" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3478">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3480" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3482" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2298">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2300" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2302" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:0;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2527">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop2529" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="1"
+ id="stop2531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2500">
+ <stop
+ style="stop-color:#fce94f;stop-opacity:1;"
+ offset="0"
+ id="stop2502" />
+ <stop
+ style="stop-color:#fce94f;stop-opacity:0;"
+ offset="1"
+ id="stop2504" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2392">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2394" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2396" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2254">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2256" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2258" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2263"
+ gradientUnits="userSpaceOnUse"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581"
+ gradientTransform="translate(-1.608757,3.097272)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2271"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2283"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2287"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2291"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2295"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2299"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2303"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.707748,-5.784024)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(16.14002,24.66420)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.932144,25.87240)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.356636,23.86870)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(11.19027,26.52035)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2358"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(10.30638,19.27251)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.207586,21.30544)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2398"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.608757,3.097272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2442"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2446"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2451"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2469"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2475"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2478"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2483"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.842481,-3.998086)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2506"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2509"
+ gradientUnits="userSpaceOnUse"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2513"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ x1="38.857941"
+ y1="-18.407482"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2517"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient2533"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(17.33814,3.415985)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2541"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2555"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.499805,1.708617)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.726830,2.481141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="linearGradient3353"
+ x1="23.303862"
+ y1="29.115711"
+ x2="29.750000"
+ y2="46.092930"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3386"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3398"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.561802,-4.303373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2916"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2914"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2912"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2910"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2908"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2906"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2904"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2902"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2900"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2898"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2896"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2894"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2892"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2890"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2888"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2886"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2884"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2882"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2880"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2878"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2876"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2874"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2872"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2870"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2868"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2866"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2864"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2862"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2860"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2858"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2856"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient2854"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2852"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2850"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2848"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2846"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient2844"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2842"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2840"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2838"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient2836"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2834"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2832"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2830"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2828"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2826"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2824"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2822"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2820"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2818"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2816"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2814"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2812"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2810"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2808"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2806"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2804"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2802"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2800"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2798"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2796"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2794"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient2792"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2790"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2788"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2786"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2784"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2782"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2780"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2778"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2776"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2774"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2772"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2770"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2768"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2766"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2764"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2762"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2760"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2758"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2756"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2754"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2752"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2750"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2748"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2746"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2744"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(41.44608,-6.716447)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(46.60985,-8.845141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(52.31848,-6.318491)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,42.85737,-2.200849)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4442"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,57.93093,-1.243739)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,37.36747,-8.003450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4446"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,49.43869,-3.313289)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4464"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(41.44608,-6.716447)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4466"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(46.60985,-8.845141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4468"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(52.31848,-6.318491)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4470"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,42.85737,-2.200849)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,57.93093,-1.243739)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4474"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,37.36747,-8.003450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4476"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,49.43869,-3.313289)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4538"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(41.44608,-6.716447)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4540"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(46.60985,-8.845141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4542"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(52.31848,-6.318491)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4544"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,42.85737,-2.200849)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4546"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,57.93093,-1.243739)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4548"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,37.36747,-8.003450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient4550"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,49.43869,-3.313289)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient4552"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.927204,0.000000,0.000000,0.882329,2.105168,3.373861)"
+ x1="17.181321"
+ y1="32.443652"
+ x2="47.342173"
+ y2="32.443652" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2276"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,2.081767,3.390390)"
+ x1="17.181321"
+ y1="32.443652"
+ x2="47.342173"
+ y2="32.443652" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2289"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.931230,0.000000,0.000000,0.881886,-13.99458,-6.609596)"
+ x1="17.181321"
+ y1="32.443652"
+ x2="47.342173"
+ y2="32.443652" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3025"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3029"
+ gradientUnits="userSpaceOnUse"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3033"
+ gradientUnits="userSpaceOnUse"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3037"
+ gradientUnits="userSpaceOnUse"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3041"
+ gradientUnits="userSpaceOnUse"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3045"
+ gradientUnits="userSpaceOnUse"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3049"
+ gradientUnits="userSpaceOnUse"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3053"
+ gradientUnits="userSpaceOnUse"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3056"
+ gradientUnits="userSpaceOnUse"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641"
+ gradientTransform="translate(3.437500,-3.000000)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3060"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-6.911612,2.585786)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3064"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.146447,8.838835e-2)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3068"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,13.66667,3.000000)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3072"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.66667,8.000000)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3076"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.698434,10.27557)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3080"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.68234,16.99480)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3107"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.437500,-3.000000)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3109"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-6.911612,2.585786)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3111"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.146447,8.838835e-2)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3113"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,13.66667,3.000000)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3115"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.66667,8.000000)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3117"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.698434,10.27557)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient3119"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.68234,16.99480)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313709"
+ inkscape:cx="8.6163343"
+ inkscape:cy="24.822365"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1210"
+ inkscape:window-height="704"
+ inkscape:window-x="182"
+ inkscape:window-y="144"
+ inkscape:showpageshadow="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-overcast</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan Collier (pseudo)</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>applet</rdf:li>
+ <rdf:li>notify</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g10011"
+ transform="translate(-287.0000,298.0000)">
+ <path
+ id="path8267"
+ d="M 311.50259,-296.00000 C 308.73017,-296.00000 306.39436,-294.42629 305.09634,-292.18750 C 304.15198,-292.66254 303.13115,-293.00000 302.00259,-293.00000 C 298.13859,-293.00000 295.00259,-289.86400 295.00259,-286.00000 C 295.00259,-282.13600 298.13859,-279.00000 302.00259,-279.00000 C 304.42226,-279.00000 306.43268,-280.31932 307.69009,-282.18750 C 308.82429,-281.49788 310.07907,-281.00000 311.50259,-281.00000 C 312.41571,-281.00000 313.25554,-281.23202 314.06509,-281.53125 C 314.57503,-280.66352 315.24421,-279.95153 316.06509,-279.37500 C 316.05785,-279.24462 316.00259,-279.13218 316.00259,-279.00000 C 316.00259,-275.13600 319.13858,-272.00000 323.00259,-272.00000 C 326.86659,-272.00000 330.00259,-275.13600 330.00259,-279.00000 C 330.00259,-281.36969 328.74361,-283.35834 326.94009,-284.62500 C 326.94733,-284.75538 327.00259,-284.86782 327.00259,-285.00000 C 327.00259,-288.86400 323.86660,-292.00000 320.00259,-292.00000 C 319.37989,-292.00000 318.82740,-291.77781 318.25259,-291.62500 C 317.05806,-294.18384 314.51125,-296.00000 311.50259,-296.00000 z "
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path8291"
+ d="M 311.50259,-295.00000 C 308.72211,-295.00000 306.36808,-293.23815 305.44009,-290.78125 C 304.45467,-291.49069 303.30866,-292.00000 302.00259,-292.00000 C 298.69059,-292.00000 296.00259,-289.31200 296.00259,-286.00000 C 296.00259,-282.68800 298.69059,-280.00000 302.00259,-280.00000 C 304.43034,-280.00000 306.49583,-281.45558 307.44009,-283.53125 C 308.56085,-282.61369 309.94223,-282.00000 311.50259,-282.00000 C 312.57713,-282.00000 313.54687,-282.31896 314.44009,-282.78125 C 314.83849,-281.78149 315.54123,-280.99493 316.37759,-280.34375 C 316.19758,-279.74813 316.00259,-279.15410 316.00259,-278.50000 C 316.00259,-274.91200 318.91459,-272.00000 322.50259,-272.00000 C 326.09059,-272.00000 329.00259,-274.91200 329.00259,-278.50000 C 329.00259,-280.86079 327.66826,-282.83019 325.78384,-283.96875 C 325.84643,-284.31598 326.00259,-284.63483 326.00259,-285.00000 C 326.00259,-288.31200 323.31459,-291.00000 320.00259,-291.00000 C 319.14961,-291.00000 318.33129,-290.82132 317.59634,-290.50000 C 316.74257,-293.09388 314.38110,-294.99999 311.50259,-295.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient10632);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.964447,0.000000,0.000000,0.964447,89.29111,91.52621)"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ sodipodi:ry="6.7396116"
+ sodipodi:rx="6.7396116"
+ sodipodi:cy="-383.66660"
+ sodipodi:cx="241.80843"
+ id="path8414"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <g
+ transform="translate(69.00259,102.0000)"
+ id="g8349">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8327"
+ sodipodi:cx="243.95184"
+ sodipodi:cy="-389.30136"
+ sodipodi:rx="6.2313786"
+ sodipodi:ry="6.2313786"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,27.18078,-46.89094)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10634);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8329"
+ sodipodi:cx="243.95184"
+ sodipodi:cy="-389.30136"
+ sodipodi:rx="6.2313786"
+ sodipodi:ry="6.2313786"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,27.18078,-46.89094)" />
+ </g>
+ <g
+ transform="translate(69.00259,102.0000)"
+ id="g8389">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8368"
+ sodipodi:cx="251.22179"
+ sodipodi:cy="-385.78790"
+ sodipodi:rx="6.0325046"
+ sodipodi:ry="6.0325046"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,21.45407,-34.76637)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10636);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8370"
+ sodipodi:cx="251.22179"
+ sodipodi:cy="-385.78790"
+ sodipodi:rx="6.0325046"
+ sodipodi:ry="6.0325046"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,21.45407,-34.76637)" />
+ </g>
+ <g
+ transform="translate(69.00259,102.0000)"
+ id="g8323">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8311"
+ sodipodi:cx="233.43362"
+ sodipodi:cy="-387.88715"
+ sodipodi:rx="4.3752232"
+ sodipodi:ry="4.3752232"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,-33.76771,55.27704)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10638);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8313"
+ sodipodi:cx="233.43362"
+ sodipodi:cy="-387.88715"
+ sodipodi:rx="4.3752232"
+ sodipodi:ry="4.3752232"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,-33.76771,55.27704)" />
+ </g>
+ <g
+ transform="translate(69.00259,102.0000)"
+ id="g8406">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8393"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,-9.150940,14.48994)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10640);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8395"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,-9.150933,14.48993)" />
+ </g>
+ <g
+ style="stroke:none"
+ transform="matrix(0.935028,0.000000,0.000000,0.935028,446.8280,-187.6162)"
+ id="g4518">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:0.33115697;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path4520"
+ sodipodi:cx="-155.06250"
+ sodipodi:cy="-96.937500"
+ sodipodi:rx="3.1250000"
+ sodipodi:ry="3.1250000"
+ d="M -151.93750 -96.937500 A 3.1250000 3.1250000 0 1 1 -158.18750,-96.937500 A 3.1250000 3.1250000 0 1 1 -151.93750 -96.937500 z"
+ transform="matrix(1.737733,0.000000,0.000000,1.737733,110.8322,70.07649)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10642);fill-opacity:1.0000000;stroke:none;stroke-width:0.45224530;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path4522"
+ sodipodi:cx="-155.06250"
+ sodipodi:cy="-96.937500"
+ sodipodi:rx="3.1250000"
+ sodipodi:ry="3.1250000"
+ d="M -151.93750 -96.937500 A 3.1250000 3.1250000 0 1 1 -158.18750,-96.937500 A 3.1250000 3.1250000 0 1 1 -151.93750 -96.937500 z"
+ transform="matrix(1.737733,0.000000,0.000000,1.737733,110.8948,70.01402)" />
+ </g>
+ <g
+ transform="translate(38.00259,162.0000)"
+ id="g7794">
+ <path
+ style="fill:#c4c5c2;fill-opacity:1.0000000;stroke:#888a85;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-445.50000 C 278.22917,-445.50000 276.39009,-443.94972 275.78125,-441.87500 C 275.08802,-442.23883 274.33674,-442.50000 273.50000,-442.50000 C 270.74000,-442.50000 268.49999,-440.26001 268.50000,-437.50000 C 268.50000,-436.92107 268.66252,-436.39230 268.84375,-435.87500 C 267.47028,-435.10426 266.50000,-433.68600 266.50000,-432.00000 C 266.50000,-429.51600 268.51600,-427.49999 271.00000,-427.50000 C 271.17713,-427.50000 289.82287,-427.50000 290.00000,-427.50000 C 292.48399,-427.50000 294.50000,-429.51600 294.50000,-432.00000 C 294.50000,-433.68600 293.52972,-435.10426 292.15625,-435.87500 C 292.33749,-436.39229 292.50000,-436.92108 292.50000,-437.50000 C 292.50000,-440.26000 290.26000,-442.49999 287.50000,-442.50000 C 286.66326,-442.50000 285.91198,-442.23883 285.21875,-441.87500 C 284.60991,-443.94972 282.77083,-445.50000 280.50000,-445.50000 z "
+ id="path7796"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient10644);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-445.00000 C 278.31028,-445.00000 276.77640,-443.66423 276.10445,-441.15648 C 275.43599,-441.50010 274.55686,-441.98983 273.75000,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.11240,-434.89433 267.00000,-433.73178 267.00000,-432.24973 C 267.00000,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294.00000,-429.90368 294.00000,-432.24973 C 294.00000,-433.84210 292.88760,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.05100 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.60820,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445.00000 280.50000,-445.00000 z "
+ id="path7798"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <g
+ id="g7800">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7802"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7804"
+ style="opacity:1.0000000;fill:url(#linearGradient10646);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <rect
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect7806"
+ width="20.000000"
+ height="9.0000000"
+ x="271.00000"
+ y="-438.00000" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path7808"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830195,-35.68869)" />
+ <g
+ id="g7810">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19811,24.86321)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7812"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7814"
+ style="opacity:1.0000000;fill:url(#linearGradient10648);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7816">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7818"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7820"
+ style="opacity:1.0000000;fill:url(#linearGradient10650);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7822"
+ transform="translate(-1.000000,0.000000)">
+ <path
+ id="path7824"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274.00000,-438.04812 274.00000,-434.46875 C 274.00000,-432.09807 275.34943,-430.13096 277.25000,-429.00000 L 283.71875,-429.00000 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.50000 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z "
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path7826"
+ d="M 280.50000,-441.00000 C 276.91200,-441.00000 274.00000,-438.08799 274.00000,-434.50000 C 274.00000,-432.12360 275.34485,-430.13368 277.25000,-429.00000 L 283.75000,-429.00000 C 285.65515,-430.13368 287.00000,-432.12360 287.00000,-434.50000 C 287.00000,-438.08800 284.08800,-440.99999 280.50000,-441.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient10652);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10654);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path7828"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830296,-35.68884)" />
+ <path
+ style="fill:#888a85;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 292.95640,-437.33396 C 292.95487,-434.64940 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.95640,-437.33396 292.95640,-437.33396 z "
+ id="path7830"
+ sodipodi:nodetypes="ccss" />
+ <g
+ id="g7832"
+ transform="matrix(1.142857,0.000000,0.000000,1.142857,-28.57139,67.00008)">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7834"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7836"
+ style="opacity:1.0000000;fill:url(#linearGradient10656);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <g
+ transform="translate(23.00000,158.0000)"
+ id="g7852">
+ <path
+ style="fill:#c4c5c2;fill-opacity:1.0000000;stroke:#888a85;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-445.50000 C 278.22917,-445.50000 276.39009,-443.94972 275.78125,-441.87500 C 275.08802,-442.23883 274.33674,-442.50000 273.50000,-442.50000 C 270.74000,-442.50000 268.49999,-440.26001 268.50000,-437.50000 C 268.50000,-436.92107 268.66252,-436.39230 268.84375,-435.87500 C 267.47028,-435.10426 266.50000,-433.68600 266.50000,-432.00000 C 266.50000,-429.51600 268.51600,-427.49999 271.00000,-427.50000 C 271.17713,-427.50000 289.82287,-427.50000 290.00000,-427.50000 C 292.48399,-427.50000 294.50000,-429.51600 294.50000,-432.00000 C 294.50000,-433.68600 293.52972,-435.10426 292.15625,-435.87500 C 292.33749,-436.39229 292.50000,-436.92108 292.50000,-437.50000 C 292.50000,-440.26000 290.26000,-442.49999 287.50000,-442.50000 C 286.66326,-442.50000 285.91198,-442.23883 285.21875,-441.87500 C 284.60991,-443.94972 282.77083,-445.50000 280.50000,-445.50000 z "
+ id="path7854"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient10658);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-445.00000 C 278.31028,-445.00000 276.77640,-443.66423 276.10445,-441.15648 C 275.43599,-441.50010 274.55686,-441.98983 273.75000,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.11240,-434.89433 267.00000,-433.73178 267.00000,-432.24973 C 267.00000,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294.00000,-429.90368 294.00000,-432.24973 C 294.00000,-433.84210 292.88760,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.05100 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.60820,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445.00000 280.50000,-445.00000 z "
+ id="path7856"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <g
+ id="g7858">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7860"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7862"
+ style="opacity:1.0000000;fill:url(#linearGradient10660);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <rect
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect7864"
+ width="20.000000"
+ height="9.0000000"
+ x="271.00000"
+ y="-438.00000" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path7866"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830195,-35.68869)" />
+ <g
+ id="g7868">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19811,24.86321)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7870"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7872"
+ style="opacity:1.0000000;fill:url(#linearGradient10662);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7874">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7876"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7878"
+ style="opacity:1.0000000;fill:url(#linearGradient10664);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7880"
+ transform="translate(-1.000000,0.000000)">
+ <path
+ id="path7882"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274.00000,-438.04812 274.00000,-434.46875 C 274.00000,-432.09807 275.34943,-430.13096 277.25000,-429.00000 L 283.71875,-429.00000 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.50000 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z "
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path7884"
+ d="M 280.50000,-441.00000 C 276.91200,-441.00000 274.00000,-438.08799 274.00000,-434.50000 C 274.00000,-432.12360 275.34485,-430.13368 277.25000,-429.00000 L 283.75000,-429.00000 C 285.65515,-430.13368 287.00000,-432.12360 287.00000,-434.50000 C 287.00000,-438.08800 284.08800,-440.99999 280.50000,-441.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient10666);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10668);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path7886"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830296,-35.68884)" />
+ <path
+ style="fill:#888a85;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 292.95640,-437.33396 C 292.95487,-434.64940 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.95640,-437.33396 292.95640,-437.33396 z "
+ id="path7888"
+ sodipodi:nodetypes="ccss" />
+ <g
+ id="g7890"
+ transform="matrix(1.142857,0.000000,0.000000,1.142857,-28.57139,67.00008)">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7892"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path7896"
+ style="opacity:1.0000000;fill:url(#linearGradient10670);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-showers.svg b/demos/embedded/weatherinfo/icons/weather-showers.svg
new file mode 100644
index 0000000..c814571
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-showers.svg
@@ -0,0 +1,4753 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/rcollier/Work/Novell/Tango/weather"
+ sodipodi:docname="weather-showers.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective530" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient11348"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.070878,0.000000,-0.535439,0.674858,287.5142,77.50802)"
+ x1="-137.49608"
+ y1="-425.28664"
+ x2="-130.60854"
+ y2="-425.28665" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient11346"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.070879,0.000000,-0.535439,0.674857,277.5140,77.50780)"
+ x1="-137.49608"
+ y1="-425.28664"
+ x2="-130.60854"
+ y2="-425.28665" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient11344"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.088439,0.000000,-0.544220,0.674842,265.9811,77.50139)"
+ x1="-137.49608"
+ y1="-425.28664"
+ x2="-130.60854"
+ y2="-425.28665" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13352"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient13350"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient13347"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-35.00007,207.0001)"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13345"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient13343"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient13341"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient13339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-34.00007,207.0001)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13337"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient13335"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient13333"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-35.00007,207.0001)"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13331"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient13329"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient13327"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient13325"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-34.00007,207.0001)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8397">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8400" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient13323"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8315">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8317" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8319" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient13321"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8381">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8383" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8385" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient13319"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8331">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8333" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8335" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient13317"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8302">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8304" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8306" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient13315"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69.00000,155.0000)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="266.36395"
+ y2="-379.26862" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4442">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4444" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4446" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4442"
+ id="linearGradient4467"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-59.00000,27.72122)"
+ x1="4.3602662"
+ y1="-21.904713"
+ x2="40.139732"
+ y2="-1.8452871" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,7.747730,-6.786242)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,12.43523,-5.473742)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4404"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-14.02052,-13.29853)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4407"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-9.728831,-6.856090)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4410"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-4.033948,-17.90479)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4413"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,-1.200260,0.631990)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4419"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,4.534070,-12.70656)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4422"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.992899,-16.32980)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient4479"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-60.91820,-2.915960)"
+ x1="17.181321"
+ y1="32.443652"
+ x2="47.342173"
+ y2="32.443652" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4359"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-7.329241,-50.85192)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4357"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.912551,-43.37823)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4355"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.365819,-55.70818)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4353"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.14727,-36.85890)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4351"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.17579,-44.92562)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4349"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,12.81910,-50.04120)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4347"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.681521,-53.82781)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4488">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4490" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4492" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient4370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-74.92090,-6.914630)"
+ x1="17.175579"
+ y1="23.374163"
+ x2="38.037014"
+ y2="38.680286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4255"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-7.329241,-50.85192)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4253"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.912551,-43.37823)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4251"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.365819,-55.70818)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4249"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.14727,-36.85890)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4247"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.17579,-44.92562)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4245"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,12.81910,-50.04120)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3019">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3021" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3023" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4243"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.681521,-53.82781)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ id="linearGradient6525"
+ gradientUnits="userSpaceOnUse"
+ x1="4.1914001"
+ y1="11.113300"
+ x2="47.319698"
+ y2="56.052299">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ id="stop6529" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.34020618;"
+ id="stop6531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6525"
+ id="linearGradient5250"
+ x1="8.5469341"
+ y1="30.281681"
+ x2="30.85088"
+ y2="48.301884"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.874977,0.000000,0.000000,0.921480,-56.65990,-1.553540)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6537">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6539" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6541" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2298">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2300" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2302" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:0;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2527">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop2529" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="1"
+ id="stop2531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2500">
+ <stop
+ style="stop-color:#fce94f;stop-opacity:1;"
+ offset="0"
+ id="stop2502" />
+ <stop
+ style="stop-color:#fce94f;stop-opacity:0;"
+ offset="1"
+ id="stop2504" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2392">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2394" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2396" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2254">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2256" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2258" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2263"
+ gradientUnits="userSpaceOnUse"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581"
+ gradientTransform="translate(-1.608757,3.097272)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2271"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2283"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2287"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2291"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2295"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2299"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2303"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.707748,-5.784024)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(16.14002,24.66420)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.932144,25.87240)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.356636,23.86870)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(11.19027,26.52035)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2358"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(10.30638,19.27251)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.207586,21.30544)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2398"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.608757,3.097272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2442"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2446"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2451"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2469"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2475"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2478"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2483"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.842481,-3.998086)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2506"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2509"
+ gradientUnits="userSpaceOnUse"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2513"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ x1="38.857941"
+ y1="-18.407482"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2517"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient2533"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(17.33814,3.415985)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2541"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2555"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.499805,1.708617)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.726830,2.481141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="linearGradient3353"
+ x1="23.303862"
+ y1="29.115711"
+ x2="29.750000"
+ y2="46.092930"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3386"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3398"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.561802,-4.303373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2916"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2914"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2912"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2910"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2908"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2906"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2904"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2902"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2900"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2898"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2896"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2894"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2892"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2890"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2888"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2886"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2884"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2882"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2880"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2878"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2876"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2874"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2872"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2870"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2868"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2866"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2864"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2862"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2860"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2858"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2856"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient2854"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2852"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2850"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2848"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2846"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient2844"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2842"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2840"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2838"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient2836"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2834"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2832"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2830"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2828"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2826"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2824"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2822"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2820"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2818"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2816"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2814"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2812"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2810"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2808"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2806"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2804"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2802"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2800"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2798"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2796"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2794"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient2792"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2790"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2788"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2786"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2784"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2782"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2780"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2778"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2776"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2774"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2772"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2770"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2768"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2766"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2764"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2762"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2760"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2758"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2756"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2754"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2752"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2750"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2748"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2746"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2744"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2304"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1557"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1538"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1536"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1534"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1532"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1530"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1528"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1526"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1524"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1522"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1520"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1518"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1516"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1514"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5957"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5955"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5953"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5951"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5949"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5947"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5945"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5943"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5941"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5939"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5937"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5935"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5933"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5931"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5929"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5927"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient5925"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5923"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5921"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5919"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5917"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient5915"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5913"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5911"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5909"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient5907"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5905"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5903"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5901"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5899"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5897"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5895"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5893"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5891"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5889"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5887"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5885"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5883"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5881"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5879"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5877"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5875"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5873"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5871"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5869"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5867"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5865"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient5863"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5861"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5859"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5857"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5855"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5853"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5851"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5849"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5847"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5845"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5843"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5841"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5839"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5837"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5835"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5833"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5831"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5829"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5827"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5825"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5823"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5821"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5819"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5817"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5815"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6101"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.13675,17.05613)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6118"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,12.38965,19.30874)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-10.72430,10.10861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6124"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(21.51400,12.80461)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6179"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6181"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6183"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6185"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6187"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6189"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6191"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient6193"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6199"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6202"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6205"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-4.372193,11.95105)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6208"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6211"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6214"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6242"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6244"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6248"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6252"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6254"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6257"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.297112,4.275205)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6260"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,10.91453,3.180085)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6263"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-1.156692,-1.510075)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6266"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,19.40677,5.249635)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6269"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.79432,0.174884)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.085690,-2.351766)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.921913,-0.223072)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(21.51400,12.80461)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6313"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-10.72430,10.10861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6315"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,12.38965,19.30874)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6317"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-1.156692,-1.510075)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6319"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.13675,17.05613)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6321"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6323"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6325"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6327"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6329"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6331"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6333"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6335"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.921913,-0.223072)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6337"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.085690,-2.351766)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.79432,0.174884)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6341"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,19.40677,5.249635)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6343"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,10.91453,3.180085)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6543"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-2.763717e-17,0.972572,16.13182,0.843286)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6547"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-4.388782e-16,0.972572,25.91493,0.633642)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6551"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-4.388782e-16,0.972572,36.25638,0.633643)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6559"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-2.332577e-16,0.972572,16.13182,0.843286)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6561"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-6.444987e-16,0.972572,25.91493,0.633642)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-6.444987e-16,0.972572,36.25638,0.633643)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6566"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-5.984325e-16,1.025105,38.38995,-1.768804)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6569"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-5.984325e-16,1.025105,27.05193,-1.768805)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6572"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.589347,0.000000,-1.531909e-16,1.025217,16.34910,-1.110328)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6576"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.132431,0.000000,0.000000,1.016132,11.79178,-1.090051)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6579"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.853605,0.000000,0.000000,1.016132,20.48211,1.012885)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6582"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,14.73875,-4.143732)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6585"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,8.896962,-6.711142)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6588"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,3.612740,-4.548108)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6599"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.999079,0.000000,0.000000,1.016132,58.06881,13.00984)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6603"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.496116,0.000000,0.000000,1.282841,-0.560999,-5.855873)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6606"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.314274,0.000000,0.000000,1.016132,13.30131,15.29879)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6609"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.496116,0.000000,0.000000,1.282841,-10.35177,5.950245)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6612"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,22.63849,8.689740)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6618"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,17.34164,6.586930)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6622"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,12.56867,12.68572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6624"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6626"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6628"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6630"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6632"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6634"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6636"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4442"
+ id="linearGradient2736"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-59.00000,27.72122)"
+ x1="4.3602662"
+ y1="-21.904713"
+ x2="40.139732"
+ y2="-1.8452871" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2738"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.992899,-16.32980)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2740"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,4.534070,-12.70656)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2742"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,-1.200260,0.631990)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2745"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-4.033948,-17.90479)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-9.728831,-6.856090)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2749"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-14.02052,-13.29853)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2751"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,12.43523,-5.473742)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2753"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,7.747730,-6.786242)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2755"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-60.91820,-2.915960)"
+ x1="17.181321"
+ y1="32.443652"
+ x2="47.342173"
+ y2="32.443652" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2757"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.681521,-53.82781)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2759"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,12.81910,-50.04120)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2761"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.17579,-44.92562)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2763"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.14727,-36.85890)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2765"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.365819,-55.70818)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2767"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.912551,-43.37823)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2769"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-7.329241,-50.85192)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2771"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-74.92090,-6.914630)"
+ x1="17.175579"
+ y1="23.374163"
+ x2="38.037014"
+ y2="38.680286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2773"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.681521,-53.82781)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2775"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,12.81910,-50.04120)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2777"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.17579,-44.92562)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2779"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.14727,-36.85890)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2781"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.365819,-55.70818)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2783"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.912551,-43.37823)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2785"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-7.329241,-50.85192)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2799"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-11.91814,-7.649759)"
+ x1="17.175579"
+ y1="23.374163"
+ x2="38.037014"
+ y2="38.680286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2813"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,2.084560,-3.651089)"
+ x1="18.664751"
+ y1="23.374166"
+ x2="31.294144"
+ y2="35.845455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4442"
+ id="linearGradient2827"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.002760,26.98609)"
+ x1="4.3602662"
+ y1="-21.904713"
+ x2="40.139732"
+ y2="-1.8452871" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16"
+ inkscape:cx="11.996306"
+ inkscape:cy="38.014291"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1200"
+ inkscape:window-height="704"
+ inkscape:window-x="134"
+ inkscape:window-y="133"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-showers</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan collier (pseudo)</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>appplet</rdf:li>
+ <rdf:li>notify</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g11337"
+ transform="translate(-339.9823,245.0132)">
+ <rect
+ transform="matrix(1.000000,0.000000,-0.600523,0.799607,0.000000,0.000000)"
+ ry="1.5179254"
+ rx="2.3596079"
+ y="-270.75461"
+ x="189.68199"
+ height="17.509083"
+ width="32.962067"
+ id="rect6086"
+ style="opacity:1.0000000;fill:#729fcf;fill-opacity:1.0000000;stroke:#3465a4;stroke-width:1.0817814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <g
+ style="opacity:0.80000001"
+ transform="matrix(1.000000,0.000000,0.000000,0.999611,0.000000,-7.862650e-2)"
+ id="g10414">
+ <path
+ style="fill:url(#linearGradient11344);fill-opacity:1.0000000;stroke:none;stroke-width:1.1547011;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 352.47790,-216.00000 L 359.39580,-216.00000 C 360.69054,-216.00000 361.33008,-215.50056 360.82979,-214.88017 L 352.15249,-204.12015 C 351.65217,-203.49974 350.20707,-203.00030 348.91233,-203.00030 L 344.86943,-203.00030 C 343.57469,-203.00030 342.30979,-202.95120 343.43545,-204.12015 C 343.43545,-204.12015 352.47790,-216.00000 352.47790,-216.00000 z "
+ id="rect6088"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ style="fill:url(#linearGradient11346);fill-opacity:1.0000000;stroke:none;stroke-width:1.1547011;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 362.74641,-216.00000 L 369.42169,-216.00000 C 370.69552,-216.00000 371.32477,-215.50054 370.83253,-214.88014 L 362.29523,-204.11987 C 361.80299,-203.49946 360.38121,-203.00000 359.10738,-203.00000 L 353.00000,-203.00000 C 353.00000,-203.00000 362.74641,-216.00000 362.74641,-216.00000 z "
+ id="path6115"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:url(#linearGradient11348);fill-opacity:1.0000000;stroke:none;stroke-width:1.1547011;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 372.74640,-216.00000 L 379.42169,-216.00000 C 380.69553,-216.00000 381.32477,-215.50053 380.83253,-214.88014 L 372.29523,-204.11986 C 371.80299,-203.49945 370.38122,-203.00000 369.10738,-203.00000 L 363.00000,-203.00000 C 363.00000,-203.00000 372.74640,-216.00000 372.74640,-216.00000 z "
+ id="path6125"
+ sodipodi:nodetypes="ccccccc" />
+ </g>
+ </g>
+ <g
+ id="g13213"
+ transform="matrix(0.999675,0.000000,0.000000,1.000000,-286.8562,245.0000)">
+ <g
+ id="g13215">
+ <path
+ style="opacity:1.0000000;fill:#555753;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 311.50000,-242.99998 C 308.72758,-242.99998 306.39177,-241.42627 305.09375,-239.18748 C 304.14939,-239.66252 303.12856,-239.99998 302.00000,-239.99998 C 298.13600,-239.99998 295.00000,-236.86398 295.00000,-232.99998 C 295.00000,-229.13598 298.13600,-225.99998 302.00000,-225.99998 C 304.41967,-225.99998 306.43009,-227.31930 307.68750,-229.18748 C 308.82170,-228.49786 310.07648,-227.99998 311.50000,-227.99998 C 312.41312,-227.99998 313.25295,-228.23200 314.06250,-228.53123 C 314.57244,-227.66350 315.24162,-226.95151 316.06250,-226.37498 C 316.05526,-226.24460 316.00000,-226.13216 316.00000,-225.99998 C 316.00000,-222.13598 319.13599,-218.99998 323.00000,-218.99998 C 326.86400,-218.99998 330.00000,-222.13598 330.00000,-225.99998 C 330.00000,-228.36967 328.74102,-230.35832 326.93750,-231.62498 C 326.94474,-231.75536 327.00000,-231.86780 327.00000,-231.99998 C 327.00000,-235.86398 323.86401,-238.99998 320.00000,-238.99998 C 319.37730,-238.99998 318.82481,-238.77779 318.25000,-238.62498 C 317.05547,-241.18382 314.50866,-242.99998 311.50000,-242.99998 z "
+ id="path13217" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient13315);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 311.50000,-241.99998 C 308.71952,-241.99998 306.36549,-240.23813 305.43750,-237.78123 C 304.45208,-238.49067 303.30607,-238.99998 302.00000,-238.99998 C 298.68800,-238.99998 296.00000,-236.31198 296.00000,-232.99998 C 296.00000,-229.68798 298.68800,-226.99998 302.00000,-226.99998 C 304.42775,-226.99998 306.49324,-228.45556 307.43750,-230.53123 C 308.55826,-229.61367 309.93964,-228.99998 311.50000,-228.99998 C 312.57454,-228.99998 313.54428,-229.31894 314.43750,-229.78123 C 314.83590,-228.78147 315.53864,-227.99491 316.37500,-227.34373 C 316.19499,-226.74811 316.00000,-226.15408 316.00000,-225.49998 C 316.00000,-221.91198 318.91200,-218.99998 322.50000,-218.99998 C 326.08800,-218.99998 329.00000,-221.91198 329.00000,-225.49998 C 329.00000,-227.86077 327.66567,-229.83017 325.78125,-230.96873 C 325.84384,-231.31596 326.00000,-231.63481 326.00000,-231.99998 C 326.00000,-235.31198 323.31200,-237.99998 320.00000,-237.99998 C 319.14702,-237.99998 318.32870,-237.82130 317.59375,-237.49998 C 316.73998,-240.09386 314.37851,-241.99997 311.50000,-241.99998 z "
+ id="path13219" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13221"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(0.964447,0.000000,0.000000,0.964447,89.28852,144.5262)" />
+ <g
+ id="g13223">
+ <path
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,96.18078,108.1091)"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ sodipodi:ry="6.2313786"
+ sodipodi:rx="6.2313786"
+ sodipodi:cy="-389.30136"
+ sodipodi:cx="243.95184"
+ id="path13225"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,96.18078,108.1091)"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ sodipodi:ry="6.2313786"
+ sodipodi:rx="6.2313786"
+ sodipodi:cy="-389.30136"
+ sodipodi:cx="243.95184"
+ id="path13227"
+ style="opacity:0.49444440;fill:url(#linearGradient13317);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g13229">
+ <path
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,90.45407,120.2336)"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ sodipodi:ry="6.0325046"
+ sodipodi:rx="6.0325046"
+ sodipodi:cy="-385.78790"
+ sodipodi:cx="251.22179"
+ id="path13231"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,90.45407,120.2336)"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ sodipodi:ry="6.0325046"
+ sodipodi:rx="6.0325046"
+ sodipodi:cy="-385.78790"
+ sodipodi:cx="251.22179"
+ id="path13233"
+ style="opacity:0.49444440;fill:url(#linearGradient13319);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g13235">
+ <path
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,35.23229,210.2770)"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ sodipodi:ry="4.3752232"
+ sodipodi:rx="4.3752232"
+ sodipodi:cy="-387.88715"
+ sodipodi:cx="233.43362"
+ id="path13237"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,35.23229,210.2770)"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ sodipodi:ry="4.3752232"
+ sodipodi:rx="4.3752232"
+ sodipodi:cy="-387.88715"
+ sodipodi:cx="233.43362"
+ id="path13239"
+ style="opacity:0.49444440;fill:url(#linearGradient13321);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g13241">
+ <path
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,59.84906,169.4899)"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ sodipodi:ry="6.7396116"
+ sodipodi:rx="6.7396116"
+ sodipodi:cy="-383.66660"
+ sodipodi:cx="241.80843"
+ id="path13243"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,59.84907,169.4899)"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ sodipodi:ry="6.7396116"
+ sodipodi:rx="6.7396116"
+ sodipodi:cy="-383.66660"
+ sodipodi:cx="241.80843"
+ id="path13245"
+ style="opacity:0.49444440;fill:url(#linearGradient13323);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <g
+ transform="translate(72.00007,7.999930)"
+ id="g13247">
+ <path
+ style="fill:#888a85;fill-opacity:1.0000000;stroke:#555753;stroke-width:1.0001625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 246.49993,-238.49993 C 244.22910,-238.49993 242.39002,-236.94965 241.78118,-234.87493 C 241.08795,-235.23876 240.33667,-235.49993 239.49993,-235.49993 C 236.73993,-235.49993 234.49992,-233.25994 234.49993,-230.49993 C 234.49993,-229.92100 234.66245,-229.39223 234.84368,-228.87493 C 233.47021,-228.10419 232.49993,-226.68593 232.49993,-224.99993 C 232.49993,-222.51593 234.51593,-220.49992 236.99993,-220.49993 C 237.17706,-220.49993 255.82280,-220.49993 255.99993,-220.49993 C 258.48392,-220.49993 260.49993,-222.51593 260.49993,-224.99993 C 260.49993,-226.68593 259.52965,-228.10419 258.15618,-228.87493 C 258.33742,-229.39222 258.49993,-229.92101 258.49993,-230.49993 C 258.49993,-233.25993 256.25993,-235.49992 253.49993,-235.49993 C 252.66319,-235.49993 251.91191,-235.23876 251.21868,-234.87493 C 250.60984,-236.94965 248.77076,-238.49993 246.49993,-238.49993 z "
+ id="path13249"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient13325);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 246.49993,-237.99993 C 244.31021,-237.99993 242.77633,-236.66416 242.10438,-234.15641 C 241.43592,-234.50003 240.55679,-234.98976 239.74993,-234.98976 C 237.03342,-234.98976 234.99479,-233.05094 234.99480,-230.44422 C 234.99480,-229.89745 235.26201,-229.11078 235.43676,-228.62221 C 234.11233,-227.89426 232.99993,-226.73171 232.99993,-225.24966 C 232.99993,-222.90361 234.54610,-220.99957 237.33921,-220.99957 C 237.51002,-220.99957 255.48985,-220.99957 255.66065,-220.99957 C 258.43166,-220.99957 259.99993,-222.90361 259.99993,-225.24966 C 259.99993,-226.84203 258.88753,-227.91635 257.56310,-228.64430 C 257.73786,-229.13286 258.02717,-229.89746 258.02717,-230.44422 C 258.02717,-233.05093 255.91136,-235.01185 253.24994,-235.01186 C 252.44307,-235.01186 251.60813,-234.52212 250.93967,-234.17850 C 250.29082,-236.60004 248.68966,-237.99993 246.49993,-237.99993 z "
+ id="path13251"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13253"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13327);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13255"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)" />
+ <rect
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect13257"
+ width="20.000000"
+ height="9.0000000"
+ x="236.99994"
+ y="-230.99992" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13259"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16987,171.3114)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13261"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19818,231.8633)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13329);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13263"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19825,231.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13265"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13331);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13267"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)" />
+ <path
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 245.46868,-233.96868 C 241.88930,-233.96868 238.99993,-231.04805 238.99993,-227.46868 C 238.99993,-225.09800 240.34936,-223.13089 242.24993,-221.99993 L 248.71868,-221.99993 C 250.61925,-223.13089 251.96868,-225.12924 251.96868,-227.49993 C 251.96868,-231.07931 249.04805,-233.96868 245.46868,-233.96868 z "
+ id="path13269" />
+ <path
+ style="opacity:0.47777775;fill:url(#linearGradient13333);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 245.49993,-233.99993 C 241.91193,-233.99993 238.99993,-231.08792 238.99993,-227.49993 C 238.99993,-225.12353 240.34478,-223.13361 242.24993,-221.99993 L 248.74993,-221.99993 C 250.65508,-223.13361 251.99993,-225.12353 251.99993,-227.49993 C 251.99993,-231.08793 249.08793,-233.99992 245.49993,-233.99993 z "
+ id="path13271" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13335);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13273"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16977,171.3113)" />
+ <path
+ style="fill:#555753;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 258.95633,-230.33389 C 258.95480,-227.64933 255.68707,-226.61994 255.68707,-226.61994 C 255.68707,-226.61994 258.03581,-228.24589 258.02392,-230.32495 C 258.02392,-230.32495 258.95633,-230.33389 258.95633,-230.33389 z "
+ id="path13275"
+ sodipodi:nodetypes="ccss" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13277"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13337);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13279"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)" />
+ </g>
+ <g
+ transform="translate(56.98577,3.983930)"
+ id="g13281">
+ <path
+ style="fill:#888a85;fill-opacity:1.0000000;stroke:#555753;stroke-width:1.0001625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 246.49993,-238.49993 C 244.22910,-238.49993 242.39002,-236.94965 241.78118,-234.87493 C 241.08795,-235.23876 240.33667,-235.49993 239.49993,-235.49993 C 236.73993,-235.49993 234.49992,-233.25994 234.49993,-230.49993 C 234.49993,-229.92100 234.66245,-229.39223 234.84368,-228.87493 C 233.47021,-228.10419 232.49993,-226.68593 232.49993,-224.99993 C 232.49993,-222.51593 234.51593,-220.49992 236.99993,-220.49993 C 237.17706,-220.49993 255.82280,-220.49993 255.99993,-220.49993 C 258.48392,-220.49993 260.49993,-222.51593 260.49993,-224.99993 C 260.49993,-226.68593 259.52965,-228.10419 258.15618,-228.87493 C 258.33742,-229.39222 258.49993,-229.92101 258.49993,-230.49993 C 258.49993,-233.25993 256.25993,-235.49992 253.49993,-235.49993 C 252.66319,-235.49993 251.91191,-235.23876 251.21868,-234.87493 C 250.60984,-236.94965 248.77076,-238.49993 246.49993,-238.49993 z "
+ id="path13283"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient13339);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 246.49993,-237.99993 C 244.31021,-237.99993 242.77633,-236.66416 242.10438,-234.15641 C 241.43592,-234.50003 240.55679,-234.98976 239.74993,-234.98976 C 237.03342,-234.98976 234.99479,-233.05094 234.99480,-230.44422 C 234.99480,-229.89745 235.26201,-229.11078 235.43676,-228.62221 C 234.11233,-227.89426 232.99993,-226.73171 232.99993,-225.24966 C 232.99993,-222.90361 234.54610,-220.99957 237.33921,-220.99957 C 237.51002,-220.99957 255.48985,-220.99957 255.66065,-220.99957 C 258.43166,-220.99957 259.99993,-222.90361 259.99993,-225.24966 C 259.99993,-226.84203 258.88753,-227.91635 257.56310,-228.64430 C 257.73786,-229.13286 258.02717,-229.89746 258.02717,-230.44422 C 258.02717,-233.05093 255.91136,-235.01185 253.24994,-235.01186 C 252.44307,-235.01186 251.60813,-234.52212 250.93967,-234.17850 C 250.29082,-236.60004 248.68966,-237.99993 246.49993,-237.99993 z "
+ id="path13285"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13287"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13341);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13289"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)" />
+ <rect
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect13291"
+ width="20.000000"
+ height="9.0000000"
+ x="236.99994"
+ y="-230.99992" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13293"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16987,171.3114)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13295"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19818,231.8633)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13343);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13297"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19825,231.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13299"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13345);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13301"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)" />
+ <path
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 245.46868,-233.96868 C 241.88930,-233.96868 238.99993,-231.04805 238.99993,-227.46868 C 238.99993,-225.09800 240.34936,-223.13089 242.24993,-221.99993 L 248.71868,-221.99993 C 250.61925,-223.13089 251.96868,-225.12924 251.96868,-227.49993 C 251.96868,-231.07931 249.04805,-233.96868 245.46868,-233.96868 z "
+ id="path13303" />
+ <path
+ style="opacity:0.47777775;fill:url(#linearGradient13347);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 245.49993,-233.99993 C 241.91193,-233.99993 238.99993,-231.08792 238.99993,-227.49993 C 238.99993,-225.12353 240.34478,-223.13361 242.24993,-221.99993 L 248.74993,-221.99993 C 250.65508,-223.13361 251.99993,-225.12353 251.99993,-227.49993 C 251.99993,-231.08793 249.08793,-233.99992 245.49993,-233.99993 z "
+ id="path13305" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13350);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13307"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16977,171.3113)" />
+ <path
+ style="fill:#555753;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 258.95633,-230.33389 C 258.95480,-227.64933 255.68707,-226.61994 255.68707,-226.61994 C 255.68707,-226.61994 258.03581,-228.24589 258.02392,-230.32495 C 258.02392,-230.32495 258.95633,-230.33389 258.95633,-230.33389 z "
+ id="path13309"
+ sodipodi:nodetypes="ccss" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13311"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13352);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13313"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-sleet.svg b/demos/embedded/weatherinfo/icons/weather-sleet.svg
new file mode 100644
index 0000000..f1cb9eb
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-sleet.svg
@@ -0,0 +1,5196 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/rcollier/Work/Novell/Tango/weather"
+ sodipodi:docname="weather-sleet.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12213"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12211"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12201"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12199"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12253"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12251"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12237"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12235"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12223"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5358">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5360" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5362" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12249"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5346">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5348" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5350" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12247"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective6329" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient11348"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.070878,0.000000,-0.535439,0.674858,287.5142,77.50802)"
+ x1="-137.49608"
+ y1="-425.28664"
+ x2="-130.60854"
+ y2="-425.28665" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient11346"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.070879,0.000000,-0.535439,0.674857,277.5140,77.50780)"
+ x1="-137.49608"
+ y1="-425.28664"
+ x2="-130.60854"
+ y2="-425.28665" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient11344"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.088439,0.000000,-0.544220,0.674842,265.9811,77.50139)"
+ x1="-137.49608"
+ y1="-425.28664"
+ x2="-130.60854"
+ y2="-425.28665" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13352"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient13350"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient13347"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-35.00007,207.0001)"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13345"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient13343"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient13341"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient13339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-34.00007,207.0001)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13337"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient13335"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient13333"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-35.00007,207.0001)"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13331"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient13329"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient13327"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient13325"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-34.00007,207.0001)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8397">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8400" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient13323"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8315">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8317" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8319" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient13321"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8381">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8383" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8385" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient13319"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8331">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8333" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8335" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient13317"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8302">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8304" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8306" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient13315"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69.00000,155.0000)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="266.36395"
+ y2="-379.26862" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4442">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4444" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4446" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4442"
+ id="linearGradient4467"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-59.00000,27.72122)"
+ x1="4.3602662"
+ y1="-21.904713"
+ x2="40.139732"
+ y2="-1.8452871" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,7.747730,-6.786242)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,12.43523,-5.473742)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4404"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-14.02052,-13.29853)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4407"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-9.728831,-6.856090)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4410"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-4.033948,-17.90479)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4413"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,-1.200260,0.631990)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4419"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,4.534070,-12.70656)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4422"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.992899,-16.32980)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient4479"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-60.91820,-2.915960)"
+ x1="17.181321"
+ y1="32.443652"
+ x2="47.342173"
+ y2="32.443652" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4359"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-7.329241,-50.85192)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4357"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.912551,-43.37823)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4355"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.365819,-55.70818)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4353"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.14727,-36.85890)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4351"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.17579,-44.92562)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4349"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,12.81910,-50.04120)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4347"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.681521,-53.82781)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4488">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4490" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4492" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient4370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-74.92090,-6.914630)"
+ x1="17.175579"
+ y1="23.374163"
+ x2="38.037014"
+ y2="38.680286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4255"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-7.329241,-50.85192)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4253"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.912551,-43.37823)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4251"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.365819,-55.70818)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4249"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.14727,-36.85890)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4247"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.17579,-44.92562)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4245"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,12.81910,-50.04120)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3019">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3021" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3023" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient4243"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.681521,-53.82781)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ id="linearGradient6525"
+ gradientUnits="userSpaceOnUse"
+ x1="4.1914001"
+ y1="11.113300"
+ x2="47.319698"
+ y2="56.052299">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ id="stop6529" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.34020618;"
+ id="stop6531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6525"
+ id="linearGradient5250"
+ x1="8.5469341"
+ y1="30.281681"
+ x2="30.85088"
+ y2="48.301884"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.874977,0.000000,0.000000,0.921480,-56.65990,-1.553540)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6537">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6539" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6541" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2298">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2300" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2302" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:0;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2527">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop2529" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="1"
+ id="stop2531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2500">
+ <stop
+ style="stop-color:#fce94f;stop-opacity:1;"
+ offset="0"
+ id="stop2502" />
+ <stop
+ style="stop-color:#fce94f;stop-opacity:0;"
+ offset="1"
+ id="stop2504" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2392">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2394" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2396" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2254">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2256" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2258" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2263"
+ gradientUnits="userSpaceOnUse"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581"
+ gradientTransform="translate(-1.608757,3.097272)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2271"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2283"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2287"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2291"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2295"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2299"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2303"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.707748,-5.784024)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(16.14002,24.66420)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.932144,25.87240)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.356636,23.86870)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(11.19027,26.52035)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2358"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(10.30638,19.27251)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.207586,21.30544)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2398"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.608757,3.097272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2442"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2446"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2451"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2469"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2475"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2478"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2483"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.842481,-3.998086)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2506"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2509"
+ gradientUnits="userSpaceOnUse"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2513"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ x1="38.857941"
+ y1="-18.407482"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2517"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient2533"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(17.33814,3.415985)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2541"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2555"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.499805,1.708617)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.726830,2.481141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="linearGradient3353"
+ x1="23.303862"
+ y1="29.115711"
+ x2="29.750000"
+ y2="46.092930"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3386"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3398"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.561802,-4.303373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2916"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2914"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2912"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2910"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2908"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2906"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2904"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2902"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2900"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2898"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2896"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2894"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2892"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2890"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2888"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2886"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2884"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2882"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2880"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2878"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2876"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2874"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2872"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2870"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2868"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2866"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2864"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2862"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2860"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2858"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2856"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient2854"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2852"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2850"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2848"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2846"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient2844"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2842"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2840"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2838"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient2836"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2834"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2832"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2830"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2828"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2826"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2824"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2822"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2820"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2818"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2816"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2814"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2812"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2810"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2808"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2806"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2804"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2802"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2800"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2798"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2796"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2794"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient2792"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2790"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2788"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2786"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2784"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2782"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2780"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2778"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2776"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2774"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2772"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2770"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2768"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2766"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2764"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2762"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2760"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2758"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2756"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2754"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2752"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2750"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2748"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2746"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2744"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2304"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1557"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1538"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1536"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1534"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1532"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1530"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1528"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1526"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1524"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1522"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1520"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1518"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1516"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1514"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5957"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5955"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5953"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5951"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5949"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5947"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5945"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5943"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5941"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5939"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5937"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5935"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5933"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5931"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5929"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5927"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient5925"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5923"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5921"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5919"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5917"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient5915"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5913"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5911"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5909"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient5907"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5905"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5903"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5901"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5899"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5897"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5895"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5893"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5891"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5889"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5887"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5885"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5883"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5881"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5879"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5877"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5875"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5873"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5871"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5869"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5867"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5865"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient5863"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5861"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5859"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5857"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5855"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5853"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5851"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5849"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5847"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5845"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5843"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5841"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5839"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5837"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5835"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5833"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5831"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5829"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5827"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5825"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5823"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5821"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5819"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5817"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5815"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6101"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.13675,17.05613)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6118"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,12.38965,19.30874)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-10.72430,10.10861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6124"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(21.51400,12.80461)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6179"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6181"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6183"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6185"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6187"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6189"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6191"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient6193"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6199"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6202"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6205"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-4.372193,11.95105)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6208"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6211"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6214"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6242"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6244"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6248"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6252"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6254"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6257"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.297112,4.275205)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6260"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,10.91453,3.180085)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6263"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-1.156692,-1.510075)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6266"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,19.40677,5.249635)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6269"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.79432,0.174884)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.085690,-2.351766)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.921913,-0.223072)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(21.51400,12.80461)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6313"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-10.72430,10.10861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6315"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,12.38965,19.30874)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6317"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-1.156692,-1.510075)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6319"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.13675,17.05613)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6321"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6323"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6325"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6327"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6329"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6331"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6333"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6335"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.921913,-0.223072)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6337"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.085690,-2.351766)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.79432,0.174884)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6341"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,19.40677,5.249635)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6343"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,10.91453,3.180085)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6543"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-2.763717e-17,0.972572,16.13182,0.843286)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6547"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-4.388782e-16,0.972572,25.91493,0.633642)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6551"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-4.388782e-16,0.972572,36.25638,0.633643)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6559"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-2.332577e-16,0.972572,16.13182,0.843286)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6561"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-6.444987e-16,0.972572,25.91493,0.633642)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-6.444987e-16,0.972572,36.25638,0.633643)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6566"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-5.984325e-16,1.025105,38.38995,-1.768804)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6569"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-5.984325e-16,1.025105,27.05193,-1.768805)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6572"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.589347,0.000000,-1.531909e-16,1.025217,16.34910,-1.110328)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6576"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.132431,0.000000,0.000000,1.016132,11.79178,-1.090051)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6579"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.853605,0.000000,0.000000,1.016132,20.48211,1.012885)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6582"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,14.73875,-4.143732)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6585"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,8.896962,-6.711142)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6588"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,3.612740,-4.548108)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6599"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.999079,0.000000,0.000000,1.016132,58.06881,13.00984)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6603"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.496116,0.000000,0.000000,1.282841,-0.560999,-5.855873)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6606"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.314274,0.000000,0.000000,1.016132,13.30131,15.29879)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6609"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.496116,0.000000,0.000000,1.282841,-10.35177,5.950245)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6612"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,22.63849,8.689740)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6618"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,17.34164,6.586930)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6622"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,12.56867,12.68572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6624"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6626"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6628"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6630"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6632"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6634"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6636"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4442"
+ id="linearGradient2736"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-59.00000,27.72122)"
+ x1="4.3602662"
+ y1="-21.904713"
+ x2="40.139732"
+ y2="-1.8452871" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2738"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.992899,-16.32980)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2740"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,4.534070,-12.70656)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2742"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,-1.200260,0.631990)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2745"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-4.033948,-17.90479)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-9.728831,-6.856090)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2749"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-14.02052,-13.29853)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2751"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,12.43523,-5.473742)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2753"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,7.747730,-6.786242)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2755"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-60.91820,-2.915960)"
+ x1="17.181321"
+ y1="32.443652"
+ x2="47.342173"
+ y2="32.443652" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2757"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.681521,-53.82781)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2759"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,12.81910,-50.04120)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2761"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.17579,-44.92562)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2763"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.14727,-36.85890)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2765"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.365819,-55.70818)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2767"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.912551,-43.37823)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2769"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-7.329241,-50.85192)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2771"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-74.92090,-6.914630)"
+ x1="17.175579"
+ y1="23.374163"
+ x2="38.037014"
+ y2="38.680286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2773"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.681521,-53.82781)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2775"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,12.81910,-50.04120)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2777"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.888889,0.000000,0.000000,0.888889,15.17579,-44.92562)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2779"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.613903,0.000000,0.000000,0.613903,17.14727,-36.85890)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2781"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.365819,-55.70818)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2783"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.813402,0.000000,0.000000,0.813402,-0.912551,-43.37823)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3019"
+ id="linearGradient2785"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.333333,0.000000,0.000000,1.000000,-7.329241,-50.85192)"
+ x1="23.688078"
+ y1="28.201012"
+ x2="29.521708"
+ y2="34.034641" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2799"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,-11.91814,-7.649759)"
+ x1="17.175579"
+ y1="23.374163"
+ x2="38.037014"
+ y2="38.680286" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4488"
+ id="linearGradient2813"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.926905,0.000000,0.000000,0.881886,2.084560,-3.651089)"
+ x1="18.664751"
+ y1="23.374166"
+ x2="31.294144"
+ y2="35.845455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4442"
+ id="linearGradient2827"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.002760,26.98609)"
+ x1="4.3602662"
+ y1="-21.904713"
+ x2="40.139732"
+ y2="-1.8452871" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient8290"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient8292"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient8294"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient8296"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient8298"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient8300"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient8302"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient8304"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient8306"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient8308"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient8310"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient8312"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="24"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="982"
+ inkscape:window-height="965"
+ inkscape:window-x="1280"
+ inkscape:window-y="28"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-showers</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan collier (pseudo)</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>appplet</rdf:li>
+ <rdf:li>notify</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g10087">
+ <g
+ transform="matrix(0.999675,0.000000,0.000000,1.000000,-286.8562,245.0000)"
+ id="g13213">
+ <g
+ id="g13215">
+ <path
+ id="path13217"
+ d="M 311.50000,-242.99998 C 308.72758,-242.99998 306.39177,-241.42627 305.09375,-239.18748 C 304.14939,-239.66252 303.12856,-239.99998 302.00000,-239.99998 C 298.13600,-239.99998 295.00000,-236.86398 295.00000,-232.99998 C 295.00000,-229.13598 298.13600,-225.99998 302.00000,-225.99998 C 304.41967,-225.99998 306.43009,-227.31930 307.68750,-229.18748 C 308.82170,-228.49786 310.07648,-227.99998 311.50000,-227.99998 C 312.41312,-227.99998 313.25295,-228.23200 314.06250,-228.53123 C 314.57244,-227.66350 315.24162,-226.95151 316.06250,-226.37498 C 316.05526,-226.24460 316.00000,-226.13216 316.00000,-225.99998 C 316.00000,-222.13598 319.13599,-218.99998 323.00000,-218.99998 C 326.86400,-218.99998 330.00000,-222.13598 330.00000,-225.99998 C 330.00000,-228.36967 328.74102,-230.35832 326.93750,-231.62498 C 326.94474,-231.75536 327.00000,-231.86780 327.00000,-231.99998 C 327.00000,-235.86398 323.86401,-238.99998 320.00000,-238.99998 C 319.37730,-238.99998 318.82481,-238.77779 318.25000,-238.62498 C 317.05547,-241.18382 314.50866,-242.99998 311.50000,-242.99998 z "
+ style="opacity:1.0000000;fill:#555753;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13219"
+ d="M 311.50000,-241.99998 C 308.71952,-241.99998 306.36549,-240.23813 305.43750,-237.78123 C 304.45208,-238.49067 303.30607,-238.99998 302.00000,-238.99998 C 298.68800,-238.99998 296.00000,-236.31198 296.00000,-232.99998 C 296.00000,-229.68798 298.68800,-226.99998 302.00000,-226.99998 C 304.42775,-226.99998 306.49324,-228.45556 307.43750,-230.53123 C 308.55826,-229.61367 309.93964,-228.99998 311.50000,-228.99998 C 312.57454,-228.99998 313.54428,-229.31894 314.43750,-229.78123 C 314.83590,-228.78147 315.53864,-227.99491 316.37500,-227.34373 C 316.19499,-226.74811 316.00000,-226.15408 316.00000,-225.49998 C 316.00000,-221.91198 318.91200,-218.99998 322.50000,-218.99998 C 326.08800,-218.99998 329.00000,-221.91198 329.00000,-225.49998 C 329.00000,-227.86077 327.66567,-229.83017 325.78125,-230.96873 C 325.84384,-231.31596 326.00000,-231.63481 326.00000,-231.99998 C 326.00000,-235.31198 323.31200,-237.99998 320.00000,-237.99998 C 319.14702,-237.99998 318.32870,-237.82130 317.59375,-237.49998 C 316.73998,-240.09386 314.37851,-241.99997 311.50000,-241.99998 z "
+ style="opacity:1.0000000;fill:url(#linearGradient13315);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.964447,0.000000,0.000000,0.964447,89.28852,144.5262)"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ sodipodi:ry="6.7396116"
+ sodipodi:rx="6.7396116"
+ sodipodi:cy="-383.66660"
+ sodipodi:cx="241.80843"
+ id="path13221"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <g
+ id="g13223">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13225"
+ sodipodi:cx="243.95184"
+ sodipodi:cy="-389.30136"
+ sodipodi:rx="6.2313786"
+ sodipodi:ry="6.2313786"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,96.18078,108.1091)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.49444440;fill:url(#linearGradient13317);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13227"
+ sodipodi:cx="243.95184"
+ sodipodi:cy="-389.30136"
+ sodipodi:rx="6.2313786"
+ sodipodi:ry="6.2313786"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,96.18078,108.1091)" />
+ </g>
+ <g
+ id="g13229">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13231"
+ sodipodi:cx="251.22179"
+ sodipodi:cy="-385.78790"
+ sodipodi:rx="6.0325046"
+ sodipodi:ry="6.0325046"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,90.45407,120.2336)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.49444440;fill:url(#linearGradient13319);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13233"
+ sodipodi:cx="251.22179"
+ sodipodi:cy="-385.78790"
+ sodipodi:rx="6.0325046"
+ sodipodi:ry="6.0325046"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,90.45407,120.2336)" />
+ </g>
+ <g
+ id="g13235">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13237"
+ sodipodi:cx="233.43362"
+ sodipodi:cy="-387.88715"
+ sodipodi:rx="4.3752232"
+ sodipodi:ry="4.3752232"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,35.23229,210.2770)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.49444440;fill:url(#linearGradient13321);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13239"
+ sodipodi:cx="233.43362"
+ sodipodi:cy="-387.88715"
+ sodipodi:rx="4.3752232"
+ sodipodi:ry="4.3752232"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,35.23229,210.2770)" />
+ </g>
+ <g
+ id="g13241">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13243"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,59.84906,169.4899)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.49444440;fill:url(#linearGradient13323);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path13245"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,59.84907,169.4899)" />
+ </g>
+ </g>
+ <g
+ id="g13247"
+ transform="translate(72.00007,7.999930)">
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path13249"
+ d="M 246.49993,-238.49993 C 244.22910,-238.49993 242.39002,-236.94965 241.78118,-234.87493 C 241.08795,-235.23876 240.33667,-235.49993 239.49993,-235.49993 C 236.73993,-235.49993 234.49992,-233.25994 234.49993,-230.49993 C 234.49993,-229.92100 234.66245,-229.39223 234.84368,-228.87493 C 233.47021,-228.10419 232.49993,-226.68593 232.49993,-224.99993 C 232.49993,-222.51593 234.51593,-220.49992 236.99993,-220.49993 C 237.17706,-220.49993 255.82280,-220.49993 255.99993,-220.49993 C 258.48392,-220.49993 260.49993,-222.51593 260.49993,-224.99993 C 260.49993,-226.68593 259.52965,-228.10419 258.15618,-228.87493 C 258.33742,-229.39222 258.49993,-229.92101 258.49993,-230.49993 C 258.49993,-233.25993 256.25993,-235.49992 253.49993,-235.49993 C 252.66319,-235.49993 251.91191,-235.23876 251.21868,-234.87493 C 250.60984,-236.94965 248.77076,-238.49993 246.49993,-238.49993 z "
+ style="fill:#888a85;fill-opacity:1.0000000;stroke:#555753;stroke-width:1.0001625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path13251"
+ d="M 246.49993,-237.99993 C 244.31021,-237.99993 242.77633,-236.66416 242.10438,-234.15641 C 241.43592,-234.50003 240.55679,-234.98976 239.74993,-234.98976 C 237.03342,-234.98976 234.99479,-233.05094 234.99480,-230.44422 C 234.99480,-229.89745 235.26201,-229.11078 235.43676,-228.62221 C 234.11233,-227.89426 232.99993,-226.73171 232.99993,-225.24966 C 232.99993,-222.90361 234.54610,-220.99957 237.33921,-220.99957 C 237.51002,-220.99957 255.48985,-220.99957 255.66065,-220.99957 C 258.43166,-220.99957 259.99993,-222.90361 259.99993,-225.24966 C 259.99993,-226.84203 258.88753,-227.91635 257.56310,-228.64430 C 257.73786,-229.13286 258.02717,-229.89746 258.02717,-230.44422 C 258.02717,-233.05093 255.91136,-235.01185 253.24994,-235.01186 C 252.44307,-235.01186 251.60813,-234.52212 250.93967,-234.17850 C 250.29082,-236.60004 248.68966,-237.99993 246.49993,-237.99993 z "
+ style="opacity:1.0000000;fill:url(#linearGradient13325);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13253"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13255"
+ style="opacity:0.47777775;fill:url(#linearGradient13327);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <rect
+ y="-230.99992"
+ x="236.99994"
+ height="9.0000000"
+ width="20.000000"
+ id="rect13257"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16987,171.3114)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13259"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19818,231.8633)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13261"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13263"
+ style="opacity:0.47777775;fill:url(#linearGradient13329);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13265"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13267"
+ style="opacity:0.47777775;fill:url(#linearGradient13331);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ id="path13269"
+ d="M 245.46868,-233.96868 C 241.88930,-233.96868 238.99993,-231.04805 238.99993,-227.46868 C 238.99993,-225.09800 240.34936,-223.13089 242.24993,-221.99993 L 248.71868,-221.99993 C 250.61925,-223.13089 251.96868,-225.12924 251.96868,-227.49993 C 251.96868,-231.07931 249.04805,-233.96868 245.46868,-233.96868 z "
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13271"
+ d="M 245.49993,-233.99993 C 241.91193,-233.99993 238.99993,-231.08792 238.99993,-227.49993 C 238.99993,-225.12353 240.34478,-223.13361 242.24993,-221.99993 L 248.74993,-221.99993 C 250.65508,-223.13361 251.99993,-225.12353 251.99993,-227.49993 C 251.99993,-231.08793 249.08793,-233.99992 245.49993,-233.99993 z "
+ style="opacity:0.47777775;fill:url(#linearGradient13333);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16977,171.3113)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13273"
+ style="opacity:0.47777775;fill:url(#linearGradient13335);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path13275"
+ d="M 258.95633,-230.33389 C 258.95480,-227.64933 255.68707,-226.61994 255.68707,-226.61994 C 255.68707,-226.61994 258.03581,-228.24589 258.02392,-230.32495 C 258.02392,-230.32495 258.95633,-230.33389 258.95633,-230.33389 z "
+ style="fill:#555753;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13277"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13279"
+ style="opacity:0.47777775;fill:url(#linearGradient13337);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g13281"
+ transform="translate(56.98577,3.983930)">
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path13283"
+ d="M 246.49993,-238.49993 C 244.22910,-238.49993 242.39002,-236.94965 241.78118,-234.87493 C 241.08795,-235.23876 240.33667,-235.49993 239.49993,-235.49993 C 236.73993,-235.49993 234.49992,-233.25994 234.49993,-230.49993 C 234.49993,-229.92100 234.66245,-229.39223 234.84368,-228.87493 C 233.47021,-228.10419 232.49993,-226.68593 232.49993,-224.99993 C 232.49993,-222.51593 234.51593,-220.49992 236.99993,-220.49993 C 237.17706,-220.49993 255.82280,-220.49993 255.99993,-220.49993 C 258.48392,-220.49993 260.49993,-222.51593 260.49993,-224.99993 C 260.49993,-226.68593 259.52965,-228.10419 258.15618,-228.87493 C 258.33742,-229.39222 258.49993,-229.92101 258.49993,-230.49993 C 258.49993,-233.25993 256.25993,-235.49992 253.49993,-235.49993 C 252.66319,-235.49993 251.91191,-235.23876 251.21868,-234.87493 C 250.60984,-236.94965 248.77076,-238.49993 246.49993,-238.49993 z "
+ style="fill:#888a85;fill-opacity:1.0000000;stroke:#555753;stroke-width:1.0001625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path13285"
+ d="M 246.49993,-237.99993 C 244.31021,-237.99993 242.77633,-236.66416 242.10438,-234.15641 C 241.43592,-234.50003 240.55679,-234.98976 239.74993,-234.98976 C 237.03342,-234.98976 234.99479,-233.05094 234.99480,-230.44422 C 234.99480,-229.89745 235.26201,-229.11078 235.43676,-228.62221 C 234.11233,-227.89426 232.99993,-226.73171 232.99993,-225.24966 C 232.99993,-222.90361 234.54610,-220.99957 237.33921,-220.99957 C 237.51002,-220.99957 255.48985,-220.99957 255.66065,-220.99957 C 258.43166,-220.99957 259.99993,-222.90361 259.99993,-225.24966 C 259.99993,-226.84203 258.88753,-227.91635 257.56310,-228.64430 C 257.73786,-229.13286 258.02717,-229.89746 258.02717,-230.44422 C 258.02717,-233.05093 255.91136,-235.01185 253.24994,-235.01186 C 252.44307,-235.01186 251.60813,-234.52212 250.93967,-234.17850 C 250.29082,-236.60004 248.68966,-237.99993 246.49993,-237.99993 z "
+ style="opacity:1.0000000;fill:url(#linearGradient13339);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13287"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13289"
+ style="opacity:0.47777775;fill:url(#linearGradient13341);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <rect
+ y="-230.99992"
+ x="236.99994"
+ height="9.0000000"
+ width="20.000000"
+ id="rect13291"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16987,171.3114)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13293"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19818,231.8633)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13295"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13297"
+ style="opacity:0.47777775;fill:url(#linearGradient13343);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13299"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13301"
+ style="opacity:0.47777775;fill:url(#linearGradient13345);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ id="path13303"
+ d="M 245.46868,-233.96868 C 241.88930,-233.96868 238.99993,-231.04805 238.99993,-227.46868 C 238.99993,-225.09800 240.34936,-223.13089 242.24993,-221.99993 L 248.71868,-221.99993 C 250.61925,-223.13089 251.96868,-225.12924 251.96868,-227.49993 C 251.96868,-231.07931 249.04805,-233.96868 245.46868,-233.96868 z "
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path13305"
+ d="M 245.49993,-233.99993 C 241.91193,-233.99993 238.99993,-231.08792 238.99993,-227.49993 C 238.99993,-225.12353 240.34478,-223.13361 242.24993,-221.99993 L 248.74993,-221.99993 C 250.65508,-223.13361 251.99993,-225.12353 251.99993,-227.49993 C 251.99993,-231.08793 249.08793,-233.99992 245.49993,-233.99993 z "
+ style="opacity:0.47777775;fill:url(#linearGradient13347);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16977,171.3113)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13307"
+ style="opacity:0.47777775;fill:url(#linearGradient13350);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path13309"
+ d="M 258.95633,-230.33389 C 258.95480,-227.64933 255.68707,-226.61994 255.68707,-226.61994 C 255.68707,-226.61994 258.03581,-228.24589 258.02392,-230.32495 C 258.02392,-230.32495 258.95633,-230.33389 258.95633,-230.33389 z "
+ style="fill:#555753;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13311"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path13313"
+ style="opacity:0.47777775;fill:url(#linearGradient13352);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <g
+ transform="translate(17.177973,-2)"
+ id="g8264">
+ <g
+ id="g12227"
+ transform="translate(-219.67784,275.47179)">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path12229"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csscc"
+ id="path12231"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ style="opacity:0.46111109;fill:url(#radialGradient8290);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path12233"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ style="opacity:1;fill:url(#linearGradient8292);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="g12191"
+ transform="translate(-239.67784,265.47959)">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path12193"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csscc"
+ id="path12195"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ style="opacity:0.46111109;fill:url(#radialGradient8294);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path12197"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ style="opacity:1;fill:url(#linearGradient8296);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="g12239"
+ transform="translate(-210.67944,272.47179)">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path12241"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csscc"
+ id="path12243"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ style="opacity:0.46111109;fill:url(#radialGradient8298);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path12245"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ style="opacity:1;fill:url(#linearGradient8300);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="g12186"
+ transform="translate(-241.67794,275.47309)">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6059"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csscc"
+ id="path6061"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ style="opacity:0.46111109;fill:url(#radialGradient8302);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path6063"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ style="opacity:1;fill:url(#linearGradient8304);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="g12203"
+ transform="translate(-231.67944,270.47179)">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path12205"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csscc"
+ id="path12207"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ style="opacity:0.46111109;fill:url(#radialGradient8306);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path12209"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ style="opacity:1;fill:url(#linearGradient8308);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="g12215"
+ transform="translate(-217.67944,265.47959)">
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path12217"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csscc"
+ id="path12219"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ style="opacity:0.46111109;fill:url(#radialGradient8310);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path12221"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ style="opacity:1;fill:url(#linearGradient8312);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="translate(-162.99643,221.88968)"
+ id="g12157">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#729fcf;stroke-width:1.45874679;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path12159"
+ sodipodi:cx="29.610096"
+ sodipodi:cy="-316.77872"
+ sodipodi:rx="2.2097087"
+ sodipodi:ry="2.2097087"
+ d="M 31.819805,-316.77872 A 2.2097087,2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087,2.2097087 0 1 1 31.819805,-316.77872 z"
+ transform="matrix(0.68552,0,0,0.68552,151.7017,27.15827)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#729fcf;stroke-width:1.09220433;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path12161"
+ sodipodi:cx="29.610096"
+ sodipodi:cy="-316.77872"
+ sodipodi:rx="2.2097087"
+ sodipodi:ry="2.2097087"
+ d="M 31.819805,-316.77872 A 2.2097087,2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087,2.2097087 0 1 1 31.819805,-316.77872 z"
+ transform="matrix(0.915572,0,0,0.915587,152.4091,103.5577)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#729fcf;stroke-width:1.47481608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path12163"
+ sodipodi:cx="29.610096"
+ sodipodi:cy="-316.77872"
+ sodipodi:rx="2.2097087"
+ sodipodi:ry="2.2097087"
+ d="M 31.819805,-316.77872 A 2.2097087,2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087,2.2097087 0 1 1 31.819805,-316.77872 z"
+ transform="matrix(0.672406,0,0,0.683742,153.0708,34.62149)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#729fcf;stroke-width:1.4678179;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path12165"
+ sodipodi:cx="29.610096"
+ sodipodi:cy="-316.77872"
+ sodipodi:rx="2.2097087"
+ sodipodi:ry="2.2097087"
+ d="M 31.819805,-316.77872 A 2.2097087,2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087,2.2097087 0 1 1 31.819805,-316.77872 z"
+ transform="matrix(0.6823,0,0,0.680269,181.797,30.49471)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#729fcf;stroke-width:0.89916825;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path12167"
+ sodipodi:cx="29.610096"
+ sodipodi:cy="-316.77872"
+ sodipodi:rx="2.2097087"
+ sodipodi:ry="2.2097087"
+ d="M 31.819805,-316.77872 A 2.2097087,2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087,2.2097087 0 1 1 31.819805,-316.77872 z"
+ transform="matrix(1.107132,0,0,1.117168,157.2177,164.9217)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#729fcf;stroke-width:0.91822928;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path12169"
+ sodipodi:cx="29.610096"
+ sodipodi:cy="-316.77872"
+ sodipodi:rx="2.2097087"
+ sodipodi:ry="2.2097087"
+ d="M 31.819805,-316.77872 A 2.2097087,2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087,2.2097087 0 1 1 31.819805,-316.77872 z"
+ transform="matrix(1.127592,0,0,1.05183,161.6119,151.3731)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#729fcf;stroke-width:1.46413279;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path12171"
+ sodipodi:cx="29.610096"
+ sodipodi:cy="-316.77872"
+ sodipodi:rx="2.2097087"
+ sodipodi:ry="2.2097087"
+ d="M 31.819805,-316.77872 A 2.2097087,2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087,2.2097087 0 1 1 31.819805,-316.77872 z"
+ transform="matrix(0.685519,0,0,0.680487,164.6869,34.56369)" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-snow.svg b/demos/embedded/weatherinfo/icons/weather-snow.svg
new file mode 100644
index 0000000..6c7b4ad
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-snow.svg
@@ -0,0 +1,1974 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/rcollier/Work/Novell/Tango/weather"
+ sodipodi:docname="weather-snow.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective253" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient10630"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient10628"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient10626"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient10624"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient10622"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient10620"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient10618"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient10616"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient10614"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient10612"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient10610"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient10608"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient10606"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient10604"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient7834">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop7836" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop7838" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7834"
+ id="linearGradient10602"
+ gradientUnits="userSpaceOnUse"
+ x1="-156.29044"
+ y1="-100.53421"
+ x2="-153.09810"
+ y2="-96.544556" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8397">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8400" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient10600"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8315">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8317" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8319" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient10598"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8381">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8383" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8385" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient10596"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8331">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8333" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8335" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient10594"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8302">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8304" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8306" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient10592"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(122.0230,102.0000)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="278.91510"
+ y2="-375.37952" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2298"
+ id="linearGradient7748"
+ gradientUnits="userSpaceOnUse"
+ x1="-27.006643"
+ y1="-37.550461"
+ x2="-34.700153"
+ y2="-4.4493785" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient7746"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient7744"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4829">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4831" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4833" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3478">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3480" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3482" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2298">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2300" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2302" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:0;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2527">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop2529" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="1"
+ id="stop2531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2500">
+ <stop
+ style="stop-color:#fce94f;stop-opacity:1;"
+ offset="0"
+ id="stop2502" />
+ <stop
+ style="stop-color:#fce94f;stop-opacity:0;"
+ offset="1"
+ id="stop2504" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2392">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2394" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2396" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2254">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2256" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2258" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2263"
+ gradientUnits="userSpaceOnUse"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581"
+ gradientTransform="translate(-1.608757,3.097272)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2271"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2283"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2287"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2291"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2295"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2299"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2303"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.707748,-5.784024)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(16.14002,24.66420)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.932144,25.87240)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.356636,23.86870)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(11.19027,26.52035)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2358"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(10.30638,19.27251)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.207586,21.30544)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2398"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.608757,3.097272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2442"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2446"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2451"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2469"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2475"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2478"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2483"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.842481,-3.998086)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2506"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2509"
+ gradientUnits="userSpaceOnUse"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2513"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ x1="38.857941"
+ y1="-18.407482"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2517"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient2533"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(17.33814,3.415985)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2541"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2555"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.499805,1.708617)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.726830,2.481141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="linearGradient3353"
+ x1="23.303862"
+ y1="29.115711"
+ x2="29.750000"
+ y2="46.092930"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3386"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3398"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.561802,-4.303373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1514"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(88.49344,-9.697877)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1516"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1518"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient1520"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1522"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1524"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1526"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1528"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1530"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1532"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1534"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1536"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1538"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(57.97693,-10.56876)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient1557"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4829"
+ id="radialGradient4835"
+ cx="-35.001785"
+ cy="-1.1439217"
+ fx="-35.001785"
+ fy="-1.1439217"
+ r="17.500893"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.565657,-5.564992e-15,-0.496855)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2298"
+ id="linearGradient1427"
+ gradientUnits="userSpaceOnUse"
+ x1="-27.006643"
+ y1="-37.550461"
+ x2="-34.700153"
+ y2="-4.4493785" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient1431"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient14128"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient14130"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2298"
+ id="linearGradient14132"
+ gradientUnits="userSpaceOnUse"
+ x1="-27.006643"
+ y1="-37.550461"
+ x2="-34.700153"
+ y2="-4.4493785" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="23.594384"
+ inkscape:cy="39.722629"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="859"
+ inkscape:window-height="818"
+ inkscape:window-x="0"
+ inkscape:window-y="30"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-snow</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan Collier (pseudo)</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>applet</rdf:li>
+ <rdf:li>notification</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g9947"
+ transform="translate(-340.0455,298.0001)">
+ <path
+ id="path8718"
+ d="M 364.52300,-296.00000 C 361.75058,-296.00000 359.41477,-294.42629 358.11675,-292.18750 C 357.17239,-292.66254 356.15156,-293.00000 355.02300,-293.00000 C 351.15900,-293.00000 348.02300,-289.86400 348.02300,-286.00000 C 348.02300,-282.13600 351.15900,-279.00000 355.02300,-279.00000 C 357.44267,-279.00000 359.45309,-280.31932 360.71050,-282.18750 C 361.84470,-281.49788 363.09948,-281.00000 364.52300,-281.00000 C 365.43612,-281.00000 366.27595,-281.23202 367.08550,-281.53125 C 367.59544,-280.66352 368.26462,-279.95153 369.08550,-279.37500 C 369.07826,-279.24462 369.02300,-279.13218 369.02300,-279.00000 C 369.02300,-275.13600 372.15899,-272.00000 376.02300,-272.00000 C 379.88700,-272.00000 383.02300,-275.13600 383.02300,-279.00000 C 383.02300,-281.36969 381.76402,-283.35834 379.96050,-284.62500 C 379.96774,-284.75538 380.02300,-284.86782 380.02300,-285.00000 C 380.02300,-288.86400 376.88701,-292.00000 373.02300,-292.00000 C 372.40030,-292.00000 371.84781,-291.77781 371.27300,-291.62500 C 370.07847,-294.18384 367.53166,-296.00000 364.52300,-296.00000 z "
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path8720"
+ d="M 364.52300,-295.00000 C 361.74252,-295.00000 359.38849,-293.23815 358.46050,-290.78125 C 357.47508,-291.49069 356.32907,-292.00000 355.02300,-292.00000 C 351.71100,-292.00000 349.02300,-289.31200 349.02300,-286.00000 C 349.02300,-282.68800 351.71100,-280.00000 355.02300,-280.00000 C 357.45075,-280.00000 359.51624,-281.45558 360.46050,-283.53125 C 361.58126,-282.61369 362.96264,-282.00000 364.52300,-282.00000 C 365.59754,-282.00000 366.56728,-282.31896 367.46050,-282.78125 C 367.85890,-281.78149 368.56164,-280.99493 369.39800,-280.34375 C 369.21799,-279.74813 369.02300,-279.15410 369.02300,-278.50000 C 369.02300,-274.91200 371.93500,-272.00000 375.52300,-272.00000 C 379.11100,-272.00000 382.02300,-274.91200 382.02300,-278.50000 C 382.02300,-280.86079 380.68867,-282.83019 378.80425,-283.96875 C 378.86684,-284.31598 379.02300,-284.63483 379.02300,-285.00000 C 379.02300,-288.31200 376.33500,-291.00000 373.02300,-291.00000 C 372.17002,-291.00000 371.35170,-290.82132 370.61675,-290.50000 C 369.76298,-293.09388 367.40151,-294.99999 364.52300,-295.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient10592);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.964447,0.000000,0.000000,0.964447,142.3115,91.52621)"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ sodipodi:ry="6.7396116"
+ sodipodi:rx="6.7396116"
+ sodipodi:cy="-383.66660"
+ sodipodi:cx="241.80843"
+ id="path8722"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <g
+ transform="translate(122.0230,102.0000)"
+ id="g8724">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8726"
+ sodipodi:cx="243.95184"
+ sodipodi:cy="-389.30136"
+ sodipodi:rx="6.2313786"
+ sodipodi:ry="6.2313786"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,27.18078,-46.89094)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10594);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8728"
+ sodipodi:cx="243.95184"
+ sodipodi:cy="-389.30136"
+ sodipodi:rx="6.2313786"
+ sodipodi:ry="6.2313786"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,27.18078,-46.89094)" />
+ </g>
+ <g
+ transform="translate(122.0230,102.0000)"
+ id="g8730">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8732"
+ sodipodi:cx="251.22179"
+ sodipodi:cy="-385.78790"
+ sodipodi:rx="6.0325046"
+ sodipodi:ry="6.0325046"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,21.45407,-34.76637)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10596);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8734"
+ sodipodi:cx="251.22179"
+ sodipodi:cy="-385.78790"
+ sodipodi:rx="6.0325046"
+ sodipodi:ry="6.0325046"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,21.45407,-34.76637)" />
+ </g>
+ <g
+ transform="translate(122.0230,102.0000)"
+ id="g8736">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8738"
+ sodipodi:cx="233.43362"
+ sodipodi:cy="-387.88715"
+ sodipodi:rx="4.3752232"
+ sodipodi:ry="4.3752232"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,-33.76771,55.27704)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10598);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8740"
+ sodipodi:cx="233.43362"
+ sodipodi:cy="-387.88715"
+ sodipodi:rx="4.3752232"
+ sodipodi:ry="4.3752232"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,-33.76771,55.27704)" />
+ </g>
+ <g
+ transform="translate(122.0230,102.0000)"
+ id="g8742">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8744"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,-9.150940,14.48994)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10600);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8746"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,-9.150933,14.48993)" />
+ </g>
+ <g
+ style="stroke:none"
+ transform="matrix(0.935028,0.000000,0.000000,0.935028,499.8484,-187.6162)"
+ id="g8748">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:0.33115697;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8750"
+ sodipodi:cx="-155.06250"
+ sodipodi:cy="-96.937500"
+ sodipodi:rx="3.1250000"
+ sodipodi:ry="3.1250000"
+ d="M -151.93750 -96.937500 A 3.1250000 3.1250000 0 1 1 -158.18750,-96.937500 A 3.1250000 3.1250000 0 1 1 -151.93750 -96.937500 z"
+ transform="matrix(1.737733,0.000000,0.000000,1.737733,110.8322,70.07649)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10602);fill-opacity:1.0000000;stroke:none;stroke-width:0.45224530;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8752"
+ sodipodi:cx="-155.06250"
+ sodipodi:cy="-96.937500"
+ sodipodi:rx="3.1250000"
+ sodipodi:ry="3.1250000"
+ d="M -151.93750 -96.937500 A 3.1250000 3.1250000 0 1 1 -158.18750,-96.937500 A 3.1250000 3.1250000 0 1 1 -151.93750 -96.937500 z"
+ transform="matrix(1.737733,0.000000,0.000000,1.737733,110.8948,70.01402)" />
+ </g>
+ <g
+ transform="translate(91.02300,162.0000)"
+ id="g8798">
+ <path
+ style="fill:#c4c5c2;fill-opacity:1.0000000;stroke:#888a85;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-445.50000 C 278.22917,-445.50000 276.39009,-443.94972 275.78125,-441.87500 C 275.08802,-442.23883 274.33674,-442.50000 273.50000,-442.50000 C 270.74000,-442.50000 268.49999,-440.26001 268.50000,-437.50000 C 268.50000,-436.92107 268.66252,-436.39230 268.84375,-435.87500 C 267.47028,-435.10426 266.50000,-433.68600 266.50000,-432.00000 C 266.50000,-429.51600 268.51600,-427.49999 271.00000,-427.50000 C 271.17713,-427.50000 289.82287,-427.50000 290.00000,-427.50000 C 292.48399,-427.50000 294.50000,-429.51600 294.50000,-432.00000 C 294.50000,-433.68600 293.52972,-435.10426 292.15625,-435.87500 C 292.33749,-436.39229 292.50000,-436.92108 292.50000,-437.50000 C 292.50000,-440.26000 290.26000,-442.49999 287.50000,-442.50000 C 286.66326,-442.50000 285.91198,-442.23883 285.21875,-441.87500 C 284.60991,-443.94972 282.77083,-445.50000 280.50000,-445.50000 z "
+ id="path8800"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient10604);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-445.00000 C 278.31028,-445.00000 276.77640,-443.66423 276.10445,-441.15648 C 275.43599,-441.50010 274.55686,-441.98983 273.75000,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.11240,-434.89433 267.00000,-433.73178 267.00000,-432.24973 C 267.00000,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294.00000,-429.90368 294.00000,-432.24973 C 294.00000,-433.84210 292.88760,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.05100 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.60820,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445.00000 280.50000,-445.00000 z "
+ id="path8802"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <g
+ id="g8804">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8806"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8808"
+ style="opacity:1.0000000;fill:url(#linearGradient10606);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <rect
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect8810"
+ width="20.000000"
+ height="9.0000000"
+ x="271.00000"
+ y="-438.00000" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8812"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830195,-35.68869)" />
+ <g
+ id="g8814">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19811,24.86321)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8816"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8818"
+ style="opacity:1.0000000;fill:url(#linearGradient10608);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g8820">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8822"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8824"
+ style="opacity:1.0000000;fill:url(#linearGradient10610);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g8826"
+ transform="translate(-1.000000,0.000000)">
+ <path
+ id="path8828"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274.00000,-438.04812 274.00000,-434.46875 C 274.00000,-432.09807 275.34943,-430.13096 277.25000,-429.00000 L 283.71875,-429.00000 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.50000 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z "
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path8830"
+ d="M 280.50000,-441.00000 C 276.91200,-441.00000 274.00000,-438.08799 274.00000,-434.50000 C 274.00000,-432.12360 275.34485,-430.13368 277.25000,-429.00000 L 283.75000,-429.00000 C 285.65515,-430.13368 287.00000,-432.12360 287.00000,-434.50000 C 287.00000,-438.08800 284.08800,-440.99999 280.50000,-441.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient10612);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10614);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8832"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830296,-35.68884)" />
+ <path
+ style="fill:#888a85;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 292.95640,-437.33396 C 292.95487,-434.64940 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.95640,-437.33396 292.95640,-437.33396 z "
+ id="path8834"
+ sodipodi:nodetypes="ccss" />
+ <g
+ id="g8836"
+ transform="matrix(1.142857,0.000000,0.000000,1.142857,-28.57139,67.00008)">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8838"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8840"
+ style="opacity:1.0000000;fill:url(#linearGradient10616);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <g
+ transform="translate(76.02041,158.0000)"
+ id="g8754">
+ <path
+ style="fill:#c4c5c2;fill-opacity:1.0000000;stroke:#888a85;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-445.50000 C 278.22917,-445.50000 276.39009,-443.94972 275.78125,-441.87500 C 275.08802,-442.23883 274.33674,-442.50000 273.50000,-442.50000 C 270.74000,-442.50000 268.49999,-440.26001 268.50000,-437.50000 C 268.50000,-436.92107 268.66252,-436.39230 268.84375,-435.87500 C 267.47028,-435.10426 266.50000,-433.68600 266.50000,-432.00000 C 266.50000,-429.51600 268.51600,-427.49999 271.00000,-427.50000 C 271.17713,-427.50000 289.82287,-427.50000 290.00000,-427.50000 C 292.48399,-427.50000 294.50000,-429.51600 294.50000,-432.00000 C 294.50000,-433.68600 293.52972,-435.10426 292.15625,-435.87500 C 292.33749,-436.39229 292.50000,-436.92108 292.50000,-437.50000 C 292.50000,-440.26000 290.26000,-442.49999 287.50000,-442.50000 C 286.66326,-442.50000 285.91198,-442.23883 285.21875,-441.87500 C 284.60991,-443.94972 282.77083,-445.50000 280.50000,-445.50000 z "
+ id="path8756"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient10618);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-445.00000 C 278.31028,-445.00000 276.77640,-443.66423 276.10445,-441.15648 C 275.43599,-441.50010 274.55686,-441.98983 273.75000,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.11240,-434.89433 267.00000,-433.73178 267.00000,-432.24973 C 267.00000,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294.00000,-429.90368 294.00000,-432.24973 C 294.00000,-433.84210 292.88760,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.05100 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.60820,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445.00000 280.50000,-445.00000 z "
+ id="path8758"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <g
+ id="g8760">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8762"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8764"
+ style="opacity:1.0000000;fill:url(#linearGradient10620);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <rect
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect8766"
+ width="20.000000"
+ height="9.0000000"
+ x="271.00000"
+ y="-438.00000" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8768"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830195,-35.68869)" />
+ <g
+ id="g8770">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19811,24.86321)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8772"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8774"
+ style="opacity:1.0000000;fill:url(#linearGradient10622);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g8776">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8778"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8780"
+ style="opacity:1.0000000;fill:url(#linearGradient10624);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g8782"
+ transform="translate(-1.000000,0.000000)">
+ <path
+ id="path8784"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274.00000,-438.04812 274.00000,-434.46875 C 274.00000,-432.09807 275.34943,-430.13096 277.25000,-429.00000 L 283.71875,-429.00000 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.50000 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z "
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path8786"
+ d="M 280.50000,-441.00000 C 276.91200,-441.00000 274.00000,-438.08799 274.00000,-434.50000 C 274.00000,-432.12360 275.34485,-430.13368 277.25000,-429.00000 L 283.75000,-429.00000 C 285.65515,-430.13368 287.00000,-432.12360 287.00000,-434.50000 C 287.00000,-438.08800 284.08800,-440.99999 280.50000,-441.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient10626);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient10628);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path8788"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830296,-35.68884)" />
+ <path
+ style="fill:#888a85;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 292.95640,-437.33396 C 292.95487,-434.64940 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.95640,-437.33396 292.95640,-437.33396 z "
+ id="path8790"
+ sodipodi:nodetypes="ccss" />
+ <g
+ id="g8792"
+ transform="matrix(1.142857,0.000000,0.000000,1.142857,-28.57139,67.00008)">
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8794"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path8796"
+ style="opacity:1.0000000;fill:url(#linearGradient10630);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g12157"
+ transform="translate(-163.0077,222.0147)">
+ <path
+ transform="matrix(0.685520,0.000000,0.000000,0.685520,151.7017,27.15827)"
+ d="M 31.819805 -316.77872 A 2.2097087 2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087 2.2097087 0 1 1 31.819805 -316.77872 z"
+ sodipodi:ry="2.2097087"
+ sodipodi:rx="2.2097087"
+ sodipodi:cy="-316.77872"
+ sodipodi:cx="29.610096"
+ id="path12159"
+ style="opacity:1.0000000;fill:#ffffff;fill-opacity:1.0000000;stroke:#729fcf;stroke-width:1.4587468;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.915572,0.000000,0.000000,0.915587,152.4091,103.5577)"
+ d="M 31.819805 -316.77872 A 2.2097087 2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087 2.2097087 0 1 1 31.819805 -316.77872 z"
+ sodipodi:ry="2.2097087"
+ sodipodi:rx="2.2097087"
+ sodipodi:cy="-316.77872"
+ sodipodi:cx="29.610096"
+ id="path12161"
+ style="opacity:1.0000000;fill:#ffffff;fill-opacity:1.0000000;stroke:#729fcf;stroke-width:1.0922043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.672406,0.000000,0.000000,0.683742,153.0708,34.62149)"
+ d="M 31.819805 -316.77872 A 2.2097087 2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087 2.2097087 0 1 1 31.819805 -316.77872 z"
+ sodipodi:ry="2.2097087"
+ sodipodi:rx="2.2097087"
+ sodipodi:cy="-316.77872"
+ sodipodi:cx="29.610096"
+ id="path12163"
+ style="opacity:1.0000000;fill:#ffffff;fill-opacity:1.0000000;stroke:#729fcf;stroke-width:1.4748161;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.682300,0.000000,0.000000,0.680269,181.7970,30.49471)"
+ d="M 31.819805 -316.77872 A 2.2097087 2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087 2.2097087 0 1 1 31.819805 -316.77872 z"
+ sodipodi:ry="2.2097087"
+ sodipodi:rx="2.2097087"
+ sodipodi:cy="-316.77872"
+ sodipodi:cx="29.610096"
+ id="path12165"
+ style="opacity:1.0000000;fill:#ffffff;fill-opacity:1.0000000;stroke:#729fcf;stroke-width:1.4678179;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.107132,0.000000,0.000000,1.117168,157.2177,164.9217)"
+ d="M 31.819805 -316.77872 A 2.2097087 2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087 2.2097087 0 1 1 31.819805 -316.77872 z"
+ sodipodi:ry="2.2097087"
+ sodipodi:rx="2.2097087"
+ sodipodi:cy="-316.77872"
+ sodipodi:cx="29.610096"
+ id="path12167"
+ style="opacity:1.0000000;fill:#ffffff;fill-opacity:1.0000000;stroke:#729fcf;stroke-width:0.89916825;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.127592,0.000000,0.000000,1.051830,161.6119,151.3731)"
+ d="M 31.819805 -316.77872 A 2.2097087 2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087 2.2097087 0 1 1 31.819805 -316.77872 z"
+ sodipodi:ry="2.2097087"
+ sodipodi:rx="2.2097087"
+ sodipodi:cy="-316.77872"
+ sodipodi:cx="29.610096"
+ id="path12169"
+ style="opacity:1.0000000;fill:#ffffff;fill-opacity:1.0000000;stroke:#729fcf;stroke-width:0.91822928;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.685519,0.000000,0.000000,0.680487,164.6869,34.56369)"
+ d="M 31.819805 -316.77872 A 2.2097087 2.2097087 0 1 1 27.400387,-316.77872 A 2.2097087 2.2097087 0 1 1 31.819805 -316.77872 z"
+ sodipodi:ry="2.2097087"
+ sodipodi:rx="2.2097087"
+ sodipodi:cy="-316.77872"
+ sodipodi:cx="29.610096"
+ id="path12171"
+ style="opacity:1.0000000;fill:#ffffff;fill-opacity:1.0000000;stroke:#729fcf;stroke-width:1.4641328;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-storm.svg b/demos/embedded/weatherinfo/icons/weather-storm.svg
new file mode 100644
index 0000000..4d8bfec
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-storm.svg
@@ -0,0 +1,4308 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/rcollier/Work/Novell/Tango/weather"
+ sodipodi:docname="weather-storm.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective488" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8397">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8400" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient13503"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8315">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8317" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8319" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient13501"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8381">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8383" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8385" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient13499"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8331">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8333" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8335" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient13497"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8302">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8304" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8306" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient13495"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69.00000,155.0000)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="266.36395"
+ y2="-379.26862" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13143"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient13141"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient13139"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-35.00007,207.0001)"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13137"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient13135"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient13133"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient13131"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-34.00007,207.0001)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8874"
+ id="linearGradient11195"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.15871,7.082841)"
+ x1="-190.47688"
+ y1="-332.51181"
+ x2="-196.19046"
+ y2="-328.53433" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8904"
+ id="linearGradient11193"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.80516,2.840199)"
+ x1="-191.28896"
+ y1="-328.07861"
+ x2="-192.41396"
+ y2="-315.32861" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8874">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8876" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8878" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8874"
+ id="linearGradient11191"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.15871,7.082841)"
+ x1="-190.47688"
+ y1="-332.51181"
+ x2="-196.19046"
+ y2="-328.53433" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8904">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop8906" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="1"
+ id="stop8908" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8904"
+ id="linearGradient11189"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.80516,2.840199)"
+ x1="-191.28896"
+ y1="-328.07861"
+ x2="-192.41396"
+ y2="-315.32861" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5123"
+ id="radialGradient13211"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.930946,6.185702e-16,-2.842711e-16,0.448244,245.3644,184.9256)"
+ cx="-229.75000"
+ cy="-343.95554"
+ fx="-229.75000"
+ fy="-343.95554"
+ r="14.501380" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13157"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient13155"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient13153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-35.00007,207.0001)"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13151"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient13149"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient13147"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient13145"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-34.00007,207.0001)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5123">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5125" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5127" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5123"
+ id="radialGradient13068"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.930946,6.185702e-16,-2.842711e-16,0.448244,229.9269,180.9261)"
+ cx="-229.75000"
+ cy="-343.95554"
+ fx="-229.75000"
+ fy="-343.95554"
+ r="14.501380" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6840">
+ <stop
+ style="stop-color:#ad7fa8;stop-opacity:1;"
+ offset="0"
+ id="stop6842" />
+ <stop
+ style="stop-color:#ad7fa8;stop-opacity:0;"
+ offset="1"
+ id="stop6844" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6828">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6830" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6832" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6537">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6539" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6541" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2298">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2300" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2302" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:0;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2527">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop2529" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="1"
+ id="stop2531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2500">
+ <stop
+ style="stop-color:#fce94f;stop-opacity:1;"
+ offset="0"
+ id="stop2502" />
+ <stop
+ style="stop-color:#fce94f;stop-opacity:0;"
+ offset="1"
+ id="stop2504" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2392">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2394" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2396" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2254">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2256" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2258" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2263"
+ gradientUnits="userSpaceOnUse"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581"
+ gradientTransform="translate(-1.608757,3.097272)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2271"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2283"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2287"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2291"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2295"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2299"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2303"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.707748,-5.784024)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(16.14002,24.66420)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.932144,25.87240)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.356636,23.86870)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(11.19027,26.52035)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2358"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(10.30638,19.27251)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.207586,21.30544)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2398"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.608757,3.097272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2442"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2446"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2451"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2469"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2475"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2478"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2483"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.842481,-3.998086)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2506"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2509"
+ gradientUnits="userSpaceOnUse"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2513"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ x1="38.857941"
+ y1="-18.407482"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2517"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient2533"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(17.33814,3.415985)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2541"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2555"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.499805,1.708617)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.726830,2.481141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="linearGradient3353"
+ x1="23.303862"
+ y1="29.115711"
+ x2="29.750000"
+ y2="46.092930"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3386"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3398"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.561802,-4.303373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2916"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2914"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2912"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2910"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2908"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2906"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2904"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2902"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2900"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2898"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2896"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2894"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2892"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2890"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2888"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2886"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2884"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2882"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2880"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2878"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2876"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2874"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2872"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2870"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2868"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2866"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2864"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2862"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2860"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2858"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2856"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient2854"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2852"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2850"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2848"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2846"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient2844"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2842"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2840"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2838"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient2836"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2834"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2832"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2830"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2828"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2826"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2824"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2822"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2820"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2818"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2816"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2814"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2812"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2810"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2808"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2806"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2804"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2802"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2800"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2798"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2796"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2794"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient2792"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2790"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2788"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2786"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2784"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2782"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2780"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2778"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2776"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2774"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2772"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2770"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2768"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2766"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2764"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2762"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2760"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2758"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2756"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2754"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2752"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2750"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2748"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2746"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2744"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2304"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1557"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1538"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1536"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1534"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1532"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1530"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1528"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1526"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1524"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1522"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1520"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1518"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1516"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1514"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5957"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5955"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5953"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5951"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5949"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5947"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5945"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5943"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5941"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5939"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5937"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5935"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5933"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5931"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5929"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5927"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient5925"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5923"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5921"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5919"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5917"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient5915"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5913"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5911"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5909"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient5907"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5905"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5903"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5901"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5899"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5897"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5895"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5893"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5891"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5889"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5887"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5885"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5883"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5881"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5879"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5877"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5875"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5873"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5871"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5869"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5867"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5865"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient5863"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5861"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5859"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5857"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5855"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5853"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5851"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5849"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5847"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5845"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5843"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5841"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5839"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5837"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5835"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5833"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5831"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5829"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5827"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5825"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5823"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5821"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5819"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5817"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5815"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6098"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6101"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.13675,17.05613)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6118"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,12.38965,19.30874)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-10.72430,10.10861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6124"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(21.51400,12.80461)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6179"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6181"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6183"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6185"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6187"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6189"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6191"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient6193"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6199"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6202"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6205"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-4.372193,11.95105)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6208"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6211"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6214"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6242"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6244"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6248"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6252"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6254"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6257"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.297112,4.275205)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6260"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,10.91453,3.180085)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6263"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-1.156692,-1.510075)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6266"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,19.40677,5.249635)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6269"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.79432,0.174884)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.085690,-2.351766)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.921913,-0.223072)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(21.51400,12.80461)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6313"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-10.72430,10.10861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6315"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,12.38965,19.30874)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6317"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-1.156692,-1.510075)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6319"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.13675,17.05613)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6321"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6323"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6325"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6327"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6329"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6331"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6333"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6335"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.921913,-0.223072)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6337"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.085690,-2.351766)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.79432,0.174884)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6341"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,19.40677,5.249635)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6343"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,10.91453,3.180085)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6543"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-2.763717e-17,0.972572,16.13182,0.843286)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6547"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-4.388782e-16,0.972572,25.91493,0.633642)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6551"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-4.388782e-16,0.972572,36.25638,0.633643)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6559"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-2.332577e-16,0.972572,16.13182,0.843286)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6561"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-6.444987e-16,0.972572,25.91493,0.633642)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-6.444987e-16,0.972572,36.25638,0.633643)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6566"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-6.388715e-16,1.006703,39.04124,-0.702889)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6569"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-6.388715e-16,1.006703,27.70322,-0.702890)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6572"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-1.880005e-16,1.006703,16.97734,-0.485889)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6576"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.132431,0.000000,0.000000,1.016132,10.54485,-4.728138)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6579"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.853605,0.000000,0.000000,1.016132,19.23518,-2.625202)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6582"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,13.49182,-7.781819)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6585"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,7.650036,-10.34923)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6588"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,2.365814,-8.186195)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6599"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.999079,0.000000,0.000000,1.016132,56.82188,9.371753)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6603"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.496116,0.000000,0.000000,1.282841,-1.807925,-9.493960)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6606"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.314274,0.000000,0.000000,1.016132,12.05438,11.66070)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6609"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.496116,0.000000,0.000000,1.282841,-11.59870,2.312158)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6612"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,21.39156,5.051653)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6618"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,16.09471,2.948843)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6622"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,11.32174,9.047633)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6624"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6626"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6628"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6630"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6632"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6634"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6636"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6828"
+ id="radialGradient6834"
+ cx="15.147860"
+ cy="23.822156"
+ fx="15.147860"
+ fy="23.822156"
+ r="12.852140"
+ gradientTransform="matrix(0.654874,0.000000,0.000000,0.398574,2.663540,12.14676)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6840"
+ id="radialGradient6846"
+ cx="32.583473"
+ cy="25.240442"
+ fx="32.583473"
+ fy="25.240442"
+ r="8.4165270"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.503823,-15.00000,6.042836)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6828"
+ id="radialGradient6852"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.654874,0.000000,0.000000,0.398574,44.33646,16.14676)"
+ cx="15.147860"
+ cy="23.822156"
+ fx="15.147860"
+ fy="23.822156"
+ r="12.852140" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6840"
+ id="radialGradient6854"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.000000,0.000000,0.000000,0.503823,62.00000,10.04284)"
+ cx="32.583473"
+ cy="25.240442"
+ fx="32.583473"
+ fy="25.240442"
+ r="8.4165270" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="19.667589"
+ inkscape:cy="18.541776"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1200"
+ inkscape:window-height="704"
+ inkscape:window-x="186"
+ inkscape:window-y="144"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-storm</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan Collier</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>applet</rdf:li>
+ <rdf:li>notify</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g12825"
+ transform="translate(-287.0204,244.9995)">
+ <path
+ id="path12827"
+ d="M 311.50000,-242.99998 C 308.72758,-242.99998 306.39177,-241.42627 305.09375,-239.18748 C 304.14939,-239.66252 303.12856,-239.99998 302.00000,-239.99998 C 298.13600,-239.99998 295.00000,-236.86398 295.00000,-232.99998 C 295.00000,-229.13598 298.13600,-225.99998 302.00000,-225.99998 C 304.41967,-225.99998 306.43009,-227.31930 307.68750,-229.18748 C 308.82170,-228.49786 310.07648,-227.99998 311.50000,-227.99998 C 312.41312,-227.99998 313.25295,-228.23200 314.06250,-228.53123 C 314.57244,-227.66350 315.24162,-226.95151 316.06250,-226.37498 C 316.05526,-226.24460 316.00000,-226.13216 316.00000,-225.99998 C 316.00000,-222.13598 319.13599,-218.99998 323.00000,-218.99998 C 326.86400,-218.99998 330.00000,-222.13598 330.00000,-225.99998 C 330.00000,-228.36967 328.74102,-230.35832 326.93750,-231.62498 C 326.94474,-231.75536 327.00000,-231.86780 327.00000,-231.99998 C 327.00000,-235.86398 323.86401,-238.99998 320.00000,-238.99998 C 319.37730,-238.99998 318.82481,-238.77779 318.25000,-238.62498 C 317.05547,-241.18382 314.50866,-242.99998 311.50000,-242.99998 z "
+ style="opacity:1.0000000;fill:#555753;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path12829"
+ d="M 311.50000,-241.99998 C 308.71952,-241.99998 306.36549,-240.23813 305.43750,-237.78123 C 304.45208,-238.49067 303.30607,-238.99998 302.00000,-238.99998 C 298.68800,-238.99998 296.00000,-236.31198 296.00000,-232.99998 C 296.00000,-229.68798 298.68800,-226.99998 302.00000,-226.99998 C 304.42775,-226.99998 306.49324,-228.45556 307.43750,-230.53123 C 308.55826,-229.61367 309.93964,-228.99998 311.50000,-228.99998 C 312.57454,-228.99998 313.54428,-229.31894 314.43750,-229.78123 C 314.83590,-228.78147 315.53864,-227.99491 316.37500,-227.34373 C 316.19499,-226.74811 316.00000,-226.15408 316.00000,-225.49998 C 316.00000,-221.91198 318.91200,-218.99998 322.50000,-218.99998 C 326.08800,-218.99998 329.00000,-221.91198 329.00000,-225.49998 C 329.00000,-227.86077 327.66567,-229.83017 325.78125,-230.96873 C 325.84384,-231.31596 326.00000,-231.63481 326.00000,-231.99998 C 326.00000,-235.31198 323.31200,-237.99998 320.00000,-237.99998 C 319.14702,-237.99998 318.32870,-237.82130 317.59375,-237.49998 C 316.73998,-240.09386 314.37851,-241.99997 311.50000,-241.99998 z "
+ style="opacity:1.0000000;fill:url(#linearGradient13495);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.964447,0.000000,0.000000,0.964447,89.28852,144.5262)"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ sodipodi:ry="6.7396116"
+ sodipodi:rx="6.7396116"
+ sodipodi:cy="-383.66660"
+ sodipodi:cx="241.80843"
+ id="path12831"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <g
+ id="g12833">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12835"
+ sodipodi:cx="243.95184"
+ sodipodi:cy="-389.30136"
+ sodipodi:rx="6.2313786"
+ sodipodi:ry="6.2313786"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,96.18078,108.1091)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.49444440;fill:url(#linearGradient13497);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12837"
+ sodipodi:cx="243.95184"
+ sodipodi:cy="-389.30136"
+ sodipodi:rx="6.2313786"
+ sodipodi:ry="6.2313786"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,96.18078,108.1091)" />
+ </g>
+ <g
+ id="g12839">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12841"
+ sodipodi:cx="251.22179"
+ sodipodi:cy="-385.78790"
+ sodipodi:rx="6.0325046"
+ sodipodi:ry="6.0325046"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,90.45407,120.2336)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.49444440;fill:url(#linearGradient13499);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12843"
+ sodipodi:cx="251.22179"
+ sodipodi:cy="-385.78790"
+ sodipodi:rx="6.0325046"
+ sodipodi:ry="6.0325046"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,90.45407,120.2336)" />
+ </g>
+ <g
+ id="g12845">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12847"
+ sodipodi:cx="233.43362"
+ sodipodi:cy="-387.88715"
+ sodipodi:rx="4.3752232"
+ sodipodi:ry="4.3752232"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,35.23229,210.2770)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.49444440;fill:url(#linearGradient13501);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12849"
+ sodipodi:cx="233.43362"
+ sodipodi:cy="-387.88715"
+ sodipodi:rx="4.3752232"
+ sodipodi:ry="4.3752232"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,35.23229,210.2770)" />
+ </g>
+ <g
+ id="g12851">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12853"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,59.84906,169.4899)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.49444440;fill:url(#linearGradient13503);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12855"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,59.84907,169.4899)" />
+ </g>
+ </g>
+ <g
+ id="g11177"
+ transform="translate(208.8564,357.8851)">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path11179"
+ d="M -173.24571,-327.59122 L -176.37021,-323.31202 L -172.59078,-323.31202 C -172.59078,-323.31202 -175.29396,-318.78622 -180.16632,-310.38562 C -178.07014,-318.33294 -177.21353,-321.35581 -177.21353,-321.35581 L -182.37682,-321.35581 L -178.33401,-327.59122 L -173.24571,-327.59122 z "
+ style="fill:#edd400;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient11189);stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path11181"
+ d="M -173.75946,-327.84461 L -177.50268,-322.68152 L -173.54648,-322.85830 C -173.54648,-322.85830 -173.68639,-322.39837 -178.55875,-313.99777 C -176.46257,-321.94509 -176.48985,-321.96275 -176.48985,-321.96275 L -181.38797,-321.87436 L -177.69871,-327.57944 L -173.75946,-327.84461 z "
+ style="opacity:1.0000000;fill:url(#linearGradient11191);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ </g>
+ <g
+ id="g12857"
+ transform="translate(-215.0060,252.9994)">
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path12859"
+ d="M 246.49993,-238.49993 C 244.22910,-238.49993 242.39002,-236.94965 241.78118,-234.87493 C 241.08795,-235.23876 240.33667,-235.49993 239.49993,-235.49993 C 236.73993,-235.49993 234.49992,-233.25994 234.49993,-230.49993 C 234.49993,-229.92100 234.66245,-229.39223 234.84368,-228.87493 C 233.47021,-228.10419 232.49993,-226.68593 232.49993,-224.99993 C 232.49993,-222.51593 234.51593,-220.49992 236.99993,-220.49993 C 237.17706,-220.49993 255.82280,-220.49993 255.99993,-220.49993 C 258.48392,-220.49993 260.49993,-222.51593 260.49993,-224.99993 C 260.49993,-226.68593 259.52965,-228.10419 258.15618,-228.87493 C 258.33742,-229.39222 258.49993,-229.92101 258.49993,-230.49993 C 258.49993,-233.25993 256.25993,-235.49992 253.49993,-235.49993 C 252.66319,-235.49993 251.91191,-235.23876 251.21868,-234.87493 C 250.60984,-236.94965 248.77076,-238.49993 246.49993,-238.49993 z "
+ style="fill:#888a85;fill-opacity:1.0000000;stroke:#555753;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path12861"
+ d="M 246.49993,-237.99993 C 244.31021,-237.99993 242.77633,-236.66416 242.10438,-234.15641 C 241.43592,-234.50003 240.55679,-234.98976 239.74993,-234.98976 C 237.03342,-234.98976 234.99479,-233.05094 234.99480,-230.44422 C 234.99480,-229.89745 235.26201,-229.11078 235.43676,-228.62221 C 234.11233,-227.89426 232.99993,-226.73171 232.99993,-225.24966 C 232.99993,-222.90361 234.54610,-220.99957 237.33921,-220.99957 C 237.51002,-220.99957 255.48985,-220.99957 255.66065,-220.99957 C 258.43166,-220.99957 259.99993,-222.90361 259.99993,-225.24966 C 259.99993,-226.84203 258.88753,-227.91635 257.56310,-228.64430 C 257.73786,-229.13286 258.02717,-229.89746 258.02717,-230.44422 C 258.02717,-233.05093 255.91136,-235.01185 253.24994,-235.01186 C 252.44307,-235.01186 251.60813,-234.52212 250.93967,-234.17850 C 250.29082,-236.60004 248.68966,-237.99993 246.49993,-237.99993 z "
+ style="opacity:1.0000000;fill:url(#linearGradient13131);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12863"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12865"
+ style="opacity:0.47777775;fill:url(#linearGradient13133);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <rect
+ y="-230.99992"
+ x="236.99994"
+ height="9.0000000"
+ width="20.000000"
+ id="rect12867"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16987,171.3114)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12869"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19818,231.8633)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12871"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12873"
+ style="opacity:0.47777775;fill:url(#linearGradient13135);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12875"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12877"
+ style="opacity:0.47777775;fill:url(#linearGradient13137);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ id="path12879"
+ d="M 245.46868,-233.96868 C 241.88930,-233.96868 238.99993,-231.04805 238.99993,-227.46868 C 238.99993,-225.09800 240.34936,-223.13089 242.24993,-221.99993 L 248.71868,-221.99993 C 250.61925,-223.13089 251.96868,-225.12924 251.96868,-227.49993 C 251.96868,-231.07931 249.04805,-233.96868 245.46868,-233.96868 z "
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path12881"
+ d="M 245.49993,-233.99993 C 241.91193,-233.99993 238.99993,-231.08792 238.99993,-227.49993 C 238.99993,-225.12353 240.34478,-223.13361 242.24993,-221.99993 L 248.74993,-221.99993 C 250.65508,-223.13361 251.99993,-225.12353 251.99993,-227.49993 C 251.99993,-231.08793 249.08793,-233.99992 245.49993,-233.99993 z "
+ style="opacity:0.47777775;fill:url(#linearGradient13139);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16977,171.3113)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12883"
+ style="opacity:0.47777775;fill:url(#linearGradient13141);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path12885"
+ d="M 258.95633,-230.33389 C 258.95480,-227.64933 255.68707,-226.61994 255.68707,-226.61994 C 255.68707,-226.61994 258.03581,-228.24589 258.02392,-230.32495 C 258.02392,-230.32495 258.95633,-230.33389 258.95633,-230.33389 z "
+ style="fill:#555753;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12887"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12889"
+ style="opacity:0.47777775;fill:url(#linearGradient13143);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g11183"
+ transform="translate(192.8564,354.8851)">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path11185"
+ d="M -173.24571,-327.59122 L -176.37021,-323.31202 L -172.59078,-323.31202 C -172.59078,-323.31202 -175.29396,-318.78622 -180.16632,-310.38562 C -178.07014,-318.33294 -177.21353,-321.35581 -177.21353,-321.35581 L -182.37682,-321.35581 L -178.33401,-327.59122 L -173.24571,-327.59122 z "
+ style="fill:#edd400;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient11193);stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path11187"
+ d="M -173.75946,-327.84461 L -177.50268,-322.68152 L -173.54648,-322.85830 C -173.54648,-322.85830 -173.68639,-322.39837 -178.55875,-313.99777 C -176.46257,-321.94509 -176.48985,-321.96275 -176.48985,-321.96275 L -181.38797,-321.87436 L -177.69871,-327.57944 L -173.75946,-327.84461 z "
+ style="opacity:1.0000000;fill:url(#linearGradient11195);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ </g>
+ <path
+ style="opacity:1.0000000;fill:url(#radialGradient13211);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000004;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ d="M 31.626355,14.999520 C 29.626255,14.999520 27.940775,16.079020 27.095785,17.614460 C 26.500875,17.392550 25.851145,17.261090 25.169835,17.261090 C 22.339625,17.261090 20.052305,19.379260 20.052305,21.978590 C 20.052305,22.432340 20.196835,22.835420 20.327445,23.250720 C 18.945125,24.115990 17.979615,25.504290 17.979615,27.155450 C 17.979615,29.808280 18.631235,32.148800 23.207195,31.961300 C 23.252315,31.959450 40.658675,32.058280 40.907605,31.943270 C 43.992815,32.169220 44.979615,29.497540 44.979615,27.243810 C 44.979615,25.543300 44.142675,24.193960 42.670345,23.366220 C 42.718305,23.107660 42.631785,22.815030 42.631785,22.543970 C 42.631785,19.944650 40.326135,17.826480 37.495915,17.826480 C 37.102425,17.826480 36.763515,17.961300 36.395375,18.038500 C 35.656915,16.270380 33.810365,14.999520 31.626355,14.999520 z "
+ id="path13209"
+ sodipodi:nodetypes="ccsscsscscsscc" />
+ <g
+ id="g12891"
+ transform="translate(-230.0203,248.9834)">
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path12893"
+ d="M 246.49993,-238.49993 C 244.22910,-238.49993 242.39002,-236.94965 241.78118,-234.87493 C 241.08795,-235.23876 240.33667,-235.49993 239.49993,-235.49993 C 236.73993,-235.49993 234.49992,-233.25994 234.49993,-230.49993 C 234.49993,-229.92100 234.66245,-229.39223 234.84368,-228.87493 C 233.47021,-228.10419 232.49993,-226.68593 232.49993,-224.99993 C 232.49993,-222.51593 234.51593,-220.49992 236.99993,-220.49993 C 237.17706,-220.49993 255.82280,-220.49993 255.99993,-220.49993 C 258.48392,-220.49993 260.49993,-222.51593 260.49993,-224.99993 C 260.49993,-226.68593 259.52965,-228.10419 258.15618,-228.87493 C 258.33742,-229.39222 258.49993,-229.92101 258.49993,-230.49993 C 258.49993,-233.25993 256.25993,-235.49992 253.49993,-235.49993 C 252.66319,-235.49993 251.91191,-235.23876 251.21868,-234.87493 C 250.60984,-236.94965 248.77076,-238.49993 246.49993,-238.49993 z "
+ style="fill:#888a85;fill-opacity:1.0000000;stroke:#555753;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path12895"
+ d="M 246.49993,-237.99993 C 244.31021,-237.99993 242.77633,-236.66416 242.10438,-234.15641 C 241.43592,-234.50003 240.55679,-234.98976 239.74993,-234.98976 C 237.03342,-234.98976 234.99479,-233.05094 234.99480,-230.44422 C 234.99480,-229.89745 235.26201,-229.11078 235.43676,-228.62221 C 234.11233,-227.89426 232.99993,-226.73171 232.99993,-225.24966 C 232.99993,-222.90361 234.54610,-220.99957 237.33921,-220.99957 C 237.51002,-220.99957 255.48985,-220.99957 255.66065,-220.99957 C 258.43166,-220.99957 259.99993,-222.90361 259.99993,-225.24966 C 259.99993,-226.84203 258.88753,-227.91635 257.56310,-228.64430 C 257.73786,-229.13286 258.02717,-229.89746 258.02717,-230.44422 C 258.02717,-233.05093 255.91136,-235.01185 253.24994,-235.01186 C 252.44307,-235.01186 251.60813,-234.52212 250.93967,-234.17850 C 250.29082,-236.60004 248.68966,-237.99993 246.49993,-237.99993 z "
+ style="opacity:1.0000000;fill:url(#linearGradient13145);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12897"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12899"
+ style="opacity:0.47777775;fill:url(#linearGradient13147);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <rect
+ y="-230.99992"
+ x="236.99994"
+ height="9.0000000"
+ width="20.000000"
+ id="rect12901"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16987,171.3114)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12903"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19818,231.8633)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12905"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12907"
+ style="opacity:0.47777775;fill:url(#linearGradient13149);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12909"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12911"
+ style="opacity:0.47777775;fill:url(#linearGradient13151);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ id="path12913"
+ d="M 245.46868,-233.96868 C 241.88930,-233.96868 238.99993,-231.04805 238.99993,-227.46868 C 238.99993,-225.09800 240.34936,-223.13089 242.24993,-221.99993 L 248.71868,-221.99993 C 250.61925,-223.13089 251.96868,-225.12924 251.96868,-227.49993 C 251.96868,-231.07931 249.04805,-233.96868 245.46868,-233.96868 z "
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ id="path12915"
+ d="M 245.49993,-233.99993 C 241.91193,-233.99993 238.99993,-231.08792 238.99993,-227.49993 C 238.99993,-225.12353 240.34478,-223.13361 242.24993,-221.99993 L 248.74993,-221.99993 C 250.65508,-223.13361 251.99993,-225.12353 251.99993,-227.49993 C 251.99993,-231.08793 249.08793,-233.99992 245.49993,-233.99993 z "
+ style="opacity:0.47777775;fill:url(#linearGradient13153);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16977,171.3113)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12917"
+ style="opacity:0.47777775;fill:url(#linearGradient13155);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path12919"
+ d="M 258.95633,-230.33389 C 258.95480,-227.64933 255.68707,-226.61994 255.68707,-226.61994 C 255.68707,-226.61994 258.03581,-228.24589 258.02392,-230.32495 C 258.02392,-230.32495 258.95633,-230.33389 258.95633,-230.33389 z "
+ style="fill:#555753;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12921"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path12923"
+ style="opacity:0.47777775;fill:url(#linearGradient13157);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <path
+ style="opacity:1.0000000;fill:url(#radialGradient13068);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000004;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ d="M 16.188855,11.000000 C 14.188755,11.000000 12.503275,12.079500 11.658285,13.614940 C 11.063375,13.393030 10.413645,13.261570 9.7323346,13.261570 C 6.9021246,13.261570 4.6148046,15.379740 4.6148046,17.979070 C 4.6148046,18.432820 4.7593346,18.835900 4.8899446,19.251200 C 3.5076246,20.116470 2.5421146,21.504770 2.5421146,23.155930 C 2.5421146,25.808760 3.1937346,28.149280 7.7696946,27.961780 C 7.8148146,27.959930 25.221175,28.058760 25.470105,27.943750 C 28.555315,28.169700 29.542115,25.498020 29.542115,23.244290 C 29.542115,21.543780 28.705175,20.194440 27.232845,19.366700 C 27.280805,19.108140 27.194285,18.815510 27.194285,18.544450 C 27.194285,15.945130 24.888635,13.826960 22.058415,13.826960 C 21.664925,13.826960 21.326015,13.961780 20.957875,14.038980 C 20.219415,12.270860 18.372865,11.000000 16.188855,11.000000 z "
+ id="path11418"
+ sodipodi:nodetypes="ccsscsscscsscc" />
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-sunny-very-few-clouds.svg b/demos/embedded/weatherinfo/icons/weather-sunny-very-few-clouds.svg
new file mode 100644
index 0000000..93b0009
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-sunny-very-few-clouds.svg
@@ -0,0 +1,593 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/garrett/Source/tango-icon-theme/scalable/status"
+ sodipodi:docname="weather-sunny-very-few-clouds.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective27908" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient6724"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient6722"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient6720"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient6718"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient6716"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient6714"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient6712"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient6839"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient6837"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient6835"
+ gradientUnits="userSpaceOnUse"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient6833"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient6831"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient6829"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient6827"
+ gradientUnits="userSpaceOnUse"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ id="linearGradient4083">
+ <stop
+ id="stop4085"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0.75"
+ id="stop4089" />
+ <stop
+ id="stop4087"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4032">
+ <stop
+ id="stop4034"
+ offset="0"
+ style="stop-color:#fff7c2;stop-opacity:0.63829786" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0.18348624;"
+ offset="0.59394139"
+ id="stop4036" />
+ <stop
+ id="stop4038"
+ offset="0.83850551"
+ style="stop-color:#fcaf3e;stop-opacity:0.50458717;" />
+ <stop
+ id="stop4040"
+ offset="1"
+ style="stop-color:#fcaf3e;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4026">
+ <stop
+ id="stop4028"
+ offset="0"
+ style="stop-color:#fff9c6;stop-opacity:1" />
+ <stop
+ style="stop-color:#fff28c;stop-opacity:1;"
+ offset="0.54166669"
+ id="stop4042" />
+ <stop
+ id="stop4030"
+ offset="1"
+ style="stop-color:#ffea85;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4026"
+ id="linearGradient3168"
+ gradientUnits="userSpaceOnUse"
+ x1="-28.968945"
+ y1="-25.326815"
+ x2="-37.19698"
+ y2="-9.5590506" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4032"
+ id="radialGradient4020"
+ cx="-33.519073"
+ cy="-22.113297"
+ fx="-33.519073"
+ fy="-22.113297"
+ r="9.5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.487739,1.292402,-1.10267,0.497242,-41.77393,32.41492)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4083"
+ id="radialGradient4081"
+ cx="23.99999"
+ cy="23.381506"
+ fx="23.99999"
+ fy="23.381506"
+ r="19.141981"
+ gradientTransform="matrix(1.006701,2.235326e-16,-2.23715e-16,1.007522,-0.160816,0.426981)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16.270833"
+ inkscape:cx="24"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="982"
+ inkscape:window-height="965"
+ inkscape:window-x="1280"
+ inkscape:window-y="28"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-clear</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan Collier (pseudo)</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>applet</rdf:li>
+ <rdf:li>notification</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Garrett LeSage</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3936">
+ <g
+ style="opacity:0.7"
+ id="g4091">
+ <path
+ style="fill:#fce94f;fill-opacity:1;stroke:#fcaf3e;stroke-width:0.73732895;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24 2.5 L 21.625 9.1875 C 22.399034 9.0641318 23.191406 9 24 9 C 24.808594 9 25.600966 9.0641317 26.375 9.1875 L 24 2.5 z M 8.8125 8.78125 L 11.84375 15.21875 C 12.779034 13.928569 13.928569 12.779034 15.21875 11.84375 L 8.8125 8.78125 z M 39.21875 8.78125 L 32.78125 11.84375 C 34.071431 12.779034 35.220966 13.928569 36.15625 15.21875 L 39.21875 8.78125 z M 9.1875 21.59375 L 2.5 23.96875 L 9.1875 26.34375 C 9.0673373 25.57952 9 24.797813 9 24 C 9 23.180625 9.0608858 22.377571 9.1875 21.59375 z M 38.8125 21.625 C 38.935868 22.399034 39 23.191406 39 24 C 39 24.808594 38.935868 25.600966 38.8125 26.375 L 45.5 24 L 38.8125 21.625 z M 11.84375 32.78125 L 8.8125 39.1875 L 15.21875 36.15625 C 13.928569 35.220966 12.779034 34.071431 11.84375 32.78125 z M 36.15625 32.78125 C 35.229789 34.05926 34.087617 35.194799 32.8125 36.125 L 39.21875 39.1875 L 36.15625 32.78125 z M 21.625 38.8125 L 24 45.5 L 26.375 38.8125 C 25.600966 38.935868 24.808594 39 24 39 C 23.191406 39 22.399034 38.935868 21.625 38.8125 z "
+ id="path7492" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#radialGradient4081);stroke-width:0.84646249;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24 5.25 L 22.65625 9.0625 C 23.098888 9.0231486 23.547187 9 24 9 C 24.452813 9 24.901112 9.0231486 25.34375 9.0625 L 24 5.25 z M 10.78125 10.75 L 12.5 14.375 C 13.071538 13.694089 13.724004 13.038745 14.40625 12.46875 L 10.78125 10.75 z M 37.25 10.75 L 33.625 12.46875 C 34.304675 13.038189 34.961811 13.695325 35.53125 14.375 L 37.25 10.75 z M 9.0625 22.625 L 5.28125 23.96875 L 9.0625 25.3125 C 9.024981 24.880146 9 24.442031 9 24 C 9 23.536406 9.0212735 23.077908 9.0625 22.625 z M 38.9375 22.65625 C 38.976851 23.098888 39 23.547187 39 24 C 39 24.452813 38.976851 24.901112 38.9375 25.34375 L 42.71875 24 L 38.9375 22.65625 z M 35.53125 33.59375 C 34.958293 34.27954 34.309985 34.957363 33.625 35.53125 L 37.25 37.25 L 35.53125 33.59375 z M 12.5 33.625 L 10.78125 37.21875 L 14.375 35.5 C 13.702932 34.935884 13.064116 34.297068 12.5 33.625 z M 22.65625 38.9375 L 24 42.71875 L 25.34375 38.9375 C 24.901112 38.976851 24.452813 39 24 39 C 23.547187 39 23.098888 38.976851 22.65625 38.9375 z "
+ id="path7494" />
+ </g>
+ <g
+ id="g4046">
+ <g
+ id="g3931">
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(0.778062,-1.061285,1.061287,0.778062,67.47952,3.641324)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7498"
+ style="fill:#ffee54;fill-opacity:1;stroke:#fcaf3e;stroke-width:0.75991178;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(1.244257,-0.167707,0.216642,1.251844,67.61648,40.527)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7500"
+ style="fill:url(#radialGradient4020);fill-opacity:1;stroke:none;stroke-width:1.01737845;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(0.715791,-0.976349,0.97635,0.715792,64.00044,5.269544)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7502"
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient3168);stroke-width:0.82601947;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g6783"
+ transform="translate(-263.99,459.9855)">
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path6785"
+ d="M 280.50000,-445.50000 C 278.22917,-445.50000 276.39009,-443.94972 275.78125,-441.87500 C 275.08802,-442.23883 274.33674,-442.50000 273.50000,-442.50000 C 270.74000,-442.50000 268.49999,-440.26001 268.50000,-437.50000 C 268.50000,-436.92107 268.66252,-436.39230 268.84375,-435.87500 C 267.47028,-435.10426 266.50000,-433.68600 266.50000,-432.00000 C 266.50000,-429.51600 268.51600,-427.49999 271.00000,-427.50000 C 271.17713,-427.50000 289.82287,-427.50000 290.00000,-427.50000 C 292.48399,-427.50000 294.50000,-429.51600 294.50000,-432.00000 C 294.50000,-433.68600 293.52972,-435.10426 292.15625,-435.87500 C 292.33749,-436.39229 292.50000,-436.92108 292.50000,-437.50000 C 292.50000,-440.26000 290.26000,-442.49999 287.50000,-442.50000 C 286.66326,-442.50000 285.91198,-442.23883 285.21875,-441.87500 C 284.60991,-443.94972 282.77083,-445.50000 280.50000,-445.50000 z "
+ style="fill:#c4c5c2;fill-opacity:1.0000000;stroke:#888a85;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccsscsssscsscc"
+ id="path6787"
+ d="M 280.50000,-445.00000 C 278.31028,-445.00000 276.77640,-443.66423 276.10445,-441.15648 C 275.43599,-441.50010 274.55686,-441.98983 273.75000,-441.98983 C 271.03349,-441.98983 268.99486,-440.05101 268.99487,-437.44429 C 268.99487,-436.89752 269.26208,-436.11085 269.43683,-435.62228 C 268.11240,-434.89433 267.00000,-433.73178 267.00000,-432.24973 C 267.00000,-429.90368 268.54617,-427.99964 271.33928,-427.99964 C 271.51009,-427.99964 289.48992,-427.99964 289.66072,-427.99964 C 292.43173,-427.99964 294.00000,-429.90368 294.00000,-432.24973 C 294.00000,-433.84210 292.88760,-434.91642 291.56317,-435.64437 C 291.73793,-436.13293 292.02724,-436.89753 292.02724,-437.44429 C 292.02724,-440.05100 289.91143,-442.01192 287.25001,-442.01193 C 286.44314,-442.01193 285.60820,-441.52219 284.93974,-441.17857 C 284.29089,-443.60011 282.68973,-445.00000 280.50000,-445.00000 z "
+ style="opacity:1.0000000;fill:url(#linearGradient6827);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <g
+ id="g6789">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6791"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6829);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6793"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-24.19818,21.86331)" />
+ </g>
+ <rect
+ y="-438.00000"
+ x="271.00000"
+ height="9.0000000"
+ width="20.000000"
+ id="rect6795"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830195,-35.68869)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path6797"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <g
+ id="g6799">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6801"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19811,24.86321)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6831);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6803"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-17.19818,24.86331)" />
+ </g>
+ <g
+ id="g6805">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6807"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6833);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6809"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ </g>
+ <g
+ transform="translate(-1.000000,0.000000)"
+ id="g6811">
+ <path
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.46875,-440.96875 C 276.88937,-440.96875 274.00000,-438.04812 274.00000,-434.46875 C 274.00000,-432.09807 275.34943,-430.13096 277.25000,-429.00000 L 283.71875,-429.00000 C 285.61932,-430.13096 286.96875,-432.12931 286.96875,-434.50000 C 286.96875,-438.07938 284.04812,-440.96875 280.46875,-440.96875 z "
+ id="path6813" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient6835);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 280.50000,-441.00000 C 276.91200,-441.00000 274.00000,-438.08799 274.00000,-434.50000 C 274.00000,-432.12360 275.34485,-430.13368 277.25000,-429.00000 L 283.75000,-429.00000 C 285.65515,-430.13368 287.00000,-432.12360 287.00000,-434.50000 C 287.00000,-438.08800 284.08800,-440.99999 280.50000,-441.00000 z "
+ id="path6815" />
+ </g>
+ <path
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,9.830296,-35.68884)"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ sodipodi:ry="3.3125000"
+ sodipodi:rx="3.3125000"
+ sodipodi:cy="-437.59375"
+ sodipodi:cx="288.37500"
+ id="path6817"
+ style="opacity:1.0000000;fill:url(#linearGradient6837);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path6819"
+ d="M 292.95640,-437.33396 C 292.95487,-434.64940 289.68714,-433.62001 289.68714,-433.62001 C 289.68714,-433.62001 292.03588,-435.24596 292.02399,-437.32502 C 292.02399,-437.32502 292.95640,-437.33396 292.95640,-437.33396 z "
+ style="fill:#888a85;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <g
+ transform="matrix(1.142857,0.000000,0.000000,1.142857,-28.57139,67.00008)"
+ id="g6821">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#c4c5c2;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6823"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:url(#linearGradient6839);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path6825"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-31.19818,24.86331)" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-sunny.svg b/demos/embedded/weatherinfo/icons/weather-sunny.svg
new file mode 100644
index 0000000..0360ac7
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-sunny.svg
@@ -0,0 +1,1330 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/garrett/Source/tango-icon-theme/scalable/status"
+ sodipodi:docname="weather-sunny.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective37214" />
+ <linearGradient
+ id="linearGradient4083">
+ <stop
+ id="stop4085"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0.75"
+ id="stop4089" />
+ <stop
+ id="stop4087"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4032">
+ <stop
+ id="stop4034"
+ offset="0"
+ style="stop-color:#fff7c2;stop-opacity:0.63829786" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0.18348624;"
+ offset="0.59394139"
+ id="stop4036" />
+ <stop
+ id="stop4038"
+ offset="0.83850551"
+ style="stop-color:#fcaf3e;stop-opacity:0.50458717;" />
+ <stop
+ id="stop4040"
+ offset="1"
+ style="stop-color:#fcaf3e;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4026">
+ <stop
+ id="stop4028"
+ offset="0"
+ style="stop-color:#fff9c6;stop-opacity:1" />
+ <stop
+ style="stop-color:#fff28c;stop-opacity:1;"
+ offset="0.54166669"
+ id="stop4042" />
+ <stop
+ id="stop4030"
+ offset="1"
+ style="stop-color:#ffea85;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2298"
+ id="linearGradient7748"
+ gradientUnits="userSpaceOnUse"
+ x1="-27.006643"
+ y1="-37.550461"
+ x2="-34.700153"
+ y2="-4.4493785" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient7746"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient7744"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4829">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4831" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4833" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3478">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3480" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3482" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2298">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2300" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2302" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:0;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2527">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="0"
+ id="stop2529" />
+ <stop
+ id="stop4022"
+ offset="0.66644967"
+ style="stop-color:#fcaf3e;stop-opacity:0.17431192;" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0.55963302;"
+ offset="0.86458337"
+ id="stop4024" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="1"
+ id="stop2531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2500">
+ <stop
+ style="stop-color:#fce94f;stop-opacity:1;"
+ offset="0"
+ id="stop2502" />
+ <stop
+ style="stop-color:#fce94f;stop-opacity:0;"
+ offset="1"
+ id="stop2504" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2392">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2394" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2396" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2254">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2256" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2258" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2263"
+ gradientUnits="userSpaceOnUse"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581"
+ gradientTransform="translate(-1.608757,3.097272)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2271"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2283"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2287"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2291"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2295"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2299"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2303"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.707748,-5.784024)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(16.14002,24.66420)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.932144,25.87240)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.356636,23.86870)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(11.19027,26.52035)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2358"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(10.30638,19.27251)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.207586,21.30544)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2398"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.608757,3.097272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2442"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2446"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2451"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2469"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2475"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2478"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2483"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.842481,-3.998086)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2506"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2509"
+ gradientUnits="userSpaceOnUse"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2513"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ x1="38.857941"
+ y1="-18.407482"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2517"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient2533"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(17.33814,3.415985)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2541"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2555"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.499805,1.708617)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.726830,2.481141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="linearGradient3353"
+ x1="23.303862"
+ y1="29.115711"
+ x2="29.750000"
+ y2="46.092930"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3386"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3398"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.561802,-4.303373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1514"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(88.49344,-9.697877)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1516"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1518"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient1520"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1522"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1524"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1526"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1528"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1530"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1532"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1534"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1536"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient1538"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(57.97693,-10.56876)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient1557"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4829"
+ id="radialGradient4835"
+ cx="-35.001785"
+ cy="-1.1439217"
+ fx="-35.001785"
+ fy="-1.1439217"
+ r="17.500893"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.565657,-5.564992e-15,-0.496855)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2298"
+ id="linearGradient1427"
+ gradientUnits="userSpaceOnUse"
+ x1="-27.006643"
+ y1="-37.550461"
+ x2="-34.700153"
+ y2="-4.4493785" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient1431"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient14128"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient14130"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2298"
+ id="linearGradient14132"
+ gradientUnits="userSpaceOnUse"
+ x1="-27.006643"
+ y1="-37.550461"
+ x2="-34.700153"
+ y2="-4.4493785" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient3151"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2298"
+ id="linearGradient3153"
+ gradientUnits="userSpaceOnUse"
+ x1="-27.006643"
+ y1="-37.550461"
+ x2="-34.700153"
+ y2="-4.4493785" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient3155"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient3161"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4026"
+ id="linearGradient3168"
+ gradientUnits="userSpaceOnUse"
+ x1="-28.968945"
+ y1="-25.326815"
+ x2="-37.19698"
+ y2="-9.5590506" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4032"
+ id="radialGradient4020"
+ cx="-33.519073"
+ cy="-22.113297"
+ fx="-33.519073"
+ fy="-22.113297"
+ r="9.5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.487739,1.292402,-1.10267,0.497242,-41.77393,32.41492)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3478"
+ id="linearGradient4057"
+ gradientUnits="userSpaceOnUse"
+ x1="11.149398"
+ y1="-43.997444"
+ x2="4.9625983"
+ y2="-8.3080902" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4083"
+ id="radialGradient4081"
+ cx="23.99999"
+ cy="23.381506"
+ fx="23.99999"
+ fy="23.381506"
+ r="19.141981"
+ gradientTransform="matrix(1.006701,2.235326e-16,-2.23715e-16,1.007522,-0.160816,0.426981)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="10.54135"
+ inkscape:cx="23.386176"
+ inkscape:cy="24.950603"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1013"
+ inkscape:window-height="965"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-clear</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan Collier (pseudo)</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>applet</rdf:li>
+ <rdf:li>notification</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Garrett LeSage</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3936">
+ <g
+ style="opacity:0.7"
+ id="g4091">
+ <path
+ style="fill:#fce94f;fill-opacity:1;stroke:#fcaf3e;stroke-width:0.73732895;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24 2.5 L 21.625 9.1875 C 22.399034 9.0641318 23.191406 9 24 9 C 24.808594 9 25.600966 9.0641317 26.375 9.1875 L 24 2.5 z M 8.8125 8.78125 L 11.84375 15.21875 C 12.779034 13.928569 13.928569 12.779034 15.21875 11.84375 L 8.8125 8.78125 z M 39.21875 8.78125 L 32.78125 11.84375 C 34.071431 12.779034 35.220966 13.928569 36.15625 15.21875 L 39.21875 8.78125 z M 9.1875 21.59375 L 2.5 23.96875 L 9.1875 26.34375 C 9.0673373 25.57952 9 24.797813 9 24 C 9 23.180625 9.0608858 22.377571 9.1875 21.59375 z M 38.8125 21.625 C 38.935868 22.399034 39 23.191406 39 24 C 39 24.808594 38.935868 25.600966 38.8125 26.375 L 45.5 24 L 38.8125 21.625 z M 11.84375 32.78125 L 8.8125 39.1875 L 15.21875 36.15625 C 13.928569 35.220966 12.779034 34.071431 11.84375 32.78125 z M 36.15625 32.78125 C 35.229789 34.05926 34.087617 35.194799 32.8125 36.125 L 39.21875 39.1875 L 36.15625 32.78125 z M 21.625 38.8125 L 24 45.5 L 26.375 38.8125 C 25.600966 38.935868 24.808594 39 24 39 C 23.191406 39 22.399034 38.935868 21.625 38.8125 z "
+ id="path7492" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#radialGradient4081);stroke-width:0.84646249;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24 5.25 L 22.65625 9.0625 C 23.098888 9.0231486 23.547187 9 24 9 C 24.452813 9 24.901112 9.0231486 25.34375 9.0625 L 24 5.25 z M 10.78125 10.75 L 12.5 14.375 C 13.071538 13.694089 13.724004 13.038745 14.40625 12.46875 L 10.78125 10.75 z M 37.25 10.75 L 33.625 12.46875 C 34.304675 13.038189 34.961811 13.695325 35.53125 14.375 L 37.25 10.75 z M 9.0625 22.625 L 5.28125 23.96875 L 9.0625 25.3125 C 9.024981 24.880146 9 24.442031 9 24 C 9 23.536406 9.0212735 23.077908 9.0625 22.625 z M 38.9375 22.65625 C 38.976851 23.098888 39 23.547187 39 24 C 39 24.452813 38.976851 24.901112 38.9375 25.34375 L 42.71875 24 L 38.9375 22.65625 z M 35.53125 33.59375 C 34.958293 34.27954 34.309985 34.957363 33.625 35.53125 L 37.25 37.25 L 35.53125 33.59375 z M 12.5 33.625 L 10.78125 37.21875 L 14.375 35.5 C 13.702932 34.935884 13.064116 34.297068 12.5 33.625 z M 22.65625 38.9375 L 24 42.71875 L 25.34375 38.9375 C 24.901112 38.976851 24.452813 39 24 39 C 23.547187 39 23.098888 38.976851 22.65625 38.9375 z "
+ id="path7494" />
+ </g>
+ <g
+ id="g4046">
+ <g
+ id="g3931">
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(0.778062,-1.061285,1.061287,0.778062,67.47952,3.641324)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7498"
+ style="fill:#ffee54;fill-opacity:1;stroke:#fcaf3e;stroke-width:0.75991178;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(1.244257,-0.167707,0.216642,1.251844,67.61648,40.527)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7500"
+ style="fill:url(#radialGradient4020);fill-opacity:1;stroke:none;stroke-width:1.01737845;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(0.715791,-0.976349,0.97635,0.715792,64.00044,5.269544)"
+ d="M -22.5 -17.5 A 9.5 9.5 0 1 1 -41.5,-17.5 A 9.5 9.5 0 1 1 -22.5 -17.5 z"
+ sodipodi:ry="9.5"
+ sodipodi:rx="9.5"
+ sodipodi:cy="-17.5"
+ sodipodi:cx="-32"
+ id="path7502"
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient3168);stroke-width:0.82601947;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/icons/weather-thundershower.svg b/demos/embedded/weatherinfo/icons/weather-thundershower.svg
new file mode 100644
index 0000000..406abfa
--- /dev/null
+++ b/demos/embedded/weatherinfo/icons/weather-thundershower.svg
@@ -0,0 +1,4587 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg1306"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/rcollier/Work/Novell/Tango/weather"
+ sodipodi:docname="weather-thundershower.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs1308">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12223"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12213"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12211"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12253"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12251"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12249"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12247"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12201"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12199"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5358">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5360" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5362" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient12237"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5346">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5348" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5350" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient12235"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective22454" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8397">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8400" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8397"
+ id="linearGradient13503"
+ gradientUnits="userSpaceOnUse"
+ x1="238.00478"
+ y1="-388.47476"
+ x2="245.65462"
+ y2="-382.64539" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8315">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8317" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8319" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8315"
+ id="linearGradient13501"
+ gradientUnits="userSpaceOnUse"
+ x1="230.87598"
+ y1="-390.43951"
+ x2="235.25652"
+ y2="-386.95901" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8381">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8383" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8385" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8381"
+ id="linearGradient13499"
+ gradientUnits="userSpaceOnUse"
+ x1="246.74042"
+ y1="-391.31381"
+ x2="252.69785"
+ y2="-385.35165" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8331">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8333" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8335" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8331"
+ id="linearGradient13497"
+ gradientUnits="userSpaceOnUse"
+ x1="240.07379"
+ y1="-393.40720"
+ x2="245.82706"
+ y2="-388.55029" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8302">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8304" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8306" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8302"
+ id="linearGradient13495"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69.00000,155.0000)"
+ x1="228.50261"
+ y1="-392.30591"
+ x2="266.36395"
+ y2="-379.26862" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13143"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient13141"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient13139"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-35.00007,207.0001)"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13137"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient13135"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient13133"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient13131"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-34.00007,207.0001)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8874"
+ id="linearGradient11195"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.15871,7.082841)"
+ x1="-190.47688"
+ y1="-332.51181"
+ x2="-196.19046"
+ y2="-328.53433" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8904"
+ id="linearGradient11193"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.80516,2.840199)"
+ x1="-191.28896"
+ y1="-328.07861"
+ x2="-192.41396"
+ y2="-315.32861" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8874">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop8876" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop8878" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8874"
+ id="linearGradient11191"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.15871,7.082841)"
+ x1="-190.47688"
+ y1="-332.51181"
+ x2="-196.19046"
+ y2="-328.53433" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8904">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop8906" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="1"
+ id="stop8908" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8904"
+ id="linearGradient11189"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.80516,2.840199)"
+ x1="-191.28896"
+ y1="-328.07861"
+ x2="-192.41396"
+ y2="-315.32861" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5123"
+ id="radialGradient13211"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.930946,6.185702e-16,-2.842711e-16,0.448244,245.3644,184.9256)"
+ cx="-229.75000"
+ cy="-343.95554"
+ fx="-229.75000"
+ fy="-343.95554"
+ r="14.501380" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13157"
+ gradientUnits="userSpaceOnUse"
+ x1="284.80219"
+ y1="-441.23294"
+ x2="288.89954"
+ y2="-436.83109" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6549">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6551" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6553" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6549"
+ id="linearGradient13155"
+ gradientUnits="userSpaceOnUse"
+ x1="286.66589"
+ y1="-439.48358"
+ x2="289.76562"
+ y2="-436.70703" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6527">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6530" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6532" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6527"
+ id="linearGradient13153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-35.00007,207.0001)"
+ x1="275.94193"
+ y1="-437.10501"
+ x2="279.97546"
+ y2="-431.91833" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6538">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6540" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6542" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6538"
+ id="linearGradient13151"
+ gradientUnits="userSpaceOnUse"
+ x1="285.94086"
+ y1="-439.93900"
+ x2="289.39124"
+ y2="-436.44290" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6513">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6515" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6513"
+ id="linearGradient13149"
+ gradientUnits="userSpaceOnUse"
+ x1="286.51172"
+ y1="-441.29074"
+ x2="289.85379"
+ y2="-436.14453" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6497">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6499" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6501" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6497"
+ id="linearGradient13147"
+ gradientUnits="userSpaceOnUse"
+ x1="287.51730"
+ y1="-439.75281"
+ x2="289.67633"
+ y2="-436.32199" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6470">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6472" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6474" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6470"
+ id="linearGradient13145"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-34.00007,207.0001)"
+ x1="271.02170"
+ y1="-441.05182"
+ x2="285.02859"
+ y2="-431.96991" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5123">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5125" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5127" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5123"
+ id="radialGradient13068"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.930946,6.185702e-16,-2.842711e-16,0.448244,229.9269,180.9261)"
+ cx="-229.75000"
+ cy="-343.95554"
+ fx="-229.75000"
+ fy="-343.95554"
+ r="14.501380" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6840">
+ <stop
+ style="stop-color:#ad7fa8;stop-opacity:1;"
+ offset="0"
+ id="stop6842" />
+ <stop
+ style="stop-color:#ad7fa8;stop-opacity:0;"
+ offset="1"
+ id="stop6844" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6828">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6830" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6832" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6537">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6539" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6541" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2298">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2300" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2302" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:0;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2527">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop2529" />
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:0;"
+ offset="1"
+ id="stop2531" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2500">
+ <stop
+ style="stop-color:#fce94f;stop-opacity:1;"
+ offset="0"
+ id="stop2502" />
+ <stop
+ style="stop-color:#fce94f;stop-opacity:0;"
+ offset="1"
+ id="stop2504" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2392">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop2394" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="1"
+ id="stop2396" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2254">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2256" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2258" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2263"
+ gradientUnits="userSpaceOnUse"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581"
+ gradientTransform="translate(-1.608757,3.097272)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2271"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2283"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2287"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2291"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2295"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2299"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2303"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.707748,-5.784024)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(16.14002,24.66420)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.932144,25.87240)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.356636,23.86870)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(11.19027,26.52035)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2358"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(10.30638,19.27251)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.207586,21.30544)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2398"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2426"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(14.46340,2.014073)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.497184,-2.330824)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.608757,3.097272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.555020,0.968578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(9.263651,3.495228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2440"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2442"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2444"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2446"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2392"
+ id="linearGradient2451"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ x1="6.6651416"
+ y1="13.802798"
+ x2="41.403877"
+ y2="13.802798" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2469"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2472"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2475"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2478"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2483"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.842481,-3.998086)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2506"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2509"
+ gradientUnits="userSpaceOnUse"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000"
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2513"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ x1="38.857941"
+ y1="-18.407482"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2500"
+ id="linearGradient2517"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ x1="37.000000"
+ y1="-21.750000"
+ x2="53.750000"
+ y2="9.0000000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient2533"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(17.33814,3.415985)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2541"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2555"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.499805,1.708617)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient2563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.726830,2.481141)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3347"
+ id="linearGradient3353"
+ x1="23.303862"
+ y1="29.115711"
+ x2="29.750000"
+ y2="46.092930"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.40064,1.353485)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.641243,8.347272)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.805020,6.218578)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.51365,8.745228)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3386"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3392"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3398"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient3405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.561802,-4.303373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2916"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2914"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2912"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2910"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2908"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2906"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2904"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2902"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2900"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2898"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2896"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2894"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2892"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2890"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2888"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2886"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2884"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2882"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2880"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2878"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2876"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2874"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2872"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2870"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2868"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2866"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2864"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2862"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2860"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2858"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2856"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient2854"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2852"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2850"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2848"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2846"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient2844"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2842"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2840"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2838"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient2836"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2834"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2832"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2830"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2828"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2826"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2824"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2822"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2820"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2818"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2816"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2814"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2812"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2810"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2808"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2806"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2804"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2802"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2800"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2798"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2796"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2794"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient2792"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2790"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2788"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2786"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2784"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2782"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2780"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2778"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2776"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2774"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2772"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2770"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2768"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2766"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2764"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2762"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2760"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2758"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2756"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2754"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2752"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2750"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2748"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2746"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2744"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-4.4493785"
+ x2="-34.700153"
+ y1="-37.550461"
+ x1="-27.006643"
+ id="linearGradient2304"
+ xlink:href="#linearGradient2298"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1557"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(57.97693,-10.56876)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1538"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,123.1162,-5.446357)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1536"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1534"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1532"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1530"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1528"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1526"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1524"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1522"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1520"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,79.36909,-3.193747)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1518"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,56.25514,-12.39388)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1516"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(88.49344,-9.697877)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1514"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.561802,-4.303373)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5957"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.197595,2.690414)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5955"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-2.033818,0.561720)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5953"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.674812,3.088370)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5951"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5949"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5947"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5945"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5943"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5941"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5939"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5937"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5935"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5933"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5931"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5929"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5927"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.092930"
+ x2="29.750000"
+ y1="29.115711"
+ x1="23.303862"
+ id="linearGradient5925"
+ xlink:href="#linearGradient3347"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.726830,2.481141)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5923"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-7.499805,1.708617)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5921"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(13.40064,1.353485)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5919"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(17.33814,3.415985)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5917"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="-24.884460"
+ x2="-35.652866"
+ y1="-1.2491118"
+ x1="-25.137094"
+ id="linearGradient5915"
+ xlink:href="#linearGradient2527"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientTransform="matrix(0.414169,0.000000,0.000000,0.778853,-1.910724,36.87850)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5913"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-18.407482"
+ x1="38.857941"
+ gradientTransform="matrix(0.605509,0.000000,0.000000,0.710542,-0.224971,42.19500)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5911"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.889091,0.000000,0.000000,0.617886,-4.771368,39.81402)"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5909"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="9.0000000"
+ x2="53.750000"
+ y1="-21.750000"
+ x1="37.000000"
+ id="linearGradient5907"
+ xlink:href="#linearGradient2500"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(0.842481,-3.998086)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5905"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.641243,8.347272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5903"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(6.805020,6.218578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5901"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(12.51365,8.745228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5899"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,3.052538,12.86287)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5897"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,18.12610,13.81998)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5895"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-2.437359,7.060269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5893"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,9.633860,11.75043)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5891"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,4.378541,10.65407)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5889"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5887"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5885"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5883"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5881"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5879"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5877"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5875"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5873"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5871"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-1.608757,3.097272)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5869"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5867"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5865"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="matrix(0.992367,0.000000,0.000000,0.990713,1.128541,5.404075)"
+ gradientUnits="userSpaceOnUse"
+ y2="13.802798"
+ x2="41.403877"
+ y1="13.802798"
+ x1="6.6651416"
+ id="linearGradient5863"
+ xlink:href="#linearGradient2392"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.12415,32.08882)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5861"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(4.207586,21.30544)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5859"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,8.185476,29.52556)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5857"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-4.010744,24.96040)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5855"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,17.05272,31.47010)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5853"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,16.67145,27.22746)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5851"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,0.229156,30.76299)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5849"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(10.30638,19.27251)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5847"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(11.19027,26.52035)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5845"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(5.356636,23.86870)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5843"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(-0.932144,25.87240)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5841"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(16.14002,24.66420)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5839"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,53.94753,8.563694)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5837"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(1.707748,-5.784024)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5835"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,6.383860,6.500432)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5833"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-5.687359,1.810269)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5831"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,14.87610,8.569976)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5829"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,14.61983,4.452335)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5827"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-0.197462,7.612867)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5825"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(14.46340,2.014073)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5823"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(8.497184,-2.330824)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5821"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(9.263651,3.495228)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5819"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientTransform="translate(3.555020,0.968578)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5817"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-1.608757,3.097272)"
+ y2="16.268581"
+ x2="16.851845"
+ y1="9.2859020"
+ x1="14.260854"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5815"
+ xlink:href="#linearGradient2254"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6098"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6101"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.13675,17.05613)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6118"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,12.38965,19.30874)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-10.72430,10.10861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6124"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(21.51400,12.80461)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6179"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-7.197595,2.690414)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6181"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-2.033818,0.561720)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6183"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(3.674812,3.088370)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6185"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-5.786300,7.206012)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6187"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,9.287262,8.163122)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6189"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-11.27620,1.403411)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6191"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,0.795022,6.093572)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2527"
+ id="linearGradient6193"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.137094"
+ y1="-1.2491118"
+ x2="-35.652866"
+ y2="-24.884460" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6199"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6202"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6205"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.751222,0.000000,0.000000,1.000000,-4.372193,11.95105)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6208"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6211"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6214"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6242"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6244"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6248"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6252"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6254"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6257"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.297112,4.275205)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6260"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,10.91453,3.180085)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6263"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-1.156692,-1.510075)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6266"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,19.40677,5.249635)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6269"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.79432,0.174884)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.085690,-2.351766)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.921913,-0.223072)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(21.51400,12.80461)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6313"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-10.72430,10.10861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6315"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.284317,0.000000,0.000000,1.000000,12.38965,19.30874)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6317"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-1.156692,-1.510075)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6319"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.976307,0.000000,0.000000,1.000000,56.13675,17.05613)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6321"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6323"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6325"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6327"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6329"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6331"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6333"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6335"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.921913,-0.223072)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6337"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8.085690,-2.351766)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13.79432,0.174884)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6341"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,19.40677,5.249635)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6343"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,10.91453,3.180085)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6543"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-2.763717e-17,0.972572,16.13182,0.843286)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6547"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-4.388782e-16,0.972572,25.91493,0.633642)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6551"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-4.388782e-16,0.972572,36.25638,0.633643)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6559"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-2.332577e-16,0.972572,16.13182,0.843286)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6561"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-6.444987e-16,0.972572,25.91493,0.633642)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6563"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.526962,0.000000,-6.444987e-16,0.972572,36.25638,0.633643)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6566"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-6.388715e-16,1.006703,39.04124,-0.702889)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="45.115814"
+ y2="44.228455" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6569"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-6.388715e-16,1.006703,27.70322,-0.702890)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6537"
+ id="linearGradient6572"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.577744,0.000000,-1.880005e-16,1.006703,16.97734,-0.485889)"
+ x1="27.320963"
+ y1="44.228481"
+ x2="52.328316"
+ y2="44.228481" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6576"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.132431,0.000000,0.000000,1.016132,10.54485,-4.728138)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6579"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.853605,0.000000,0.000000,1.016132,19.23518,-2.625202)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6582"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,13.49182,-7.781819)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6585"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,7.650036,-10.34923)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6588"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,2.365814,-8.186195)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6599"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.999079,0.000000,0.000000,1.016132,56.82188,9.371753)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6603"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.496116,0.000000,0.000000,1.282841,-1.807925,-9.493960)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6606"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.314274,0.000000,0.000000,1.016132,12.05438,11.66070)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6609"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.496116,0.000000,0.000000,1.282841,-11.59870,2.312158)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6612"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,21.39156,5.051653)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6618"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,16.09471,2.948843)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6622"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.023325,0.000000,0.000000,1.016132,11.32174,9.047633)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6624"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-5.783488,7.435453)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6626"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-0.619711,5.306759)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6628"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(5.088919,7.833409)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6630"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.834148,0.000000,0.000000,1.000000,10.70137,12.90816)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6632"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.462015,0.000000,0.000000,1.262475,-9.862093,6.148450)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6634"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.106619,0.000000,0.000000,1.000000,2.209129,10.83861)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2254"
+ id="linearGradient6636"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-9.002513,11.93373)"
+ x1="14.260854"
+ y1="9.2859020"
+ x2="16.851845"
+ y2="16.268581" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6828"
+ id="radialGradient6834"
+ cx="15.147860"
+ cy="23.822156"
+ fx="15.147860"
+ fy="23.822156"
+ r="12.852140"
+ gradientTransform="matrix(0.654874,0.000000,0.000000,0.398574,2.663540,12.14676)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6840"
+ id="radialGradient6846"
+ cx="32.583473"
+ cy="25.240442"
+ fx="32.583473"
+ fy="25.240442"
+ r="8.4165270"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.503823,-15.00000,6.042836)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6828"
+ id="radialGradient6852"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.654874,0.000000,0.000000,0.398574,44.33646,16.14676)"
+ cx="15.147860"
+ cy="23.822156"
+ fx="15.147860"
+ fy="23.822156"
+ r="12.852140" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6840"
+ id="radialGradient6854"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.000000,0.000000,0.000000,0.503823,62.00000,10.04284)"
+ cx="32.583473"
+ cy="25.240442"
+ fx="32.583473"
+ fy="25.240442"
+ r="8.4165270" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient23739"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient23741"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient23743"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient23745"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5346"
+ id="radialGradient23747"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(7.065158e-2,4.154803e-2,-6.201499e-2,0.109408,207.4757,-189.8182)"
+ cx="21.920311"
+ cy="-382.96454"
+ fx="21.920311"
+ fy="-382.96454"
+ r="21.743534" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5358"
+ id="linearGradient23749"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.358613e-2,0.102849,-9.281434e-2,-5.937964e-2,198.9051,-255.6893)"
+ x1="6.8942904"
+ y1="-359.82382"
+ x2="27.400387"
+ y2="-381.30222" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="24"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="982"
+ inkscape:window-height="965"
+ inkscape:window-x="1280"
+ inkscape:window-y="28"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata1311">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>weather-storm</dc:title>
+ <dc:date>January 2006</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Ryan Collier</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>http://www.tango-project.org</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>http://www.pseudocode.org</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>weather</rdf:li>
+ <rdf:li>applet</rdf:li>
+ <rdf:li>notify</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g15505">
+ <g
+ transform="translate(-287.0204,244.9995)"
+ id="g12825">
+ <path
+ style="opacity:1.0000000;fill:#555753;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 311.50000,-242.99998 C 308.72758,-242.99998 306.39177,-241.42627 305.09375,-239.18748 C 304.14939,-239.66252 303.12856,-239.99998 302.00000,-239.99998 C 298.13600,-239.99998 295.00000,-236.86398 295.00000,-232.99998 C 295.00000,-229.13598 298.13600,-225.99998 302.00000,-225.99998 C 304.41967,-225.99998 306.43009,-227.31930 307.68750,-229.18748 C 308.82170,-228.49786 310.07648,-227.99998 311.50000,-227.99998 C 312.41312,-227.99998 313.25295,-228.23200 314.06250,-228.53123 C 314.57244,-227.66350 315.24162,-226.95151 316.06250,-226.37498 C 316.05526,-226.24460 316.00000,-226.13216 316.00000,-225.99998 C 316.00000,-222.13598 319.13599,-218.99998 323.00000,-218.99998 C 326.86400,-218.99998 330.00000,-222.13598 330.00000,-225.99998 C 330.00000,-228.36967 328.74102,-230.35832 326.93750,-231.62498 C 326.94474,-231.75536 327.00000,-231.86780 327.00000,-231.99998 C 327.00000,-235.86398 323.86401,-238.99998 320.00000,-238.99998 C 319.37730,-238.99998 318.82481,-238.77779 318.25000,-238.62498 C 317.05547,-241.18382 314.50866,-242.99998 311.50000,-242.99998 z "
+ id="path12827" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient13495);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 311.50000,-241.99998 C 308.71952,-241.99998 306.36549,-240.23813 305.43750,-237.78123 C 304.45208,-238.49067 303.30607,-238.99998 302.00000,-238.99998 C 298.68800,-238.99998 296.00000,-236.31198 296.00000,-232.99998 C 296.00000,-229.68798 298.68800,-226.99998 302.00000,-226.99998 C 304.42775,-226.99998 306.49324,-228.45556 307.43750,-230.53123 C 308.55826,-229.61367 309.93964,-228.99998 311.50000,-228.99998 C 312.57454,-228.99998 313.54428,-229.31894 314.43750,-229.78123 C 314.83590,-228.78147 315.53864,-227.99491 316.37500,-227.34373 C 316.19499,-226.74811 316.00000,-226.15408 316.00000,-225.49998 C 316.00000,-221.91198 318.91200,-218.99998 322.50000,-218.99998 C 326.08800,-218.99998 329.00000,-221.91198 329.00000,-225.49998 C 329.00000,-227.86077 327.66567,-229.83017 325.78125,-230.96873 C 325.84384,-231.31596 326.00000,-231.63481 326.00000,-231.99998 C 326.00000,-235.31198 323.31200,-237.99998 320.00000,-237.99998 C 319.14702,-237.99998 318.32870,-237.82130 317.59375,-237.49998 C 316.73998,-240.09386 314.37851,-241.99997 311.50000,-241.99998 z "
+ id="path12829" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12831"
+ sodipodi:cx="241.80843"
+ sodipodi:cy="-383.66660"
+ sodipodi:rx="6.7396116"
+ sodipodi:ry="6.7396116"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ transform="matrix(0.964447,0.000000,0.000000,0.964447,89.28852,144.5262)" />
+ <g
+ id="g12833">
+ <path
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,96.18078,108.1091)"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ sodipodi:ry="6.2313786"
+ sodipodi:rx="6.2313786"
+ sodipodi:cy="-389.30136"
+ sodipodi:cx="243.95184"
+ id="path12835"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.882630,0.000000,0.000000,0.882630,96.18078,108.1091)"
+ d="M 250.18322 -389.30136 A 6.2313786 6.2313786 0 1 1 237.72046,-389.30136 A 6.2313786 6.2313786 0 1 1 250.18322 -389.30136 z"
+ sodipodi:ry="6.2313786"
+ sodipodi:rx="6.2313786"
+ sodipodi:cy="-389.30136"
+ sodipodi:cx="243.95184"
+ id="path12837"
+ style="opacity:0.49444440;fill:url(#linearGradient13497);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g12839">
+ <path
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,90.45407,120.2336)"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ sodipodi:ry="6.0325046"
+ sodipodi:rx="6.0325046"
+ sodipodi:cy="-385.78790"
+ sodipodi:cx="251.22179"
+ id="path12841"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.911728,0.000000,0.000000,0.911728,90.45407,120.2336)"
+ d="M 257.25429 -385.78790 A 6.0325046 6.0325046 0 1 1 245.18928,-385.78790 A 6.0325046 6.0325046 0 1 1 257.25429 -385.78790 z"
+ sodipodi:ry="6.0325046"
+ sodipodi:rx="6.0325046"
+ sodipodi:cy="-385.78790"
+ sodipodi:cx="251.22179"
+ id="path12843"
+ style="opacity:0.49444440;fill:url(#linearGradient13499);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g12845">
+ <path
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,35.23229,210.2770)"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ sodipodi:ry="4.3752232"
+ sodipodi:rx="4.3752232"
+ sodipodi:cy="-387.88715"
+ sodipodi:cx="233.43362"
+ id="path12847"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.142799,0.000000,0.000000,1.142799,35.23229,210.2770)"
+ d="M 237.80885 -387.88715 A 4.3752232 4.3752232 0 1 1 229.05840,-387.88715 A 4.3752232 4.3752232 0 1 1 237.80885 -387.88715 z"
+ sodipodi:ry="4.3752232"
+ sodipodi:rx="4.3752232"
+ sodipodi:cy="-387.88715"
+ sodipodi:cx="233.43362"
+ id="path12849"
+ style="opacity:0.49444440;fill:url(#linearGradient13501);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g12851">
+ <path
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,59.84906,169.4899)"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ sodipodi:ry="6.7396116"
+ sodipodi:rx="6.7396116"
+ sodipodi:cy="-383.66660"
+ sodipodi:cx="241.80843"
+ id="path12853"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.038636,0.000000,0.000000,1.038636,59.84907,169.4899)"
+ d="M 248.54804 -383.66660 A 6.7396116 6.7396116 0 1 1 235.06881,-383.66660 A 6.7396116 6.7396116 0 1 1 248.54804 -383.66660 z"
+ sodipodi:ry="6.7396116"
+ sodipodi:rx="6.7396116"
+ sodipodi:cy="-383.66660"
+ sodipodi:cx="241.80843"
+ id="path12855"
+ style="opacity:0.49444440;fill:url(#linearGradient13503);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <g
+ transform="translate(208.8564,357.8851)"
+ id="g11177">
+ <path
+ style="fill:#edd400;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient11189);stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M -173.24571,-327.59122 L -176.37021,-323.31202 L -172.59078,-323.31202 C -172.59078,-323.31202 -175.29396,-318.78622 -180.16632,-310.38562 C -178.07014,-318.33294 -177.21353,-321.35581 -177.21353,-321.35581 L -182.37682,-321.35581 L -178.33401,-327.59122 L -173.24571,-327.59122 z "
+ id="path11179"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient11191);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M -173.75946,-327.84461 L -177.50268,-322.68152 L -173.54648,-322.85830 C -173.54648,-322.85830 -173.68639,-322.39837 -178.55875,-313.99777 C -176.46257,-321.94509 -176.48985,-321.96275 -176.48985,-321.96275 L -181.38797,-321.87436 L -177.69871,-327.57944 L -173.75946,-327.84461 z "
+ id="path11181"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+ <g
+ transform="translate(-215.0060,252.9994)"
+ id="g12857">
+ <path
+ style="fill:#888a85;fill-opacity:1.0000000;stroke:#555753;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 246.49993,-238.49993 C 244.22910,-238.49993 242.39002,-236.94965 241.78118,-234.87493 C 241.08795,-235.23876 240.33667,-235.49993 239.49993,-235.49993 C 236.73993,-235.49993 234.49992,-233.25994 234.49993,-230.49993 C 234.49993,-229.92100 234.66245,-229.39223 234.84368,-228.87493 C 233.47021,-228.10419 232.49993,-226.68593 232.49993,-224.99993 C 232.49993,-222.51593 234.51593,-220.49992 236.99993,-220.49993 C 237.17706,-220.49993 255.82280,-220.49993 255.99993,-220.49993 C 258.48392,-220.49993 260.49993,-222.51593 260.49993,-224.99993 C 260.49993,-226.68593 259.52965,-228.10419 258.15618,-228.87493 C 258.33742,-229.39222 258.49993,-229.92101 258.49993,-230.49993 C 258.49993,-233.25993 256.25993,-235.49992 253.49993,-235.49993 C 252.66319,-235.49993 251.91191,-235.23876 251.21868,-234.87493 C 250.60984,-236.94965 248.77076,-238.49993 246.49993,-238.49993 z "
+ id="path12859"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient13131);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 246.49993,-237.99993 C 244.31021,-237.99993 242.77633,-236.66416 242.10438,-234.15641 C 241.43592,-234.50003 240.55679,-234.98976 239.74993,-234.98976 C 237.03342,-234.98976 234.99479,-233.05094 234.99480,-230.44422 C 234.99480,-229.89745 235.26201,-229.11078 235.43676,-228.62221 C 234.11233,-227.89426 232.99993,-226.73171 232.99993,-225.24966 C 232.99993,-222.90361 234.54610,-220.99957 237.33921,-220.99957 C 237.51002,-220.99957 255.48985,-220.99957 255.66065,-220.99957 C 258.43166,-220.99957 259.99993,-222.90361 259.99993,-225.24966 C 259.99993,-226.84203 258.88753,-227.91635 257.56310,-228.64430 C 257.73786,-229.13286 258.02717,-229.89746 258.02717,-230.44422 C 258.02717,-233.05093 255.91136,-235.01185 253.24994,-235.01186 C 252.44307,-235.01186 251.60813,-234.52212 250.93967,-234.17850 C 250.29082,-236.60004 248.68966,-237.99993 246.49993,-237.99993 z "
+ id="path12861"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12863"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13133);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12865"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)" />
+ <rect
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect12867"
+ width="20.000000"
+ height="9.0000000"
+ x="236.99994"
+ y="-230.99992" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12869"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16987,171.3114)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12871"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19818,231.8633)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13135);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12873"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19825,231.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12875"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13137);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12877"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)" />
+ <path
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 245.46868,-233.96868 C 241.88930,-233.96868 238.99993,-231.04805 238.99993,-227.46868 C 238.99993,-225.09800 240.34936,-223.13089 242.24993,-221.99993 L 248.71868,-221.99993 C 250.61925,-223.13089 251.96868,-225.12924 251.96868,-227.49993 C 251.96868,-231.07931 249.04805,-233.96868 245.46868,-233.96868 z "
+ id="path12879" />
+ <path
+ style="opacity:0.47777775;fill:url(#linearGradient13139);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 245.49993,-233.99993 C 241.91193,-233.99993 238.99993,-231.08792 238.99993,-227.49993 C 238.99993,-225.12353 240.34478,-223.13361 242.24993,-221.99993 L 248.74993,-221.99993 C 250.65508,-223.13361 251.99993,-225.12353 251.99993,-227.49993 C 251.99993,-231.08793 249.08793,-233.99992 245.49993,-233.99993 z "
+ id="path12881" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13141);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12883"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16977,171.3113)" />
+ <path
+ style="fill:#555753;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 258.95633,-230.33389 C 258.95480,-227.64933 255.68707,-226.61994 255.68707,-226.61994 C 255.68707,-226.61994 258.03581,-228.24589 258.02392,-230.32495 C 258.02392,-230.32495 258.95633,-230.33389 258.95633,-230.33389 z "
+ id="path12885"
+ sodipodi:nodetypes="ccss" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12887"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13143);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12889"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)" />
+ </g>
+ <g
+ transform="translate(192.8564,354.8851)"
+ id="g11183">
+ <path
+ style="fill:#edd400;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient11193);stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M -173.24571,-327.59122 L -176.37021,-323.31202 L -172.59078,-323.31202 C -172.59078,-323.31202 -175.29396,-318.78622 -180.16632,-310.38562 C -178.07014,-318.33294 -177.21353,-321.35581 -177.21353,-321.35581 L -182.37682,-321.35581 L -178.33401,-327.59122 L -173.24571,-327.59122 z "
+ id="path11185"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient11195);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M -173.75946,-327.84461 L -177.50268,-322.68152 L -173.54648,-322.85830 C -173.54648,-322.85830 -173.68639,-322.39837 -178.55875,-313.99777 C -176.46257,-321.94509 -176.48985,-321.96275 -176.48985,-321.96275 L -181.38797,-321.87436 L -177.69871,-327.57944 L -173.75946,-327.84461 z "
+ id="path11187"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccsscsscscsscc"
+ id="path13209"
+ d="M 31.626355,14.999520 C 29.626255,14.999520 27.940775,16.079020 27.095785,17.614460 C 26.500875,17.392550 25.851145,17.261090 25.169835,17.261090 C 22.339625,17.261090 20.052305,19.379260 20.052305,21.978590 C 20.052305,22.432340 20.196835,22.835420 20.327445,23.250720 C 18.945125,24.115990 17.979615,25.504290 17.979615,27.155450 C 17.979615,29.808280 18.631235,32.148800 23.207195,31.961300 C 23.252315,31.959450 40.658675,32.058280 40.907605,31.943270 C 43.992815,32.169220 44.979615,29.497540 44.979615,27.243810 C 44.979615,25.543300 44.142675,24.193960 42.670345,23.366220 C 42.718305,23.107660 42.631785,22.815030 42.631785,22.543970 C 42.631785,19.944650 40.326135,17.826480 37.495915,17.826480 C 37.102425,17.826480 36.763515,17.961300 36.395375,18.038500 C 35.656915,16.270380 33.810365,14.999520 31.626355,14.999520 z "
+ style="opacity:1.0000000;fill:url(#radialGradient13211);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000004;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
+ <g
+ transform="translate(-230.0203,248.9834)"
+ id="g12891">
+ <path
+ style="fill:#888a85;fill-opacity:1.0000000;stroke:#555753;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 246.49993,-238.49993 C 244.22910,-238.49993 242.39002,-236.94965 241.78118,-234.87493 C 241.08795,-235.23876 240.33667,-235.49993 239.49993,-235.49993 C 236.73993,-235.49993 234.49992,-233.25994 234.49993,-230.49993 C 234.49993,-229.92100 234.66245,-229.39223 234.84368,-228.87493 C 233.47021,-228.10419 232.49993,-226.68593 232.49993,-224.99993 C 232.49993,-222.51593 234.51593,-220.49992 236.99993,-220.49993 C 237.17706,-220.49993 255.82280,-220.49993 255.99993,-220.49993 C 258.48392,-220.49993 260.49993,-222.51593 260.49993,-224.99993 C 260.49993,-226.68593 259.52965,-228.10419 258.15618,-228.87493 C 258.33742,-229.39222 258.49993,-229.92101 258.49993,-230.49993 C 258.49993,-233.25993 256.25993,-235.49992 253.49993,-235.49993 C 252.66319,-235.49993 251.91191,-235.23876 251.21868,-234.87493 C 250.60984,-236.94965 248.77076,-238.49993 246.49993,-238.49993 z "
+ id="path12893"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ style="opacity:1.0000000;fill:url(#linearGradient13145);fill-opacity:1.0000000;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 246.49993,-237.99993 C 244.31021,-237.99993 242.77633,-236.66416 242.10438,-234.15641 C 241.43592,-234.50003 240.55679,-234.98976 239.74993,-234.98976 C 237.03342,-234.98976 234.99479,-233.05094 234.99480,-230.44422 C 234.99480,-229.89745 235.26201,-229.11078 235.43676,-228.62221 C 234.11233,-227.89426 232.99993,-226.73171 232.99993,-225.24966 C 232.99993,-222.90361 234.54610,-220.99957 237.33921,-220.99957 C 237.51002,-220.99957 255.48985,-220.99957 255.66065,-220.99957 C 258.43166,-220.99957 259.99993,-222.90361 259.99993,-225.24966 C 259.99993,-226.84203 258.88753,-227.91635 257.56310,-228.64430 C 257.73786,-229.13286 258.02717,-229.89746 258.02717,-230.44422 C 258.02717,-233.05093 255.91136,-235.01185 253.24994,-235.01186 C 252.44307,-235.01186 251.60813,-234.52212 250.93967,-234.17850 C 250.29082,-236.60004 248.68966,-237.99993 246.49993,-237.99993 z "
+ id="path12895"
+ sodipodi:nodetypes="ccsscsssscsscc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12897"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13147);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12899"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-58.19825,228.8634)" />
+ <rect
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="rect12901"
+ width="20.000000"
+ height="9.0000000"
+ x="236.99994"
+ y="-230.99992" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12903"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16987,171.3114)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12905"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19818,231.8633)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13149);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12907"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-51.19825,231.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12909"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13151);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12911"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.056604,0.000000,0.000000,1.056604,-65.19825,231.8634)" />
+ <path
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 245.46868,-233.96868 C 241.88930,-233.96868 238.99993,-231.04805 238.99993,-227.46868 C 238.99993,-225.09800 240.34936,-223.13089 242.24993,-221.99993 L 248.71868,-221.99993 C 250.61925,-223.13089 251.96868,-225.12924 251.96868,-227.49993 C 251.96868,-231.07931 249.04805,-233.96868 245.46868,-233.96868 z "
+ id="path12913" />
+ <path
+ style="opacity:0.47777775;fill:url(#linearGradient13153);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ d="M 245.49993,-233.99993 C 241.91193,-233.99993 238.99993,-231.08792 238.99993,-227.49993 C 238.99993,-225.12353 240.34478,-223.13361 242.24993,-221.99993 L 248.74993,-221.99993 C 250.65508,-223.13361 251.99993,-225.12353 251.99993,-227.49993 C 251.99993,-231.08793 249.08793,-233.99992 245.49993,-233.99993 z "
+ id="path12915" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13155);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12917"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(0.905660,0.000000,0.000000,0.905660,-24.16977,171.3113)" />
+ <path
+ style="fill:#555753;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 258.95633,-230.33389 C 258.95480,-227.64933 255.68707,-226.61994 255.68707,-226.61994 C 255.68707,-226.61994 258.03581,-228.24589 258.02392,-230.32495 C 258.02392,-230.32495 258.95633,-230.33389 258.95633,-230.33389 z "
+ id="path12919"
+ sodipodi:nodetypes="ccss" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1.0000000;fill:#888a85;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12921"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.47777775;fill:url(#linearGradient13157);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ id="path12923"
+ sodipodi:cx="288.37500"
+ sodipodi:cy="-437.59375"
+ sodipodi:rx="3.3125000"
+ sodipodi:ry="3.3125000"
+ d="M 291.68750 -437.59375 A 3.3125000 3.3125000 0 1 1 285.06250,-437.59375 A 3.3125000 3.3125000 0 1 1 291.68750 -437.59375 z"
+ transform="matrix(1.207547,0.000000,0.000000,1.207547,-98.22652,302.4154)" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccsscsscscsscc"
+ id="path11418"
+ d="M 16.188855,11.000000 C 14.188755,11.000000 12.503275,12.079500 11.658285,13.614940 C 11.063375,13.393030 10.413645,13.261570 9.7323346,13.261570 C 6.9021246,13.261570 4.6148046,15.379740 4.6148046,17.979070 C 4.6148046,18.432820 4.7593346,18.835900 4.8899446,19.251200 C 3.5076246,20.116470 2.5421146,21.504770 2.5421146,23.155930 C 2.5421146,25.808760 3.1937346,28.149280 7.7696946,27.961780 C 7.8148146,27.959930 25.221175,28.058760 25.470105,27.943750 C 28.555315,28.169700 29.542115,25.498020 29.542115,23.244290 C 29.542115,21.543780 28.705175,20.194440 27.232845,19.366700 C 27.280805,19.108140 27.194285,18.815510 27.194285,18.544450 C 27.194285,15.945130 24.888635,13.826960 22.058415,13.826960 C 21.664925,13.826960 21.326015,13.961780 20.957875,14.038980 C 20.219415,12.270860 18.372865,11.000000 16.188855,11.000000 z "
+ style="opacity:1.0000000;fill:url(#radialGradient13068);fill-opacity:1.0000000;stroke:none;stroke-width:1.0000004;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
+ <g
+ transform="translate(-212.91035,271.43)"
+ id="g12227">
+ <path
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ id="path12229"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="opacity:0.46111109;fill:url(#radialGradient23739);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ id="path12231"
+ sodipodi:nodetypes="csscc" />
+ <path
+ style="opacity:1;fill:url(#linearGradient23741);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ id="path12233"
+ sodipodi:nodetypes="ccc" />
+ </g>
+ <g
+ transform="translate(-193.78094,269.3383)"
+ id="g12239">
+ <path
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ id="path12241"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="opacity:0.46111109;fill:url(#radialGradient23743);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ id="path12243"
+ sodipodi:nodetypes="csscc" />
+ <path
+ style="opacity:1;fill:url(#linearGradient23745);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ id="path12245"
+ sodipodi:nodetypes="ccc" />
+ </g>
+ <g
+ transform="translate(-225.96722,264.58414)"
+ id="g12186">
+ <path
+ style="fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.07456863;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 231.62587,-228.77086 C 230.58662,-229.36665 230.23015,-230.68774 230.83016,-231.71967 C 232.16166,-233.80243 233.93524,-233.26584 234.84231,-235.46138 C 236.10323,-234.12777 235.63545,-227.21367 231.62587,-228.77086 z"
+ id="path6059"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="opacity:0.46111109;fill:url(#radialGradient23747);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 234.31017,-229.9035 C 233.82059,-229.03976 232.73502,-228.74348 231.88703,-229.24216 C 231.03903,-229.74084 230.74816,-230.84657 231.23774,-231.71031 C 231.72733,-232.57405 233.84374,-232.16235 234.58388,-234 C 235.43187,-233.50133 234.79976,-230.76724 234.31017,-229.9035 z"
+ id="path6061"
+ sodipodi:nodetypes="csscc" />
+ <path
+ style="opacity:1;fill:url(#linearGradient23749);fill-opacity:1;stroke:none;stroke-width:1.07457018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 233.02237,-229 C 228.40776,-230.07384 233.25985,-233.71939 234,-232.92154 C 230.4176,-231.55118 233.02237,-229 233.02237,-229 z"
+ id="path6063"
+ sodipodi:nodetypes="ccc" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/embedded/weatherinfo/weatherinfo.cpp b/demos/embedded/weatherinfo/weatherinfo.cpp
new file mode 100644
index 0000000..fc6728c
--- /dev/null
+++ b/demos/embedded/weatherinfo/weatherinfo.cpp
@@ -0,0 +1,511 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+#include <QtNetwork>
+#include <QtSvg>
+
+#if defined (Q_OS_SYMBIAN)
+#include "sym_iap_util.h"
+#endif
+
+class WeatherInfo: public QMainWindow
+{
+ Q_OBJECT
+
+private:
+
+ QGraphicsView *m_view;
+ QGraphicsScene m_scene;
+ QString city;
+ QGraphicsRectItem *m_statusItem;
+ QGraphicsTextItem *m_temperatureItem;
+ QGraphicsTextItem *m_conditionItem;
+ QGraphicsSvgItem *m_iconItem;
+ QList<QGraphicsRectItem*> m_forecastItems;
+ QList<QGraphicsTextItem*> m_dayItems;
+ QList<QGraphicsSvgItem*> m_conditionItems;
+ QList<QGraphicsTextItem*> m_rangeItems;
+ QTimeLine m_timeLine;
+ QHash<QString, QString> m_icons;
+
+public:
+ WeatherInfo(QWidget *parent = 0): QMainWindow(parent) {
+
+ m_view = new QGraphicsView(this);
+ setCentralWidget(m_view);
+
+ setupScene();
+ m_view->setScene(&m_scene);
+ m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+ m_view->setFrameShape(QFrame::NoFrame);
+ setWindowTitle("Weather Info");
+
+ QStringList cities;
+ cities << "Oslo";
+ cities << "Berlin";
+ cities << "Brisbane";
+ cities << "Helsinki";
+ cities << "San Diego";
+ for (int i = 0; i < cities.count(); ++i) {
+ QAction *action = new QAction(cities[i], this);
+ connect(action, SIGNAL(triggered()), SLOT(chooseCity()));
+ addAction(action);
+#if defined(Q_OS_SYMBIAN)
+ menuBar()->addAction(action);
+#endif
+ }
+ setContextMenuPolicy(Qt::ActionsContextMenu);
+
+ QTimer::singleShot(0, this, SLOT(delayedInit()));
+ }
+
+private slots:
+ void delayedInit() {
+#if defined(Q_OS_SYMBIAN)
+ qt_SetDefaultIap();
+#else
+ request("Oslo");
+#endif
+ }
+
+private slots:
+
+ void chooseCity() {
+ QAction *action = qobject_cast<QAction*>(sender());
+ if (action)
+ request(action->text());
+ }
+
+ void handleNetworkData(QNetworkReply *networkReply) {
+ QUrl url = networkReply->url();
+ if (!networkReply->error())
+ digest(QString::fromUtf8(networkReply->readAll()));
+ networkReply->deleteLater();
+ networkReply->manager()->deleteLater();
+ }
+
+ void animate(int frame) {
+ qreal progress = static_cast<qreal>(frame) / 100;
+#if QT_VERSION >= 0x040500
+ m_iconItem->setOpacity(progress);
+#endif
+ qreal hw = width() / 2.0;
+ m_statusItem->setPos(-hw + hw * progress, 0);
+ for (int i = 0; i < m_forecastItems.count(); ++i) {
+ qreal ofs = i * 0.5 / m_forecastItems.count();
+ qreal alpha = qBound(qreal(0), 2 * (progress - ofs), qreal(1));
+#if QT_VERSION >= 0x040500
+ m_conditionItems[i]->setOpacity(alpha);
+#endif
+ QPointF pos = m_forecastItems[i]->pos();
+ if (width() > height()) {
+ qreal fx = width() - width() * 0.4 * alpha;
+ m_forecastItems[i]->setPos(fx, pos.y());
+ } else {
+ qreal fx = height() - height() * 0.5 * alpha;
+ m_forecastItems[i]->setPos(pos.x(), fx);
+ }
+ }
+ }
+
+private:
+
+ void setupScene() {
+
+ QColor textColor = palette().color(QPalette::WindowText);
+ QFont textFont = font();
+ textFont.setBold(true);
+ textFont.setPointSize(textFont.pointSize() * 2);
+
+ m_temperatureItem = m_scene.addText(QString(), textFont);
+ m_temperatureItem->setDefaultTextColor(textColor);
+
+ m_conditionItem = m_scene.addText(QString(), textFont);
+ m_conditionItem->setDefaultTextColor(textColor);
+
+ m_iconItem = new QGraphicsSvgItem;
+ m_scene.addItem(m_iconItem);
+
+ m_statusItem = m_scene.addRect(0, 0, 10, 10);
+ m_statusItem->setPen(Qt::NoPen);
+ m_statusItem->setBrush(Qt::NoBrush);
+ m_temperatureItem->setParentItem(m_statusItem);
+ m_conditionItem->setParentItem(m_statusItem);
+ m_iconItem->setParentItem(m_statusItem);
+
+ connect(&m_timeLine, SIGNAL(frameChanged(int)), SLOT(animate(int)));
+ m_timeLine.setDuration(1100);
+ m_timeLine.setFrameRange(0, 100);
+ m_timeLine.setCurveShape(QTimeLine::EaseInCurve);
+ }
+
+ void request(const QString &location) {
+ QUrl url("http://www.google.com/ig/api");
+ url.addEncodedQueryItem("hl", "en");
+ url.addEncodedQueryItem("weather", QUrl::toPercentEncoding(location));
+
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ connect(manager, SIGNAL(finished(QNetworkReply*)),
+ this, SLOT(handleNetworkData(QNetworkReply*)));
+ manager->get(QNetworkRequest(url));
+
+ city = QString();
+ setWindowTitle("Loading...");
+ }
+
+ QString extractIcon(const QString &data) {
+ if (m_icons.isEmpty()) {
+ m_icons["mostly_cloudy"] = "weather-few-clouds";
+ m_icons["cloudy"] = "weather-overcast";
+ m_icons["mostly_sunny"] = "weather-sunny-very-few-clouds";
+ m_icons["partly_cloudy"] = "weather-sunny-very-few-clouds";
+ m_icons["sunny"] = "weather-sunny";
+ m_icons["flurries"] = "weather-snow";
+ m_icons["fog"] = "weather-fog";
+ m_icons["haze"] = "weather-haze";
+ m_icons["icy"] = "weather-icy";
+ m_icons["sleet"] = "weather-sleet";
+ m_icons["chance_of_sleet"] = "weather-sleet";
+ m_icons["snow"] = "weather-snow";
+ m_icons["chance_of_snow"] = "weather-snow";
+ m_icons["mist"] = "weather-showers";
+ m_icons["rain"] = "weather-showers";
+ m_icons["chance_of_rain"] = "weather-showers";
+ m_icons["storm"] = "weather-storm";
+ m_icons["chance_of_storm"] = "weather-storm";
+ m_icons["thunderstorm"] = "weather-thundershower";
+ m_icons["chance_of_tstorm"] = "weather-thundershower";
+ }
+ QRegExp regex("([\\w]+).gif$");
+ if (regex.indexIn(data) != -1) {
+ QString i = regex.cap();
+ i = i.left(i.length() - 4);
+ QString name = m_icons.value(i);
+ if (!name.isEmpty()) {
+ name.prepend(":/icons/");
+ name.append(".svg");
+ return name;
+ }
+ }
+ return QString();
+ }
+
+ static QString toCelcius(QString t, QString unit) {
+ bool ok = false;
+ int degree = t.toInt(&ok);
+ if (!ok)
+ return QString();
+ if (unit != "SI")
+ degree = ((degree - 32) * 5 + 8)/ 9;
+ return QString::number(degree) + QChar(176);
+ }
+
+
+#define GET_DATA_ATTR xml.attributes().value("data").toString()
+
+ void digest(const QString &data) {
+
+ QColor textColor = palette().color(QPalette::WindowText);
+ QString unitSystem;
+
+ delete m_iconItem;
+ m_iconItem = new QGraphicsSvgItem();
+ m_scene.addItem(m_iconItem);
+ m_iconItem->setParentItem(m_statusItem);
+ qDeleteAll(m_dayItems);
+ qDeleteAll(m_conditionItems);
+ qDeleteAll(m_rangeItems);
+ qDeleteAll(m_forecastItems);
+ m_dayItems.clear();
+ m_conditionItems.clear();
+ m_rangeItems.clear();
+ m_forecastItems.clear();
+
+ QXmlStreamReader xml(data);
+ while (!xml.atEnd()) {
+ xml.readNext();
+ if (xml.tokenType() == QXmlStreamReader::StartElement) {
+ if (xml.name() == "city") {
+ city = GET_DATA_ATTR;
+ setWindowTitle(city);
+ }
+ if (xml.name() == "unit_system")
+ unitSystem = xml.attributes().value("data").toString();
+ // Parse current weather conditions
+ if (xml.name() == "current_conditions") {
+ while (!xml.atEnd()) {
+ xml.readNext();
+ if (xml.name() == "current_conditions")
+ break;
+ if (xml.tokenType() == QXmlStreamReader::StartElement) {
+ if (xml.name() == "condition") {
+ m_conditionItem->setPlainText(GET_DATA_ATTR);
+ }
+ if (xml.name() == "icon") {
+ QString name = extractIcon(GET_DATA_ATTR);
+ if (!name.isEmpty()) {
+ delete m_iconItem;
+ m_iconItem = new QGraphicsSvgItem(name);
+ m_scene.addItem(m_iconItem);
+ m_iconItem->setParentItem(m_statusItem);
+ }
+ }
+ if (xml.name() == "temp_c") {
+ QString s = GET_DATA_ATTR + QChar(176);
+ m_temperatureItem->setPlainText(s);
+ }
+ }
+ }
+ }
+ // Parse and collect the forecast conditions
+ if (xml.name() == "forecast_conditions") {
+ QGraphicsTextItem *dayItem = 0;
+ QGraphicsSvgItem *statusItem = 0;
+ QString lowT, highT;
+ while (!xml.atEnd()) {
+ xml.readNext();
+ if (xml.name() == "forecast_conditions") {
+ if (dayItem && statusItem &&
+ !lowT.isEmpty() && !highT.isEmpty()) {
+ m_dayItems << dayItem;
+ m_conditionItems << statusItem;
+ QString txt = highT + '/' + lowT;
+ QGraphicsTextItem* rangeItem;
+ rangeItem = m_scene.addText(txt);
+ rangeItem->setDefaultTextColor(textColor);
+ m_rangeItems << rangeItem;
+ QGraphicsRectItem *box;
+ box = m_scene.addRect(0, 0, 10, 10);
+ box->setPen(Qt::NoPen);
+ box->setBrush(Qt::NoBrush);
+ m_forecastItems << box;
+ dayItem->setParentItem(box);
+ statusItem->setParentItem(box);
+ rangeItem->setParentItem(box);
+ } else {
+ delete dayItem;
+ delete statusItem;
+ }
+ break;
+ }
+ if (xml.tokenType() == QXmlStreamReader::StartElement) {
+ if (xml.name() == "day_of_week") {
+ QString s = GET_DATA_ATTR;
+ dayItem = m_scene.addText(s.left(3));
+ dayItem->setDefaultTextColor(textColor);
+ }
+ if (xml.name() == "icon") {
+ QString name = extractIcon(GET_DATA_ATTR);
+ if (!name.isEmpty()) {
+ statusItem = new QGraphicsSvgItem(name);
+ m_scene.addItem(statusItem);
+ }
+ }
+ if (xml.name() == "low")
+ lowT = toCelcius(GET_DATA_ATTR, unitSystem);
+ if (xml.name() == "high")
+ highT = toCelcius(GET_DATA_ATTR, unitSystem);
+ }
+ }
+ }
+
+ }
+ }
+
+ m_timeLine.stop();
+ layoutItems();
+ animate(0);
+ m_timeLine.start();
+ }
+
+ void layoutItems() {
+ m_scene.setSceneRect(0, 0, width() - 1, height() - 1);
+ m_view->centerOn(width() / 2, height() / 2);
+ if (width() > height())
+ layoutItemsLandscape();
+ else
+ layoutItemsPortrait();
+ }
+
+ void layoutItemsLandscape() {
+ m_statusItem->setRect(0, 0, width() / 2 - 1, height() - 1);
+
+ if (!m_iconItem->boundingRect().isEmpty()) {
+ qreal dim = qMin(width() * 0.6, height() * 0.8);
+ qreal pad = (height() - dim) / 2;
+ qreal sw = dim / m_iconItem->boundingRect().width();
+ qreal sh = dim / m_iconItem->boundingRect().height();
+ m_iconItem->setTransform(QTransform().scale(sw, sh));
+ m_iconItem->setPos(1, pad);
+ }
+
+ m_temperatureItem->setPos(2, 2);
+ qreal h = m_conditionItem->boundingRect().height();
+ m_conditionItem->setPos(10, height() - h);
+
+ if (m_dayItems.count()) {
+ qreal left = width() * 0.6;
+ qreal h = height() / m_dayItems.count();
+ QFont textFont = font();
+ textFont.setPixelSize(static_cast<int>(h * 0.3));
+ qreal statusWidth = 0;
+ qreal rangeWidth = 0;
+ for (int i = 0; i < m_dayItems.count(); ++i) {
+ m_dayItems[i]->setFont(textFont);
+ QRectF brect = m_dayItems[i]->boundingRect();
+ statusWidth = qMax(statusWidth, brect.width());
+ brect = m_rangeItems[i]->boundingRect();
+ rangeWidth = qMax(rangeWidth, brect.width());
+ }
+ qreal space = width() - left - statusWidth - rangeWidth;
+ qreal dim = qMin(h, space);
+ qreal pad = statusWidth + (space - dim) / 2;
+ for (int i = 0; i < m_dayItems.count(); ++i) {
+ qreal base = h * i;
+ m_forecastItems[i]->setPos(left, base);
+ m_forecastItems[i]->setRect(0, 0, width() - left, h);
+ QRectF brect = m_dayItems[i]->boundingRect();
+ qreal ofs = (h - brect.height()) / 2;
+ m_dayItems[i]->setPos(0, ofs);
+ brect = m_rangeItems[i]->boundingRect();
+ ofs = (h - brect.height()) / 2;
+ m_rangeItems[i]->setPos(width() - rangeWidth - left, ofs);
+ brect = m_conditionItems[i]->boundingRect();
+ ofs = (h - dim) / 2;
+ m_conditionItems[i]->setPos(pad, ofs);
+ if (brect.isEmpty())
+ continue;
+ qreal sw = dim / brect.width();
+ qreal sh = dim / brect.height();
+ m_conditionItems[i]->setTransform(QTransform().scale(sw, sh));
+ }
+ }
+ }
+
+ void layoutItemsPortrait() {
+
+ m_statusItem->setRect(0, 0, width() - 1, height() / 2 - 1);
+
+ if (!m_iconItem->boundingRect().isEmpty()) {
+ qreal dim = qMin(width() * 0.8, height() * 0.4);
+ qreal ofsy = (height() / 2 - dim) / 2;
+ qreal ofsx = (width() - dim) / 3;
+ qreal sw = dim / m_iconItem->boundingRect().width();
+ qreal sh = dim / m_iconItem->boundingRect().height();
+ m_iconItem->setTransform(QTransform().scale(sw, sh));
+ m_iconItem->setPos(ofsx, ofsy);
+ }
+
+ m_temperatureItem->setPos(2, 2);
+ qreal ch = m_conditionItem->boundingRect().height();
+ qreal cw = m_conditionItem->boundingRect().width();
+ m_conditionItem->setPos(width() - cw , height() / 2 - ch - 20);
+
+ if (m_dayItems.count()) {
+ qreal top = height() * 0.5;
+ qreal w = width() / m_dayItems.count();
+ qreal statusHeight = 0;
+ qreal rangeHeight = 0;
+ for (int i = 0; i < m_dayItems.count(); ++i) {
+ m_dayItems[i]->setFont(font());
+ QRectF brect = m_dayItems[i]->boundingRect();
+ statusHeight = qMax(statusHeight, brect.height());
+ brect = m_rangeItems[i]->boundingRect();
+ rangeHeight = qMax(rangeHeight, brect.height());
+ }
+ qreal space = height() - top - statusHeight - rangeHeight;
+ qreal dim = qMin(w, space);
+
+ qreal boxh = statusHeight + rangeHeight + dim;
+ qreal pad = (height() - top - boxh) / 2;
+
+ for (int i = 0; i < m_dayItems.count(); ++i) {
+ qreal base = w * i;
+ m_forecastItems[i]->setPos(base, top);
+ m_forecastItems[i]->setRect(0, 0, w, boxh);
+ QRectF brect = m_dayItems[i]->boundingRect();
+ qreal ofs = (w - brect.width()) / 2;
+ m_dayItems[i]->setPos(ofs, pad);
+
+ brect = m_rangeItems[i]->boundingRect();
+ ofs = (w - brect.width()) / 2;
+ m_rangeItems[i]->setPos(ofs, pad + statusHeight + dim);
+
+ brect = m_conditionItems[i]->boundingRect();
+ ofs = (w - dim) / 2;
+ m_conditionItems[i]->setPos(ofs, pad + statusHeight);
+ if (brect.isEmpty())
+ continue;
+ qreal sw = dim / brect.width();
+ qreal sh = dim / brect.height();
+ m_conditionItems[i]->setTransform(QTransform().scale(sw, sh));
+ }
+ }
+ }
+
+
+ void resizeEvent(QResizeEvent *event) {
+ Q_UNUSED(event);
+ layoutItems();
+ }
+
+};
+
+#include "weatherinfo.moc"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ WeatherInfo w;
+#if defined(Q_OS_SYMBIAN)
+ w.showMaximized();
+#else
+ w.resize(520, 288);
+ w.show();
+#endif
+
+ return app.exec();
+}
diff --git a/demos/embedded/weatherinfo/weatherinfo.pro b/demos/embedded/weatherinfo/weatherinfo.pro
new file mode 100644
index 0000000..a89acba
--- /dev/null
+++ b/demos/embedded/weatherinfo/weatherinfo.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = weatherinfo
+SOURCES = weatherinfo.cpp
+RESOURCES = weatherinfo.qrc
+QT += network svg
+
+symbian {
+ HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h
+ LIBS += -lesock -lconnmon
+ TARGET.CAPABILITY = NetworkServices
+}
diff --git a/demos/embedded/weatherinfo/weatherinfo.qrc b/demos/embedded/weatherinfo/weatherinfo.qrc
new file mode 100644
index 0000000..6e9d224
--- /dev/null
+++ b/demos/embedded/weatherinfo/weatherinfo.qrc
@@ -0,0 +1,16 @@
+<RCC>
+ <qresource prefix="/" >
+ <file>icons/weather-few-clouds.svg</file>
+ <file>icons/weather-fog.svg</file>
+ <file>icons/weather-haze.svg</file>
+ <file>icons/weather-icy.svg</file>
+ <file>icons/weather-overcast.svg</file>
+ <file>icons/weather-showers.svg</file>
+ <file>icons/weather-sleet.svg</file>
+ <file>icons/weather-snow.svg</file>
+ <file>icons/weather-storm.svg</file>
+ <file>icons/weather-sunny.svg</file>
+ <file>icons/weather-sunny-very-few-clouds.svg</file>
+ <file>icons/weather-thundershower.svg</file>
+ </qresource>
+</RCC>
diff --git a/demos/embeddeddialogs/embeddeddialogs.pro b/demos/embeddeddialogs/embeddeddialogs.pro
index a38e3e8..d3ef442 100644
--- a/demos/embeddeddialogs/embeddeddialogs.pro
+++ b/demos/embeddeddialogs/embeddeddialogs.pro
@@ -15,3 +15,5 @@ target.path = $$[QT_INSTALL_DEMOS]/embeddeddialogs
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.png *.jpg *.plist *.icns *.ico *.rc *.pro *.html *.doc images
sources.path = $$[QT_INSTALL_DEMOS]/embeddeddialogs
INSTALLS += target sources
+
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/demos/embeddeddialogs/main.cpp b/demos/embeddeddialogs/main.cpp
index bfda00e..9c54bf2 100644
--- a/demos/embeddeddialogs/main.cpp
+++ b/demos/embeddeddialogs/main.cpp
@@ -76,7 +76,6 @@ int main(int argc, char *argv[])
view.scale(0.5, 0.5);
view.setRenderHints(view.renderHints() | QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
view.setBackgroundBrush(QPixmap(":/No-Ones-Laughing-3.jpg"));
- view.setCacheMode(QGraphicsView::CacheBackground);
view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
view.show();
view.setWindowTitle("Embedded Dialogs Demo");
diff --git a/demos/gradients/gradients.pro b/demos/gradients/gradients.pro
index 167572b..21cd57d 100644
--- a/demos/gradients/gradients.pro
+++ b/demos/gradients/gradients.pro
@@ -16,3 +16,5 @@ target.path = $$[QT_INSTALL_DEMOS]/gradients
sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.html
sources.path = $$[QT_INSTALL_DEMOS]/gradients
INSTALLS += target sources
+
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/demos/interview/interview.pro b/demos/interview/interview.pro
index c013755..1e5f9b8 100644
--- a/demos/interview/interview.pro
+++ b/demos/interview/interview.pro
@@ -16,3 +16,4 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES README *.pro images
sources.path = $$[QT_INSTALL_DEMOS]/interview
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/demos/macmainwindow/macmainwindow.pro b/demos/macmainwindow/macmainwindow.pro
index f5165a7..ba6ffbb 100644
--- a/demos/macmainwindow/macmainwindow.pro
+++ b/demos/macmainwindow/macmainwindow.pro
@@ -12,7 +12,7 @@ build_all:!build_pass {
CONFIG += release
}
-LIBS += -framework Cocoa
+LIBS += -framework Cocoa -framework Carbon
# install
mac {
diff --git a/demos/mainwindow/mainwindow.pro b/demos/mainwindow/mainwindow.pro
index 9853a55..8e9bdc2 100644
--- a/demos/mainwindow/mainwindow.pro
+++ b/demos/mainwindow/mainwindow.pro
@@ -14,3 +14,4 @@ sources.files = $$SOURCES $$HEADERS $$FORMS $$RESOURCES *.png *.jpg *.pro
sources.path = $$[QT_INSTALL_DEMOS]/mainwindow
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/demos/mediaplayer/mediaplayer.pro b/demos/mediaplayer/mediaplayer.pro
index c64abd9..49a652e 100644
--- a/demos/mediaplayer/mediaplayer.pro
+++ b/demos/mediaplayer/mediaplayer.pro
@@ -25,4 +25,7 @@ wince*{
DEPLOYMENT_PLUGIN += phonon_ds9 phonon_waveout
}
-
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ TARGET.UID3 = 0xA000C613
+}
diff --git a/demos/pathstroke/pathstroke.pro b/demos/pathstroke/pathstroke.pro
index 50b4de2..ac50842 100644
--- a/demos/pathstroke/pathstroke.pro
+++ b/demos/pathstroke/pathstroke.pro
@@ -18,3 +18,7 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.html
sources.path = $$[QT_INSTALL_DEMOS]/pathstroke
INSTALLS += target sources
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ TARGET.UID3 = 0xA000A63E
+}
diff --git a/demos/qtdemo/colors.cpp b/demos/qtdemo/colors.cpp
index f98ec57..e63417c 100644
--- a/demos/qtdemo/colors.cpp
+++ b/demos/qtdemo/colors.cpp
@@ -72,10 +72,8 @@ int Colors::contentHeight = 510;
// Properties:
bool Colors::openGlRendering = false;
-bool Colors::direct3dRendering = false;
bool Colors::softwareRendering = false;
-bool Colors::openGlAwailable = true;
-bool Colors::direct3dAwailable = true;
+bool Colors::openGlAvailable = true;
bool Colors::xRenderPresent = true;
bool Colors::noTicker = false;
@@ -206,8 +204,6 @@ void Colors::parseArgs(int argc, char *argv[])
QString s(argv[i]);
if (s == "-opengl")
Colors::openGlRendering = true;
- else if (s == "-direct3d")
- Colors::direct3dRendering = true;
else if (s == "-software")
Colors::softwareRendering = true;
else if (s == "-no-opengl") // support old style
@@ -270,7 +266,7 @@ void Colors::parseArgs(int argc, char *argv[])
Colors::fps = int(parseFloat(s, "-fps"));
else if (s.startsWith("-h") || s.startsWith("-help")){
QMessageBox::warning(0, "Arguments",
- QString("Usage: qtdemo [-verbose] [-no-adapt] [-opengl] [-direct3d] [-software] [-fullscreen] [-ticker[0|1]] ")
+ QString("Usage: qtdemo [-verbose] [-no-adapt] [-opengl] [-software] [-fullscreen] [-ticker[0|1]] ")
+ "[-animations[0|1]] [-no-blending] [-no-sync] [-use-timer-update[0|1]] [-pause[0|1]] "
+ "[-use-window-mask] [-no-rescale] "
+ "[-use-pixmaps] [-show-fps] [-show-br] [-8bit[0|1]] [-menu<int>] [-use-loop] [-use-balls] "
@@ -290,7 +286,6 @@ void Colors::parseArgs(int argc, char *argv[])
void Colors::setLowSettings()
{
Colors::openGlRendering = false;
- Colors::direct3dRendering = false;
Colors::softwareRendering = true;
Colors::noTicker = true;
Colors::noTimerUpdate = true;
@@ -325,15 +320,11 @@ void Colors::detectSystemResources()
qDebug() << "- OpenGL not supported by current build of Qt";
#endif
{
- Colors::openGlAwailable = false;
+ Colors::openGlAvailable = false;
if (Colors::verbose)
qDebug("- OpenGL not recommended on this system");
}
-#if defined(Q_WS_WIN)
- Colors::direct3dAwailable = false; // for now.
-#endif
-
#if defined(Q_WS_X11)
// check if X render is present:
QPixmap tmp(1, 1);
@@ -369,21 +360,9 @@ void Colors::postConfigure()
}
}
-#if !defined(Q_WS_WIN)
- if (Colors::direct3dRendering){
- Colors::direct3dRendering = false;
- qDebug() << "- WARNING: Direct3D specified, but not supported on this platform";
- }
-#endif
-
- if (!Colors::openGlRendering && !Colors::direct3dRendering && !Colors::softwareRendering){
+ if (!Colors::openGlRendering && !Colors::softwareRendering){
// The user has not decided rendering system. So we do it instead:
-#if defined(Q_WS_WIN)
- if (Colors::direct3dAwailable)
- Colors::direct3dRendering = true;
- else
-#endif
- if (Colors::openGlAwailable)
+ if (Colors::openGlAvailable)
Colors::openGlRendering = true;
else
Colors::softwareRendering = true;
diff --git a/demos/qtdemo/colors.h b/demos/qtdemo/colors.h
index 3d2bb2a..c534649 100644
--- a/demos/qtdemo/colors.h
+++ b/demos/qtdemo/colors.h
@@ -81,11 +81,9 @@ public:
static int contentHeight;
// properties:
+ static bool openGlAvailable;
static bool openGlRendering;
- static bool direct3dRendering;
static bool softwareRendering;
- static bool openGlAwailable;
- static bool direct3dAwailable;
static bool xRenderPresent;
static bool noAdapt;
static bool noTicker;
diff --git a/demos/qtdemo/mainwindow.cpp b/demos/qtdemo/mainwindow.cpp
index 55e0b86..f8f4922 100644
--- a/demos/qtdemo/mainwindow.cpp
+++ b/demos/qtdemo/mainwindow.cpp
@@ -100,14 +100,8 @@ void MainWindow::setRenderingSystem()
{
QWidget *viewport = 0;
- if (Colors::direct3dRendering){
- viewport->setAttribute(Qt::WA_MSWindowsUseDirect3D);
- setCacheMode(QGraphicsView::CacheNone);
- if (Colors::verbose)
- qDebug() << "- using Direct3D";
- }
#ifndef QT_NO_OPENGL
- else if (Colors::openGlRendering){
+ if (Colors::openGlRendering) {
QGLWidget *glw = new QGLWidget(QGLFormat(QGL::SampleBuffers));
if (Colors::noScreenSync)
glw->format().setSwapInterval(0);
@@ -116,9 +110,10 @@ void MainWindow::setRenderingSystem()
setCacheMode(QGraphicsView::CacheNone);
if (Colors::verbose)
qDebug() << "- using OpenGL";
- }
+ } else // software rendering
#endif
- else{ // software rendering
+ {
+ // software rendering
viewport = new QWidget;
setCacheMode(QGraphicsView::CacheBackground);
if (Colors::verbose)
@@ -386,8 +381,6 @@ void MainWindow::keyPressEvent(QKeyEvent *event)
s += "Rendering system: ";
if (Colors::openGlRendering)
s += "OpenGL";
- else if (Colors::direct3dRendering)
- s += "Direct3D";
else
s += "software";
diff --git a/demos/qtdemo/qtdemo.pro b/demos/qtdemo/qtdemo.pro
index 163ed17..011ea0c 100644
--- a/demos/qtdemo/qtdemo.pro
+++ b/demos/qtdemo/qtdemo.pro
@@ -6,6 +6,8 @@ DESTDIR = $$DEMO_DESTDIR/bin
OBJECTS_DIR = .obj
MOC_DIR = .moc
INSTALLS += target sources
+
+
QT += xml network
contains(QT_CONFIG, opengl) {
@@ -67,6 +69,8 @@ ICON = qtdemo.icns
QMAKE_INFO_PLIST = Info_mac.plist
}
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
# install
target.path = $$[QT_INSTALL_BINS]
sources.files = $$SOURCES $$HEADERS $$FORMS $$RESOURCES qtdemo.pro images xml *.ico *.icns *.rc *.plist
diff --git a/demos/qtdemo/qtdemo.rc b/demos/qtdemo/qtdemo.rc
index 4cf2a63..882b355 100644
--- a/demos/qtdemo/qtdemo.rc
+++ b/demos/qtdemo/qtdemo.rc
@@ -1,2 +1,32 @@
+#include "winver.h"
+
IDI_ICON1 ICON DISCARDABLE "qtdemo.ico"
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,0
+ PRODUCTVERSION 1,0,0,0
+ FILEFLAGS 0x0L
+ FILEFLAGSMASK 0x3fL
+ FILEOS 0x00040004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "CompanyName", "Nokia Corporation and/or its subsidiary(-ies)"
+ VALUE "FileDescription", "Qt Examples and Demos"
+ VALUE "FileVersion", "1.0.0.0"
+ VALUE "LegalCopyright", "Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)."
+ VALUE "InternalName", "qtdemo"
+ VALUE "OriginalFilename", "qtdemo.exe"
+ VALUE "ProductName", "Qt Examples and Demos"
+ VALUE "ProductVersion", "1.0.0.0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1200
+ END
+END
diff --git a/demos/qtdemo/xml/examples.xml b/demos/qtdemo/xml/examples.xml
index 96a3e80..f598780 100644
--- a/demos/qtdemo/xml/examples.xml
+++ b/demos/qtdemo/xml/examples.xml
@@ -18,7 +18,16 @@
<example filename="browser" name="Browser" />
<example filename="mediaplayer" name="Media Player" />
<example filename="boxes" name="Boxes" />
+ <example filename="sub-attaq" name="Sub-attaq" />
</demos>
+ <category dirname="animation" name="Animation Framework">
+ <example filename="animatedtiles" name="Animated Tiles" />
+ <example filename="appchooser" name="Appchooser" />
+ <example filename="easing" name="Easing Curves" />
+ <example filename="moveblocks" name="Moving Blocks" />
+ <example filename="states" name="UI States" />
+ <example filename="stickman" name="Stickman" />
+ </category>
<category dirname="qtconcurrent" name="Concurrent Programming">
<example filename="map" name="Map" executable="false" />
<example filename="progressdialog" name="Progress Dialog" />
@@ -145,6 +154,11 @@
<category dirname="phonon" name="Phonon">
<example filename="musicplayer" name="Music Player" />
</category>
+ <category dirname="multimedia/audio" name="Multimedia">
+ <example filename="audiodevices" name="Audio Devices" />
+ <example filename="audiooutput" name="Audio Output" />
+ <example filename="audioinput" name="Audio Input" />
+ </category>
<category dirname="richtext" name="Rich Text">
<example filename="calendar" name="Calendar" />
<example filename="orderform" name="Order Form" />
@@ -167,6 +181,13 @@
<example filename="masterdetail" name="Music Archive" />
<example filename="sqlwidgetmapper" name="SQL Widget Mapper" />
</category>
+ <category dirname="statemachine" name="State Machine">
+ <example filename="eventtransitions" name="Event Transitions" />
+ <example filename="rogue" name="Rogue" />
+ <example filename="tankgame" name="Tank Game" />
+ <example filename="trafficlight" name="Traffic Light" />
+ <example filename="twowaybutton" name="Two-way Button" />
+ </category>
<category dirname="threads" name="Threading">
<example filename="mandelbrot" name="Mandelbrot" />
</category>
@@ -175,6 +196,7 @@
<example filename="completer" name="Completer" />
<example filename="customcompleter" name="Custom Completer" />
<example filename="i18n" name="Internationalization" />
+ <example filename="inputpanel" name="Input Panel" />
<example filename="plugandpaint" name="Plug and Paint" />
<example filename="regexp" name="Regular Expressions" />
<example filename="settingseditor" name="Settings Editor" />
@@ -231,5 +253,6 @@
<example filename="qobjectxmlmodel" name="QObjectXmlModel" />
<example filename="filetree" name="File Tree" />
<example filename="trafficinfo" name="Traffic Info" />
+ <example filename="schema" name="XML Schema Validation" />
</category>
</categories>
diff --git a/demos/shared/shared.pri b/demos/shared/shared.pri
index b551595..1541fa7 100644
--- a/demos/shared/shared.pri
+++ b/demos/shared/shared.pri
@@ -16,5 +16,6 @@ contains(CONFIG, debug_and_release_target) {
hpux-acc*:LIBS += $$SHARED_FOLDER/libdemo_shared.a
hpuxi-acc*:LIBS += $$SHARED_FOLDER/libdemo_shared.a
-!hpuxi-acc*:!hpux-acc*:LIBS += -ldemo_shared
+symbian:LIBS += -ldemo_shared.lib
+!hpuxi-acc*:!hpux-acc*:!symbian:LIBS += -ldemo_shared
diff --git a/demos/shared/shared.pro b/demos/shared/shared.pro
index cabce25..de29857 100644
--- a/demos/shared/shared.pro
+++ b/demos/shared/shared.pro
@@ -29,5 +29,10 @@ target.path = $$[QT_INSTALL_DEMOS]/shared
sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.pri images
sources.path = $$[QT_INSTALL_DEMOS]/shared
INSTALLS += sources
+
!cross_compile:INSTALLS += target
+symbian {
+ include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+ TARGET.UID3 = 0xA000A63C
+}
diff --git a/demos/spreadsheet/spreadsheet.cpp b/demos/spreadsheet/spreadsheet.cpp
index ab2d4b1..644a4b6 100644
--- a/demos/spreadsheet/spreadsheet.cpp
+++ b/demos/spreadsheet/spreadsheet.cpp
@@ -481,7 +481,7 @@ void SpreadSheet::setupContents()
table->setItem(3, 0, new SpreadSheetItem("Lunch"));
table->setItem(4, 0, new SpreadSheetItem("Flight (LA)"));
table->setItem(5, 0, new SpreadSheetItem("Taxi"));
- table->setItem(6, 0, new SpreadSheetItem("Diinner"));
+ table->setItem(6, 0, new SpreadSheetItem("Dinner"));
table->setItem(7, 0, new SpreadSheetItem("Hotel"));
table->setItem(8, 0, new SpreadSheetItem("Flight (Oslo)"));
table->setItem(9, 0, new SpreadSheetItem("Total:"));
diff --git a/demos/spreadsheet/spreadsheet.pro b/demos/spreadsheet/spreadsheet.pro
index 6ed0016..6b38abe 100644
--- a/demos/spreadsheet/spreadsheet.pro
+++ b/demos/spreadsheet/spreadsheet.pro
@@ -31,3 +31,4 @@ sources.files = $$SOURCES $$RESOURCES *.pro images $$HEADERS
sources.path = $$[QT_INSTALL_DEMOS]/spreadsheet
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/demos/sqlbrowser/sqlbrowser.pro b/demos/sqlbrowser/sqlbrowser.pro
index 920e8a0..3a8036d 100644
--- a/demos/sqlbrowser/sqlbrowser.pro
+++ b/demos/sqlbrowser/sqlbrowser.pro
@@ -18,6 +18,8 @@ sources.files = $$SOURCES $$HEADERS $$FORMS *.pro
sources.path = $$[QT_INSTALL_DEMOS]/sqlbrowser
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
wince*: {
DEPLOYMENT_PLUGIN += qsqlite
}
diff --git a/demos/sub-attaq/animationmanager.cpp b/demos/sub-attaq/animationmanager.cpp
new file mode 100644
index 0000000..6bbb3dc
--- /dev/null
+++ b/demos/sub-attaq/animationmanager.cpp
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "animationmanager.h"
+
+//Qt
+#include <QtCore/QAbstractAnimation>
+#include <QtCore/QDebug>
+
+// the universe's only animation manager
+AnimationManager *AnimationManager::instance = 0;
+
+AnimationManager::AnimationManager()
+{
+}
+
+AnimationManager *AnimationManager::self()
+{
+ if (!instance)
+ instance = new AnimationManager;
+ return instance;
+}
+
+void AnimationManager::registerAnimation(QAbstractAnimation *anim)
+{
+ animations.append(anim);
+}
+
+void AnimationManager::unregisterAnimation(QAbstractAnimation *anim)
+{
+ animations.removeAll(anim);
+}
+
+void AnimationManager::unregisterAllAnimations()
+{
+ animations.clear();
+}
+
+void AnimationManager::pauseAll()
+{
+ foreach (QAbstractAnimation* animation, animations)
+ {
+ if (animation->state() == QAbstractAnimation::Running)
+ animation->pause();
+ }
+}
+void AnimationManager::resumeAll()
+{
+ foreach (QAbstractAnimation* animation, animations)
+ {
+ if (animation->state() == QAbstractAnimation::Paused)
+ animation->resume();
+ }
+}
diff --git a/demos/sub-attaq/animationmanager.h b/demos/sub-attaq/animationmanager.h
new file mode 100644
index 0000000..39adbdb
--- /dev/null
+++ b/demos/sub-attaq/animationmanager.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ANIMATIONMANAGER_H
+#define ANIMATIONMANAGER_H
+
+#include <QtCore/QObject>
+
+QT_BEGIN_NAMESPACE
+class QAbstractAnimation;
+QT_END_NAMESPACE
+
+class AnimationManager : public QObject
+{
+Q_OBJECT
+public:
+ AnimationManager();
+ void registerAnimation(QAbstractAnimation *anim);
+ void unregisterAnimation(QAbstractAnimation *anim);
+ void unregisterAllAnimations();
+ static AnimationManager *self();
+
+public slots:
+ void pauseAll();
+ void resumeAll();
+
+private:
+ static AnimationManager *instance;
+ QList<QAbstractAnimation *> animations;
+};
+
+#endif // ANIMATIONMANAGER_H
diff --git a/demos/sub-attaq/boat.cpp b/demos/sub-attaq/boat.cpp
new file mode 100644
index 0000000..6c4dc66
--- /dev/null
+++ b/demos/sub-attaq/boat.cpp
@@ -0,0 +1,318 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "boat.h"
+#include "boat_p.h"
+#include "bomb.h"
+#include "pixmapitem.h"
+#include "graphicsscene.h"
+#include "animationmanager.h"
+#include "custompropertyanimation.h"
+#include "qanimationstate.h"
+
+//Qt
+#include <QtCore/QPropertyAnimation>
+#include <QtCore/QStateMachine>
+#include <QtCore/QHistoryState>
+#include <QtCore/QFinalState>
+#include <QtCore/QState>
+#include <QtCore/QSequentialAnimationGroup>
+
+static QAbstractAnimation *setupDestroyAnimation(Boat *boat)
+{
+ QSequentialAnimationGroup *group = new QSequentialAnimationGroup(boat);
+#if QT_VERSION >=0x040500
+ PixmapItem *step1 = new PixmapItem(QString("explosion/boat/step1"),GraphicsScene::Big, boat);
+ step1->setZValue(6);
+ PixmapItem *step2 = new PixmapItem(QString("explosion/boat/step2"),GraphicsScene::Big, boat);
+ step2->setZValue(6);
+ PixmapItem *step3 = new PixmapItem(QString("explosion/boat/step3"),GraphicsScene::Big, boat);
+ step3->setZValue(6);
+ PixmapItem *step4 = new PixmapItem(QString("explosion/boat/step4"),GraphicsScene::Big, boat);
+ step4->setZValue(6);
+ step1->setOpacity(0);
+ step2->setOpacity(0);
+ step3->setOpacity(0);
+ step4->setOpacity(0);
+ CustomPropertyAnimation *anim1 = new CustomPropertyAnimation(boat);
+ anim1->setMemberFunctions((QGraphicsItem*)step1, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim1->setDuration(100);
+ anim1->setEndValue(1);
+ CustomPropertyAnimation *anim2 = new CustomPropertyAnimation(boat);
+ anim2->setMemberFunctions((QGraphicsItem*)step2, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim2->setDuration(100);
+ anim2->setEndValue(1);
+ CustomPropertyAnimation *anim3 = new CustomPropertyAnimation(boat);
+ anim3->setMemberFunctions((QGraphicsItem*)step3, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim3->setDuration(100);
+ anim3->setEndValue(1);
+ CustomPropertyAnimation *anim4 = new CustomPropertyAnimation(boat);
+ anim4->setMemberFunctions((QGraphicsItem*)step4, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim4->setDuration(100);
+ anim4->setEndValue(1);
+ CustomPropertyAnimation *anim5 = new CustomPropertyAnimation(boat);
+ anim5->setMemberFunctions((QGraphicsItem*)step1, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim5->setDuration(100);
+ anim5->setEndValue(0);
+ CustomPropertyAnimation *anim6 = new CustomPropertyAnimation(boat);
+ anim6->setMemberFunctions((QGraphicsItem*)step2, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim6->setDuration(100);
+ anim6->setEndValue(0);
+ CustomPropertyAnimation *anim7 = new CustomPropertyAnimation(boat);
+ anim7->setMemberFunctions((QGraphicsItem*)step3, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim7->setDuration(100);
+ anim7->setEndValue(0);
+ CustomPropertyAnimation *anim8 = new CustomPropertyAnimation(boat);
+ anim8->setMemberFunctions((QGraphicsItem*)step4, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim8->setDuration(100);
+ anim8->setEndValue(0);
+ group->addAnimation(anim1);
+ group->addAnimation(anim2);
+ group->addAnimation(anim3);
+ group->addAnimation(anim4);
+ group->addAnimation(anim5);
+ group->addAnimation(anim6);
+ group->addAnimation(anim7);
+ group->addAnimation(anim8);
+#else
+ // work around for a bug where we don't transition if the duration is zero.
+ QtPauseAnimation *anim = new QtPauseAnimation(group);
+ anim->setDuration(1);
+ group->addAnimation(anim);
+#endif
+ AnimationManager::self()->registerAnimation(group);
+ return group;
+}
+
+
+
+Boat::Boat(QGraphicsItem * parent, Qt::WindowFlags wFlags)
+ : QGraphicsWidget(parent,wFlags), speed(0), bombsAlreadyLaunched(0), direction(Boat::None), movementAnimation(0)
+{
+ pixmapItem = new PixmapItem(QString("boat"),GraphicsScene::Big, this);
+ setZValue(4);
+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable);
+ resize(pixmapItem->boundingRect().size());
+
+ //The movement animation used to animate the boat
+ movementAnimation = new QPropertyAnimation(this, "pos");
+
+ //The movement animation used to animate the boat
+ destroyAnimation = setupDestroyAnimation(this);
+
+ //We setup the state machien of the boat
+ machine = new QStateMachine(this);
+ QState *moving = new QState(machine);
+ StopState *stopState = new StopState(this, moving);
+ machine->setInitialState(moving);
+ moving->setInitialState(stopState);
+ MoveStateRight *moveStateRight = new MoveStateRight(this, moving);
+ MoveStateLeft *moveStateLeft = new MoveStateLeft(this, moving);
+ LaunchStateRight *launchStateRight = new LaunchStateRight(this, machine);
+ LaunchStateLeft *launchStateLeft = new LaunchStateLeft(this, machine);
+
+ //then setup the transitions for the rightMove state
+ KeyStopTransition *leftStopRight = new KeyStopTransition(this, QEvent::KeyPress, Qt::Key_Left);
+ leftStopRight->setTargetState(stopState);
+ KeyMoveTransition *leftMoveRight = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Left);
+ leftMoveRight->setTargetState(moveStateRight);
+ KeyMoveTransition *rightMoveRight = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right);
+ rightMoveRight->setTargetState(moveStateRight);
+ KeyMoveTransition *rightMoveStop = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right);
+ rightMoveStop->setTargetState(moveStateRight);
+
+ //then setup the transitions for the leftMove state
+ KeyStopTransition *rightStopLeft = new KeyStopTransition(this, QEvent::KeyPress, Qt::Key_Right);
+ rightStopLeft->setTargetState(stopState);
+ KeyMoveTransition *rightMoveLeft = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right);
+ rightMoveLeft->setTargetState(moveStateLeft);
+ KeyMoveTransition *leftMoveLeft = new KeyMoveTransition(this, QEvent::KeyPress,Qt::Key_Left);
+ leftMoveLeft->setTargetState(moveStateLeft);
+ KeyMoveTransition *leftMoveStop = new KeyMoveTransition(this, QEvent::KeyPress,Qt::Key_Left);
+ leftMoveStop->setTargetState(moveStateLeft);
+
+ //We set up the right move state
+ moveStateRight->addTransition(leftStopRight);
+ moveStateRight->addTransition(leftMoveRight);
+ moveStateRight->addTransition(rightMoveRight);
+ stopState->addTransition(rightMoveStop);
+
+ //We set up the left move state
+ moveStateLeft->addTransition(rightStopLeft);
+ moveStateLeft->addTransition(leftMoveLeft);
+ moveStateLeft->addTransition(rightMoveLeft);
+ stopState->addTransition(leftMoveStop);
+
+ //The animation is finished, it means we reached the border of the screen, the boat is stopped so we move to the stop state
+ moveStateLeft->addTransition(movementAnimation, SIGNAL(finished()), stopState);
+ moveStateRight->addTransition(movementAnimation, SIGNAL(finished()), stopState);
+
+ //We set up the keys for dropping bombs
+ KeyLaunchTransition *upFireLeft = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up);
+ upFireLeft->setTargetState(launchStateRight);
+ KeyLaunchTransition *upFireRight = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up);
+ upFireRight->setTargetState(launchStateRight);
+ KeyLaunchTransition *upFireStop = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up);
+ upFireStop->setTargetState(launchStateRight);
+ KeyLaunchTransition *downFireLeft = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down);
+ downFireLeft->setTargetState(launchStateLeft);
+ KeyLaunchTransition *downFireRight = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down);
+ downFireRight->setTargetState(launchStateLeft);
+ KeyLaunchTransition *downFireMove = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down);
+ downFireMove->setTargetState(launchStateLeft);
+
+ //We set up transitions for fire up
+ moveStateRight->addTransition(upFireRight);
+ moveStateLeft->addTransition(upFireLeft);
+ stopState->addTransition(upFireStop);
+
+ //We set up transitions for fire down
+ moveStateRight->addTransition(downFireRight);
+ moveStateLeft->addTransition(downFireLeft);
+ stopState->addTransition(downFireMove);
+
+ //Finally the launch state should come back to its original state
+ QHistoryState *historyState = new QHistoryState(moving);
+ launchStateLeft->addTransition(historyState);
+ launchStateRight->addTransition(historyState);
+
+ QFinalState *final = new QFinalState(machine);
+
+ //This state play the destroyed animation
+ QAnimationState *destroyedState = new QAnimationState(machine);
+ destroyedState->setAnimation(destroyAnimation);
+
+ //Play a nice animation when the boat is destroyed
+ moving->addTransition(this, SIGNAL(boatDestroyed()),destroyedState);
+
+ //Transition to final state when the destroyed animation is finished
+ destroyedState->addTransition(destroyedState, SIGNAL(animationFinished()), final);
+
+ //The machine has finished to be executed, then the boat is dead
+ connect(machine,SIGNAL(finished()),this, SIGNAL(boatExecutionFinished()));
+
+}
+
+void Boat::run()
+{
+ //We register animations
+ AnimationManager::self()->registerAnimation(movementAnimation);
+ AnimationManager::self()->registerAnimation(destroyAnimation);
+ machine->start();
+}
+
+void Boat::stop()
+{
+ movementAnimation->stop();
+ machine->stop();
+}
+
+void Boat::updateBoatMovement()
+{
+ if (speed == 0 || direction == Boat::None) {
+ movementAnimation->stop();
+ return;
+ }
+
+ movementAnimation->stop();
+ movementAnimation->setStartValue(pos());
+
+ if (direction == Boat::Left) {
+ movementAnimation->setEndValue(QPointF(0,y()));
+ movementAnimation->setDuration(x()/speed*15);
+ }
+ else /*if (direction == Boat::Right)*/ {
+ movementAnimation->setEndValue(QPointF(scene()->width()-size().width(),y()));
+ movementAnimation->setDuration((scene()->width()-size().width()-x())/speed*15);
+ }
+ movementAnimation->start();
+}
+
+void Boat::destroy()
+{
+ movementAnimation->stop();
+ emit boatDestroyed();
+}
+
+int Boat::bombsLaunched() const
+{
+ return bombsAlreadyLaunched;
+}
+
+void Boat::setBombsLaunched(int number)
+{
+ if (number > MAX_BOMB) {
+ qWarning("Boat::setBombsLaunched : It impossible to launch that number of bombs");
+ return;
+ }
+ bombsAlreadyLaunched = number;
+}
+
+int Boat::currentSpeed() const
+{
+ return speed;
+}
+
+void Boat::setCurrentSpeed(int speed)
+{
+ if (speed > 3 || speed < 0) {
+ qWarning("Boat::setCurrentSpeed: The boat can't run on that speed");
+ return;
+ }
+ this->speed = speed;
+}
+
+enum Boat::Movement Boat::currentDirection() const
+{
+ return direction;
+}
+
+void Boat::setCurrentDirection(Movement direction)
+{
+ this->direction = direction;
+}
+
+int Boat::type() const
+{
+ return Type;
+}
diff --git a/demos/sub-attaq/boat.h b/demos/sub-attaq/boat.h
new file mode 100644
index 0000000..ee29409
--- /dev/null
+++ b/demos/sub-attaq/boat.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __BOAT__H__
+#define __BOAT__H__
+
+//Qt
+#include <QtCore/QObject>
+#include <QtGui/QKeyEvent>
+
+#include <QtGui/QGraphicsWidget>
+
+class PixmapItem;
+class Bomb;
+QT_BEGIN_NAMESPACE
+class QVariantAnimation;
+class QAbstractAnimation;
+class QStateMachine;
+QT_END_NAMESPACE
+
+class Boat : public QGraphicsWidget
+{
+Q_OBJECT
+public:
+ enum Movement {
+ None = 0,
+ Left,
+ Right
+ };
+ enum { Type = UserType + 2 };
+ Boat(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
+ void destroy();
+ void run();
+ void stop();
+
+ int bombsLaunched() const;
+ void setBombsLaunched(int number);
+
+ int currentSpeed() const;
+ void setCurrentSpeed(int speed);
+
+ enum Movement currentDirection() const;
+ void setCurrentDirection(Movement direction);
+
+ void updateBoatMovement();
+
+ virtual int type() const;
+
+signals:
+ void boatDestroyed();
+ void boatExecutionFinished();
+
+private:
+ int speed;
+ int bombsAlreadyLaunched;
+ Movement direction;
+ QVariantAnimation *movementAnimation;
+ QAbstractAnimation *destroyAnimation;
+ QStateMachine *machine;
+ PixmapItem *pixmapItem;
+};
+
+#endif //__BOAT__H__
diff --git a/demos/sub-attaq/boat_p.h b/demos/sub-attaq/boat_p.h
new file mode 100644
index 0000000..086fec0
--- /dev/null
+++ b/demos/sub-attaq/boat_p.h
@@ -0,0 +1,256 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef BOAT_P_H
+#define BOAT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+//Own
+#include "bomb.h"
+#include "graphicsscene.h"
+
+// Qt
+#include <QtGui/QKeyEventTransition>
+
+static const int MAX_BOMB = 5;
+
+
+//These transtion test if we have to stop the boat (i.e current speed is 1)
+class KeyStopTransition : public QKeyEventTransition
+{
+public:
+ KeyStopTransition(Boat *boat, QEvent::Type type, int key)
+ : QKeyEventTransition(boat, type, key)
+ {
+ this->boat = boat;
+ this->key = key;
+ }
+protected:
+ virtual bool eventTest(QEvent *event)
+ {
+ Q_UNUSED(event);
+ if (!QKeyEventTransition::eventTest(event))
+ return false;
+ if (boat->currentSpeed() == 1)
+ return true;
+ else
+ return false;
+ }
+private:
+ Boat * boat;
+ int key;
+};
+
+//These transtion test if we have to move the boat (i.e current speed was 0 or another value)
+ class KeyMoveTransition : public QKeyEventTransition
+{
+public:
+ KeyMoveTransition(Boat *boat, QEvent::Type type, int key)
+ : QKeyEventTransition(boat, type, key)
+ {
+ this->boat = boat;
+ this->key = key;
+ }
+protected:
+ virtual bool eventTest(QEvent *event)
+ {
+ Q_UNUSED(event);
+ if (!QKeyEventTransition::eventTest(event))
+ return false;
+ if (boat->currentSpeed() >= 0)
+ return true;
+ else
+ return false;
+
+ }
+ void onTransition(QEvent *)
+ {
+ //We decrease the speed if needed
+ if (key == Qt::Key_Left && boat->currentDirection() == Boat::Right)
+ boat->setCurrentSpeed(boat->currentSpeed() - 1);
+ else if (key == Qt::Key_Right && boat->currentDirection() == Boat::Left)
+ boat->setCurrentSpeed(boat->currentSpeed() - 1);
+ else if (boat->currentSpeed() < 3)
+ boat->setCurrentSpeed(boat->currentSpeed() + 1);
+ boat->updateBoatMovement();
+ }
+private:
+ Boat * boat;
+ int key;
+};
+
+//This transition trigger the bombs launch
+ class KeyLaunchTransition : public QKeyEventTransition
+{
+public:
+ KeyLaunchTransition(Boat *boat, QEvent::Type type, int key)
+ : QKeyEventTransition(boat, type, key)
+ {
+ this->boat = boat;
+ this->key = key;
+ }
+protected:
+ virtual bool eventTest(QEvent *event)
+ {
+ Q_UNUSED(event);
+ if (!QKeyEventTransition::eventTest(event))
+ return false;
+ //We have enough bomb?
+ if (boat->bombsLaunched() < MAX_BOMB)
+ return true;
+ else
+ return false;
+ }
+private:
+ Boat * boat;
+ int key;
+};
+
+//This state is describing when the boat is moving right
+class MoveStateRight : public QState
+{
+public:
+ MoveStateRight(Boat *boat,QState *parent = 0) : QState(parent)
+ {
+ this->boat = boat;
+ }
+protected:
+ void onEntry(QEvent *)
+ {
+ boat->setCurrentDirection(Boat::Right);
+ boat->updateBoatMovement();
+ }
+private:
+ Boat * boat;
+};
+
+ //This state is describing when the boat is moving left
+class MoveStateLeft : public QState
+{
+public:
+ MoveStateLeft(Boat *boat,QState *parent = 0) : QState(parent)
+ {
+ this->boat = boat;
+ }
+protected:
+ void onEntry(QEvent *)
+ {
+ boat->setCurrentDirection(Boat::Left);
+ boat->updateBoatMovement();
+ }
+private:
+ Boat * boat;
+};
+
+//This state is describing when the boat is in a stand by position
+class StopState : public QState
+{
+public:
+ StopState(Boat *boat,QState *parent = 0) : QState(parent)
+ {
+ this->boat = boat;
+ }
+protected:
+ void onEntry(QEvent *)
+ {
+ boat->setCurrentSpeed(0);
+ boat->setCurrentDirection(Boat::None);
+ boat->updateBoatMovement();
+ }
+private:
+ Boat * boat;
+};
+
+//This state is describing the launch of the torpedo on the right
+class LaunchStateRight : public QState
+{
+public:
+ LaunchStateRight(Boat *boat,QState *parent = 0) : QState(parent)
+ {
+ this->boat = boat;
+ }
+protected:
+ void onEntry(QEvent *)
+ {
+ Bomb *b = new Bomb();
+ b->setPos(boat->x()+boat->size().width(),boat->y());
+ GraphicsScene *scene = static_cast<GraphicsScene *>(boat->scene());
+ scene->addItem(b);
+ b->launch(Bomb::Right);
+ boat->setBombsLaunched(boat->bombsLaunched() + 1);
+ }
+private:
+ Boat * boat;
+};
+
+//This state is describing the launch of the torpedo on the left
+class LaunchStateLeft : public QState
+{
+public:
+ LaunchStateLeft(Boat *boat,QState *parent = 0) : QState(parent)
+ {
+ this->boat = boat;
+ }
+protected:
+ void onEntry(QEvent *)
+ {
+ Bomb *b = new Bomb();
+ b->setPos(boat->x() - b->size().width(), boat->y());
+ GraphicsScene *scene = static_cast<GraphicsScene *>(boat->scene());
+ scene->addItem(b);
+ b->launch(Bomb::Left);
+ boat->setBombsLaunched(boat->bombsLaunched() + 1);
+ }
+private:
+ Boat * boat;
+};
+
+#endif // BOAT_P_H
diff --git a/demos/sub-attaq/bomb.cpp b/demos/sub-attaq/bomb.cpp
new file mode 100644
index 0000000..7eb18c3
--- /dev/null
+++ b/demos/sub-attaq/bomb.cpp
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "bomb.h"
+#include "submarine.h"
+#include "pixmapitem.h"
+#include "animationmanager.h"
+#include "qanimationstate.h"
+
+//Qt
+#include <QtCore/QSequentialAnimationGroup>
+#include <QtCore/QPropertyAnimation>
+#include <QtCore/QStateMachine>
+#include <QtCore/QFinalState>
+
+Bomb::Bomb(QGraphicsItem * parent, Qt::WindowFlags wFlags)
+ : QGraphicsWidget(parent,wFlags), launchAnimation(0)
+{
+ pixmapItem = new PixmapItem(QString("bomb"),GraphicsScene::Big, this);
+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ setFlags(QGraphicsItem::ItemIsMovable);
+ setZValue(2);
+ resize(pixmapItem->boundingRect().size());
+}
+
+void Bomb::launch(Bomb::Direction direction)
+{
+ launchAnimation = new QSequentialAnimationGroup();
+ AnimationManager::self()->registerAnimation(launchAnimation);
+ qreal delta = direction == Right ? 20 : - 20;
+ QPropertyAnimation *anim = new QPropertyAnimation(this, "pos");
+ anim->setEndValue(QPointF(x() + delta,y() - 20));
+ anim->setDuration(150);
+ launchAnimation->addAnimation(anim);
+ anim = new QPropertyAnimation(this, "pos");
+ anim->setEndValue(QPointF(x() + delta*2, y() ));
+ anim->setDuration(150);
+ launchAnimation->addAnimation(anim);
+ anim = new QPropertyAnimation(this, "pos");
+ anim->setEndValue(QPointF(x() + delta*2,scene()->height()));
+ anim->setDuration(y()/2*60);
+ launchAnimation->addAnimation(anim);
+ connect(anim,SIGNAL(valueChanged(const QVariant &)),this,SLOT(onAnimationLaunchValueChanged(const QVariant &)));
+
+ //We setup the state machine of the bomb
+ QStateMachine *machine = new QStateMachine(this);
+
+ //This state is when the launch animation is playing
+ QAnimationState *launched = new QAnimationState(machine);
+ launched->setAnimation(launchAnimation);
+
+ //End
+ QFinalState *final = new QFinalState(machine);
+
+ machine->setInitialState(launched);
+
+ //### Add a nice animation when the bomb is destroyed
+ launched->addTransition(this, SIGNAL(bombExplosed()),final);
+
+ //If the animation is finished, then we move to the final state
+ launched->addTransition(launched, SIGNAL(animationFinished()), final);
+
+ //The machine has finished to be executed, then the boat is dead
+ connect(machine,SIGNAL(finished()),this, SIGNAL(bombExecutionFinished()));
+
+ machine->start();
+
+}
+
+void Bomb::onAnimationLaunchValueChanged(const QVariant &)
+{
+ foreach (QGraphicsItem * item , collidingItems(Qt::IntersectsItemBoundingRect)) {
+ if (item->type() == SubMarine::Type) {
+ SubMarine *s = static_cast<SubMarine *>(item);
+ destroy();
+ s->destroy();
+ }
+ }
+}
+
+void Bomb::destroy()
+{
+ launchAnimation->stop();
+ emit bombExplosed();
+}
diff --git a/demos/sub-attaq/bomb.h b/demos/sub-attaq/bomb.h
new file mode 100644
index 0000000..5b31378
--- /dev/null
+++ b/demos/sub-attaq/bomb.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __BOMB__H__
+#define __BOMB__H__
+
+//Qt
+#include <QtGui/QGraphicsWidget>
+#include <QtCore/QAnimationGroup>
+
+class PixmapItem;
+
+class Bomb : public QGraphicsWidget
+{
+Q_OBJECT
+public:
+ enum Direction {
+ Left = 0,
+ Right
+ };
+ Bomb(QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0);
+ void launch(Direction direction);
+ void destroy();
+
+signals:
+ void bombExplosed();
+ void bombExecutionFinished();
+
+private slots:
+ void onAnimationLaunchValueChanged(const QVariant &);
+
+private:
+ QAnimationGroup *launchAnimation;
+ PixmapItem *pixmapItem;
+};
+
+#endif //__BOMB__H__
diff --git a/demos/sub-attaq/custompropertyanimation.cpp b/demos/sub-attaq/custompropertyanimation.cpp
new file mode 100644
index 0000000..edc10e1
--- /dev/null
+++ b/demos/sub-attaq/custompropertyanimation.cpp
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "custompropertyanimation.h"
+
+// Qt
+#include <QtCore/qdebug.h>
+
+CustomPropertyAnimation::CustomPropertyAnimation(QObject *parent) :
+ QVariantAnimation(parent), animProp(0)
+{
+}
+
+CustomPropertyAnimation::~CustomPropertyAnimation()
+{
+}
+
+void CustomPropertyAnimation::setProperty(AbstractProperty *_animProp)
+{
+ if (animProp == _animProp)
+ return;
+ delete animProp;
+ animProp = _animProp;
+}
+
+/*!
+ \reimp
+ */
+void CustomPropertyAnimation::updateCurrentValue(const QVariant &value)
+{
+ if (!animProp || state() == QAbstractAnimation::Stopped)
+ return;
+
+ animProp->write(value);
+}
+
+
+/*!
+ \reimp
+*/
+void CustomPropertyAnimation::updateState(QAbstractAnimation::State oldState, QAbstractAnimation::State newState)
+{
+ // Initialize start value
+ if (oldState == QAbstractAnimation::Stopped) {
+ if (!animProp)
+ return;
+ QVariant def = animProp->read();
+ if (def.isValid()) {
+ const int t = def.userType();
+ KeyValues values = keyValues();
+ //this ensures that all the keyValues are of type t
+ for (int i = 0; i < values.count(); ++i) {
+ QVariantAnimation::KeyValue &pair = values[i];
+ if (pair.second.userType() != t)
+ pair.second.convert(static_cast<QVariant::Type>(t));
+ }
+ //let's now update the key values
+ setKeyValues(values);
+ }
+
+ if ((animProp && !startValue().isValid() && currentTime() == 0)
+ || (currentTime() == duration() && currentLoop() == (loopCount() - 1))) {
+ setStartValue(def);
+ }
+ }
+
+ QVariantAnimation::updateState(oldState, newState);
+}
+
+#include "moc_custompropertyanimation.cpp"
diff --git a/demos/sub-attaq/custompropertyanimation.h b/demos/sub-attaq/custompropertyanimation.h
new file mode 100644
index 0000000..42af0de
--- /dev/null
+++ b/demos/sub-attaq/custompropertyanimation.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CUSTOMPROPERTYANIMATION_H
+#define CUSTOMPROPERTYANIMATION_H
+
+#include <QtCore/qvariantanimation.h>
+
+QT_BEGIN_NAMESPACE
+class QGraphicsItem;
+QT_END_NAMESPACE
+
+struct AbstractProperty
+{
+ virtual QVariant read() const = 0;
+ virtual void write(const QVariant &value) = 0;
+};
+
+
+class CustomPropertyAnimation : public QVariantAnimation
+{
+ Q_OBJECT
+
+ template <typename Target, typename T, typename T2 = T>
+ class MemberFunctionProperty : public AbstractProperty
+ {
+ public:
+ typedef T (Target::*Getter)(void) const;
+ typedef void (Target::*Setter)(T2);
+
+ MemberFunctionProperty(Target* target, Getter getter, Setter setter)
+ : m_target(target), m_getter(getter), m_setter(setter) {}
+
+ virtual void write(const QVariant &value)
+ {
+ if (m_setter) (m_target->*m_setter)(qVariantValue<T>(value));
+ }
+
+ virtual QVariant read() const
+ {
+ if (m_getter) return qVariantFromValue<T>((m_target->*m_getter)());
+ return QVariant();
+ }
+
+ private:
+ Target *m_target;
+ Getter m_getter;
+ Setter m_setter;
+ };
+
+public:
+ CustomPropertyAnimation(QObject *parent = 0);
+ ~CustomPropertyAnimation();
+
+ template<class Target, typename T>
+ void setMemberFunctions(Target* target, T (Target::*getter)() const, void (Target::*setter)(const T& ))
+ {
+ setProperty(new MemberFunctionProperty<Target, T, const T&>(target, getter, setter));
+ }
+
+ template<class Target, typename T>
+ void setMemberFunctions(Target* target, T (Target::*getter)() const, void (Target::*setter)(T))
+ {
+ setProperty(new MemberFunctionProperty<Target, T>(target, getter, setter));
+ }
+
+ void updateCurrentValue(const QVariant &value);
+ void updateState(QAbstractAnimation::State oldState, QAbstractAnimation::State newState);
+ void setProperty(AbstractProperty *animProp);
+
+private:
+ Q_DISABLE_COPY(CustomPropertyAnimation);
+ AbstractProperty *animProp;
+};
+
+#endif // CUSTOMPROPERTYANIMATION_H
diff --git a/demos/sub-attaq/data.xml b/demos/sub-attaq/data.xml
new file mode 100644
index 0000000..0f30515
--- /dev/null
+++ b/demos/sub-attaq/data.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<subattaq>
+ <submarines>
+ <submarine type="0" points="10" name="Q1" />
+ <submarine type="1" points="20" name="Q2" />
+ </submarines>
+ <levels>
+ <level id="0" name="Seaman recruit">
+ <subinstance type="0" nb="1"/>
+ </level>
+ <level id="1" name="Seaman apprentice">
+ <subinstance type="0" nb="2"/>
+ </level>
+ <level id="2" name="Seaman">
+ <subinstance type="0" nb="4"/>
+ </level>
+ <level id="3" name="Petty Officer Third Class">
+ <subinstance type="0" nb="6"/>
+ </level>
+ <level id="4" name="Petty Officer Second Class">
+ <subinstance type="0" nb="6"/>
+ </level>
+ <level id="5" name="Petty Officer First Class">
+ <subinstance type="0" nb="8"/>
+ </level>
+ <level id="6" name="Lieutenant">
+ <subinstance type="0" nb="10"/>
+ </level>
+ <level id="7" name="Commander">
+ <subinstance type="0" nb="15"/>
+ </level>
+ <level id="8" name="Captain">
+ <subinstance type="0" nb="12"/>
+ </level>
+ <level id="9" name="Admiral">
+ <subinstance type="0" nb="12"/>
+ </level>
+ </levels>
+</subattaq>
diff --git a/demos/sub-attaq/graphicsscene.cpp b/demos/sub-attaq/graphicsscene.cpp
new file mode 100644
index 0000000..79de011
--- /dev/null
+++ b/demos/sub-attaq/graphicsscene.cpp
@@ -0,0 +1,377 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "graphicsscene.h"
+#include "states.h"
+#include "boat.h"
+#include "submarine.h"
+#include "torpedo.h"
+#include "bomb.h"
+#include "pixmapitem.h"
+#include "custompropertyanimation.h"
+#include "animationmanager.h"
+#include "qanimationstate.h"
+#include "progressitem.h"
+#include "textinformationitem.h"
+
+//Qt
+#include <QtCore/QPropertyAnimation>
+#include <QtCore/QSequentialAnimationGroup>
+#include <QtCore/QParallelAnimationGroup>
+#include <QtCore/QStateMachine>
+#include <QtCore/QFinalState>
+#include <QtCore/QPauseAnimation>
+#include <QtGui/QAction>
+#include <QtCore/QDir>
+#include <QtGui/QApplication>
+#include <QtGui/QMessageBox>
+#include <QtGui/QGraphicsView>
+#include <QtGui/QGraphicsSceneMouseEvent>
+#include <QtCore/QXmlStreamReader>
+
+//helper function that creates an animation for position and inserts it into group
+static CustomPropertyAnimation *addGraphicsItemPosAnimation(QSequentialAnimationGroup *group,
+ QGraphicsItem *item, const QPointF &endPos)
+{
+ CustomPropertyAnimation *ret = new CustomPropertyAnimation(group);
+ ret->setMemberFunctions(item, &QGraphicsItem::pos, &QGraphicsItem::setPos);
+ ret->setEndValue(endPos);
+ ret->setDuration(200);
+ ret->setEasingCurve(QEasingCurve::OutElastic);
+ group->addPause(50);
+ return ret;
+}
+
+//helper function that creates an animation for opacity and inserts it into group
+static void addGraphicsItemFadeoutAnimation(QAnimationGroup *group, QGraphicsItem *item)
+{
+#if QT_VERSION >=0x040500
+ CustomPropertyAnimation *anim = new CustomPropertyAnimation(group);
+ anim->setMemberFunctions(item, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim->setDuration(800);
+ anim->setEndValue(0);
+ anim->setEasingCurve(QEasingCurve::OutQuad);
+#else
+ // work around for a bug where we don't transition if the duration is zero.
+ QtPauseAnimation *anim = new QtPauseAnimation(group);
+ anim->setDuration(1);
+#endif
+}
+
+GraphicsScene::GraphicsScene(int x, int y, int width, int height, Mode mode)
+ : QGraphicsScene(x,y,width,height), mode(mode), newAction(0), quitAction(0), boat(0)
+{
+ backgroundItem = new PixmapItem(QString("background"),mode);
+ backgroundItem->setZValue(1);
+ backgroundItem->setPos(0,0);
+ addItem(backgroundItem);
+
+ PixmapItem *surfaceItem = new PixmapItem(QString("surface"),mode);
+ surfaceItem->setZValue(3);
+ surfaceItem->setPos(0,sealLevel() - surfaceItem->boundingRect().height()/2);
+ addItem(surfaceItem);
+
+ //The item that display score and level
+ progressItem = new ProgressItem(backgroundItem);
+
+ textInformationItem = new TextInformationItem(backgroundItem);
+ textInformationItem->hide();
+ //We create the boat
+ boat = new Boat();
+ addItem(boat);
+ boat->setPos(this->width()/2, sealLevel() - boat->size().height());
+ boat->hide();
+
+ //parse the xml that contain all data of the game
+ QXmlStreamReader reader;
+ QFile file(":data.xml");
+ file.open(QIODevice::ReadOnly);
+ reader.setDevice(&file);
+ LevelDescription currentLevel;
+ while (!reader.atEnd()) {
+ reader.readNext();
+ if (reader.tokenType() == QXmlStreamReader::StartElement) {
+ if (reader.name() == "submarine")
+ {
+ SubmarineDescription desc;
+ desc.name = reader.attributes().value("name").toString();
+ desc.points = reader.attributes().value("points").toString().toInt();
+ desc.type = reader.attributes().value("type").toString().toInt();
+ submarinesData.append(desc);
+ }
+ if (reader.name() == "level")
+ {
+ currentLevel.id = reader.attributes().value("id").toString().toInt();
+ currentLevel.name = reader.attributes().value("name").toString();
+ }
+ if (reader.name() == "subinstance")
+ {
+ currentLevel.submarines.append(qMakePair(reader.attributes().value("type").toString().toInt(),reader.attributes().value("nb").toString().toInt()));
+ }
+ }
+ if (reader.tokenType() == QXmlStreamReader::EndElement) {
+ if (reader.name() == "level")
+ {
+ levelsData.insert(currentLevel.id,currentLevel);
+ currentLevel.submarines.clear();
+ }
+ }
+ }
+}
+
+qreal GraphicsScene::sealLevel() const
+{
+ if (mode == Big)
+ return 220;
+ else
+ return 160;
+}
+
+void GraphicsScene::setupScene(const QList<QAction *> &actions)
+{
+ newAction = actions.at(0);
+ quitAction = actions.at(1);
+
+ QGraphicsItem *logo_s = addWelcomeItem(QPixmap(":/logo-s"));
+ QGraphicsItem *logo_u = addWelcomeItem(QPixmap(":/logo-u"));
+ QGraphicsItem *logo_b = addWelcomeItem(QPixmap(":/logo-b"));
+ QGraphicsItem *logo_dash = addWelcomeItem(QPixmap(":/logo-dash"));
+ QGraphicsItem *logo_a = addWelcomeItem(QPixmap(":/logo-a"));
+ QGraphicsItem *logo_t = addWelcomeItem(QPixmap(":/logo-t"));
+ QGraphicsItem *logo_t2 = addWelcomeItem(QPixmap(":/logo-t2"));
+ QGraphicsItem *logo_a2 = addWelcomeItem(QPixmap(":/logo-a2"));
+ QGraphicsItem *logo_q = addWelcomeItem(QPixmap(":/logo-q"));
+ QGraphicsItem *logo_excl = addWelcomeItem(QPixmap(":/logo-excl"));
+ logo_s->setZValue(3);
+ logo_u->setZValue(4);
+ logo_b->setZValue(5);
+ logo_dash->setZValue(6);
+ logo_a->setZValue(7);
+ logo_t->setZValue(8);
+ logo_t2->setZValue(9);
+ logo_a2->setZValue(10);
+ logo_q->setZValue(11);
+ logo_excl->setZValue(12);
+ logo_s->setPos(QPointF(-1000, -1000));
+ logo_u->setPos(QPointF(-800, -1000));
+ logo_b->setPos(QPointF(-600, -1000));
+ logo_dash->setPos(QPointF(-400, -1000));
+ logo_a->setPos(QPointF(1000, 2000));
+ logo_t->setPos(QPointF(800, 2000));
+ logo_t2->setPos(QPointF(600, 2000));
+ logo_a2->setPos(QPointF(400, 2000));
+ logo_q->setPos(QPointF(200, 2000));
+ logo_excl->setPos(QPointF(0, 2000));
+
+ QSequentialAnimationGroup * lettersGroupMoving = new QSequentialAnimationGroup(this);
+ QParallelAnimationGroup * lettersGroupFading = new QParallelAnimationGroup(this);
+
+ //creation of the animations for moving letters
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_s, QPointF(300, 150));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_u, QPointF(350, 150));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_b, QPointF(400, 120));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_dash, QPointF(460, 150));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_a, QPointF(350, 250));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_t, QPointF(400, 250));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_t2, QPointF(430, 250));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_a2, QPointF(465, 250));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_q, QPointF(510, 250));
+ addGraphicsItemPosAnimation(lettersGroupMoving, logo_excl, QPointF(570, 220));
+
+ //creation of the animations for fading out the letters
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_s);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_u);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_b);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_dash);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_a);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_t);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_t2);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_a2);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_q);
+ addGraphicsItemFadeoutAnimation(lettersGroupFading, logo_excl);
+ connect(lettersGroupFading, SIGNAL(finished()), this, SLOT(onIntroAnimationFinished()));
+
+ QStateMachine *machine = new QStateMachine(this);
+
+ //This state is when the player is playing
+ PlayState *gameState = new PlayState(this,machine);
+
+ //Final state
+ QFinalState *final = new QFinalState(machine);
+
+ //Animation when the player enter in the game
+ QAnimationState *lettersMovingState = new QAnimationState(machine);
+ lettersMovingState->setAnimation(lettersGroupMoving);
+
+ //Animation when the welcome screen disappear
+ QAnimationState *lettersFadingState = new QAnimationState(machine);
+ lettersFadingState->setAnimation(lettersGroupFading);
+
+ //if new game then we fade out the welcome screen and start playing
+ lettersMovingState->addTransition(newAction, SIGNAL(triggered()), lettersFadingState);
+ lettersFadingState->addTransition(lettersFadingState, SIGNAL(animationFinished()), gameState);
+
+ //New Game is triggered then player start playing
+ gameState->addTransition(newAction, SIGNAL(triggered()), gameState);
+
+ //Wanna quit, then connect to CTRL+Q
+ gameState->addTransition(quitAction, SIGNAL(triggered()), final);
+ lettersMovingState->addTransition(quitAction, SIGNAL(triggered()), final);
+
+ //Welcome screen is the initial state
+ machine->setInitialState(lettersMovingState);
+
+ machine->start();
+
+ //We reach the final state, then we quit
+ connect(machine,SIGNAL(finished()),this, SLOT(onQuitGameTriggered()));
+}
+
+void GraphicsScene::addItem(Bomb *bomb)
+{
+ bombs.insert(bomb);
+ connect(bomb,SIGNAL(bombExecutionFinished()),this, SLOT(onBombExecutionFinished()));
+ QGraphicsScene::addItem(bomb);
+}
+
+void GraphicsScene::addItem(Torpedo *torpedo)
+{
+ torpedos.insert(torpedo);
+ connect(torpedo,SIGNAL(torpedoExecutionFinished()),this, SLOT(onTorpedoExecutionFinished()));
+ QGraphicsScene::addItem(torpedo);
+}
+
+void GraphicsScene::addItem(SubMarine *submarine)
+{
+ submarines.insert(submarine);
+ connect(submarine,SIGNAL(subMarineExecutionFinished()),this, SLOT(onSubMarineExecutionFinished()));
+ QGraphicsScene::addItem(submarine);
+}
+
+void GraphicsScene::addItem(QGraphicsItem *item)
+{
+ QGraphicsScene::addItem(item);
+}
+
+void GraphicsScene::mousePressEvent (QGraphicsSceneMouseEvent * event)
+{
+ event->ignore();
+}
+
+void GraphicsScene::onQuitGameTriggered()
+{
+ qApp->closeAllWindows();
+}
+
+void GraphicsScene::onBombExecutionFinished()
+{
+ Bomb *bomb = qobject_cast<Bomb *>(sender());
+ bombs.remove(bomb);
+ bomb->deleteLater();
+ if (boat)
+ boat->setBombsLaunched(boat->bombsLaunched() - 1);
+}
+
+void GraphicsScene::onTorpedoExecutionFinished()
+{
+ Torpedo *torpedo = qobject_cast<Torpedo *>(sender());
+ torpedos.remove(torpedo);
+ torpedo->deleteLater();
+}
+
+void GraphicsScene::onSubMarineExecutionFinished()
+{
+ SubMarine *submarine = qobject_cast<SubMarine *>(sender());
+ submarines.remove(submarine);
+ if (submarines.count() == 0) {
+ emit allSubMarineDestroyed(submarine->points());
+ } else {
+ emit subMarineDestroyed(submarine->points());
+ }
+ submarine->deleteLater();
+}
+
+int GraphicsScene::remainingSubMarines() const
+{
+ return submarines.count();
+}
+
+void GraphicsScene::clearScene()
+{
+ foreach (SubMarine *sub,submarines) {
+ sub->destroy();
+ sub->deleteLater();
+ }
+
+ foreach (Torpedo *torpedo,torpedos) {
+ torpedo->destroy();
+ torpedo->deleteLater();
+ }
+
+ foreach (Bomb *bomb,bombs) {
+ bomb->destroy();
+ bomb->deleteLater();
+ }
+
+ submarines.clear();
+ bombs.clear();
+ torpedos.clear();
+
+ AnimationManager::self()->unregisterAllAnimations();
+
+ boat->stop();
+ boat->hide();
+}
+
+QGraphicsPixmapItem *GraphicsScene::addWelcomeItem(const QPixmap &pm)
+{
+ QGraphicsPixmapItem *item = addPixmap(pm);
+ welcomeItems << item;
+ return item;
+}
+
+void GraphicsScene::onIntroAnimationFinished()
+{
+ qDeleteAll(welcomeItems);
+ welcomeItems.clear();
+}
+
diff --git a/demos/sub-attaq/graphicsscene.h b/demos/sub-attaq/graphicsscene.h
new file mode 100644
index 0000000..8fa62f7
--- /dev/null
+++ b/demos/sub-attaq/graphicsscene.h
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __GRAPHICSSCENE__H__
+#define __GRAPHICSSCENE__H__
+
+//Qt
+#include <QtGui/QGraphicsScene>
+#include <QtCore/QSet>
+#include <QtCore/QState>
+
+
+class Boat;
+class SubMarine;
+class Torpedo;
+class Bomb;
+class PixmapItem;
+class ProgressItem;
+class TextInformationItem;
+QT_BEGIN_NAMESPACE
+class QAction;
+QT_END_NAMESPACE
+
+class GraphicsScene : public QGraphicsScene
+{
+Q_OBJECT
+public:
+ enum Mode {
+ Big = 0,
+ Small
+ };
+
+ struct SubmarineDescription {
+ int type;
+ int points;
+ QString name;
+ };
+
+ struct LevelDescription {
+ int id;
+ QString name;
+ QList<QPair<int,int> > submarines;
+ };
+
+ GraphicsScene(int x, int y, int width, int height, Mode mode = Big);
+ qreal sealLevel() const;
+ void setupScene(const QList<QAction *> &actions);
+ void addItem(Bomb *bomb);
+ void addItem(Torpedo *torpedo);
+ void addItem(SubMarine *submarine);
+ void addItem(QGraphicsItem *item);
+ int remainingSubMarines() const;
+ void clearScene();
+ QGraphicsPixmapItem *addWelcomeItem(const QPixmap &pm);
+
+signals:
+ void subMarineDestroyed(int);
+ void allSubMarineDestroyed(int);
+
+protected:
+ void mousePressEvent (QGraphicsSceneMouseEvent * event);
+
+private slots:
+ void onQuitGameTriggered();
+ void onBombExecutionFinished();
+ void onTorpedoExecutionFinished();
+ void onSubMarineExecutionFinished();
+ void onIntroAnimationFinished();
+
+private:
+ Mode mode;
+ PixmapItem *backgroundItem;
+ ProgressItem *progressItem;
+ TextInformationItem *textInformationItem;
+ QAction * newAction;
+ QAction * quitAction;
+ Boat *boat;
+ QSet<SubMarine *> submarines;
+ QSet<Bomb *> bombs;
+ QSet<Torpedo *> torpedos;
+ QVector<QGraphicsPixmapItem *> welcomeItems;
+ QVector<SubmarineDescription> submarinesData;
+ QHash<int, LevelDescription> levelsData;
+
+ friend class PauseState;
+ friend class PlayState;
+ friend class LevelState;
+ friend class LostState;
+ friend class WinState;
+ friend class WinTransition;
+ friend class UpdateScoreTransition;
+};
+
+#endif //__GRAPHICSSCENE__H__
+
diff --git a/demos/sub-attaq/main.cpp b/demos/sub-attaq/main.cpp
new file mode 100644
index 0000000..fc74471
--- /dev/null
+++ b/demos/sub-attaq/main.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "mainwindow.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+ Q_INIT_RESOURCE(subattaq);
+
+ qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
+
+ MainWindow w;
+ w.show();
+
+ return app.exec();
+}
diff --git a/demos/sub-attaq/mainwindow.cpp b/demos/sub-attaq/mainwindow.cpp
new file mode 100644
index 0000000..5e54af1
--- /dev/null
+++ b/demos/sub-attaq/mainwindow.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "mainwindow.h"
+#include "graphicsscene.h"
+
+//Qt
+#include <QGraphicsView>
+
+#ifdef QT_NO_OPENGL
+ #include <QtGui/QMenuBar>
+ #include <QtGui/QLayout>
+ #include <QtGui/QApplication>
+#else
+ #include <QtOpenGL/QtOpenGL>
+#endif
+
+MainWindow::MainWindow() : QMainWindow(0)
+{
+ QMenuBar *menuBar = new QMenuBar;
+ QMenu *file = new QMenu(tr("&File"),menuBar);
+
+ QAction *newAction = new QAction(tr("New Game"),file);
+ newAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));
+ file->addAction(newAction);
+ QAction *quitAction = new QAction(tr("Quit"),file);
+ quitAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q));
+ file->addAction(quitAction);
+
+ menuBar->addMenu(file);
+ setMenuBar(menuBar);
+
+ QStringList list = QApplication::arguments();
+ if (list.contains("-fullscreen")) {
+ scene = new GraphicsScene(0, 0, 750, 400,GraphicsScene::Small);
+ setWindowState(Qt::WindowFullScreen);
+ } else {
+ scene = new GraphicsScene(0, 0, 880, 630);
+ layout()->setSizeConstraint(QLayout::SetFixedSize);
+ }
+
+ view = new QGraphicsView(scene,this);
+ view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
+ QList<QAction *> actions;
+ actions << newAction << quitAction;
+ scene->setupScene(actions);
+#ifndef QT_NO_OPENGL
+ view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
+#endif
+
+ setCentralWidget(view);
+
+}
+
+MainWindow::~MainWindow()
+{
+}
+
diff --git a/demos/sub-attaq/mainwindow.h b/demos/sub-attaq/mainwindow.h
new file mode 100644
index 0000000..b961d2b
--- /dev/null
+++ b/demos/sub-attaq/mainwindow.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __MAINWINDOW__H__
+#define __MAINWINDOW__H__
+
+//Qt
+#include <QtGui/QMainWindow>
+class GraphicsScene;
+QT_BEGIN_NAMESPACE
+class QGraphicsView;
+QT_END_NAMESPACE
+
+class MainWindow : public QMainWindow
+{
+Q_OBJECT
+public:
+ MainWindow();
+ ~MainWindow();
+
+private:
+ GraphicsScene *scene;
+ QGraphicsView *view;
+};
+
+#endif //__MAINWINDOW__H__
diff --git a/demos/sub-attaq/pics/big/background.png b/demos/sub-attaq/pics/big/background.png
new file mode 100644
index 0000000..9f58157
--- /dev/null
+++ b/demos/sub-attaq/pics/big/background.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/boat.png b/demos/sub-attaq/pics/big/boat.png
new file mode 100644
index 0000000..be82dff
--- /dev/null
+++ b/demos/sub-attaq/pics/big/boat.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/bomb.png b/demos/sub-attaq/pics/big/bomb.png
new file mode 100644
index 0000000..3af5f2f
--- /dev/null
+++ b/demos/sub-attaq/pics/big/bomb.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/explosion/boat/step1.png b/demos/sub-attaq/pics/big/explosion/boat/step1.png
new file mode 100644
index 0000000..c9fd8b0
--- /dev/null
+++ b/demos/sub-attaq/pics/big/explosion/boat/step1.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/explosion/boat/step2.png b/demos/sub-attaq/pics/big/explosion/boat/step2.png
new file mode 100644
index 0000000..7528f2d
--- /dev/null
+++ b/demos/sub-attaq/pics/big/explosion/boat/step2.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/explosion/boat/step3.png b/demos/sub-attaq/pics/big/explosion/boat/step3.png
new file mode 100644
index 0000000..aae9c9c
--- /dev/null
+++ b/demos/sub-attaq/pics/big/explosion/boat/step3.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/explosion/boat/step4.png b/demos/sub-attaq/pics/big/explosion/boat/step4.png
new file mode 100644
index 0000000..d697c1b
--- /dev/null
+++ b/demos/sub-attaq/pics/big/explosion/boat/step4.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/explosion/submarine/step1.png b/demos/sub-attaq/pics/big/explosion/submarine/step1.png
new file mode 100644
index 0000000..88ca514
--- /dev/null
+++ b/demos/sub-attaq/pics/big/explosion/submarine/step1.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/explosion/submarine/step2.png b/demos/sub-attaq/pics/big/explosion/submarine/step2.png
new file mode 100644
index 0000000..524f589
--- /dev/null
+++ b/demos/sub-attaq/pics/big/explosion/submarine/step2.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/explosion/submarine/step3.png b/demos/sub-attaq/pics/big/explosion/submarine/step3.png
new file mode 100644
index 0000000..2cca1e8
--- /dev/null
+++ b/demos/sub-attaq/pics/big/explosion/submarine/step3.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/explosion/submarine/step4.png b/demos/sub-attaq/pics/big/explosion/submarine/step4.png
new file mode 100644
index 0000000..82100a8
--- /dev/null
+++ b/demos/sub-attaq/pics/big/explosion/submarine/step4.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/submarine.png b/demos/sub-attaq/pics/big/submarine.png
new file mode 100644
index 0000000..df435dc
--- /dev/null
+++ b/demos/sub-attaq/pics/big/submarine.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/surface.png b/demos/sub-attaq/pics/big/surface.png
new file mode 100644
index 0000000..4eba29e
--- /dev/null
+++ b/demos/sub-attaq/pics/big/surface.png
Binary files differ
diff --git a/demos/sub-attaq/pics/big/torpedo.png b/demos/sub-attaq/pics/big/torpedo.png
new file mode 100644
index 0000000..f9c2687
--- /dev/null
+++ b/demos/sub-attaq/pics/big/torpedo.png
Binary files differ
diff --git a/demos/sub-attaq/pics/scalable/background-n810.svg b/demos/sub-attaq/pics/scalable/background-n810.svg
new file mode 100644
index 0000000..ece9f7a
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/background-n810.svg
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2588"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="background-n810.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <metadata
+ id="metadata28">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:window-height="1141"
+ inkscape:window-width="1920"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="1.2399902"
+ inkscape:cx="375"
+ inkscape:cy="461.074"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs2590">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective30" />
+ <linearGradient
+ id="linearGradient3746">
+ <stop
+ id="stop3748"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3750"
+ style="stop-color:#0074b7;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="82.966125"
+ cy="-178.42453"
+ r="526.79456"
+ fx="82.966125"
+ fy="-178.42453"
+ id="radialGradient3880"
+ xlink:href="#linearGradient3746"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4952094,0.2388475,-0.1040669,0.3734391,-208.61982,418.216)" />
+ <linearGradient
+ id="linearGradient3624">
+ <stop
+ id="stop3626"
+ style="stop-color:#3a8daf;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3636"
+ style="stop-color:#252525;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="552.98486"
+ y1="390.56842"
+ x2="549.39465"
+ y2="702.3479"
+ id="linearGradient3630"
+ xlink:href="#linearGradient3624"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3373776,0,0,1.186038,-986.88716,67.776416)" />
+ <linearGradient
+ id="linearGradient3816">
+ <stop
+ id="stop3818"
+ style="stop-color:#ad8b00;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3820"
+ style="stop-color:#ad8b00;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="573"
+ y1="755.46222"
+ x2="573"
+ y2="700.13464"
+ id="linearGradient3826"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2561681,-151.5,-34.518664)" />
+ <linearGradient
+ id="linearGradient5097">
+ <stop
+ id="stop5099"
+ style="stop-color:#19a2db;stop-opacity:0"
+ offset="0" />
+ <stop
+ id="stop5109"
+ style="stop-color:#1379a7;stop-opacity:0.49803922"
+ offset="0.30000001" />
+ <stop
+ id="stop5101"
+ style="stop-color:#0e5173;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="590.84674"
+ y1="274.57559"
+ x2="590.84674"
+ y2="334.01376"
+ id="linearGradient5103"
+ xlink:href="#linearGradient5097"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-151.5,156.75229)"
+ spreadMethod="pad" />
+ </defs>
+ <g
+ id="layer1">
+ <rect
+ width="1053.5891"
+ height="206.64989"
+ x="-151.79456"
+ y="330.16019"
+ id="rect3638"
+ style="opacity:1;fill:url(#radialGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.1880002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="1054.4708"
+ height="364.81519"
+ x="-152.23541"
+ y="533.48895"
+ id="rect3622"
+ style="opacity:1;fill:url(#linearGradient3630);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13464069;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -152.5,877.11847 C 120.5,865.81296 -202.86309,769.3663 109.5,871.29717 C 172.96247,892.00636 243.5,872.55334 297.5,871.29717 C 351.5,870.041 311.5,859.80335 358.5,876.13354 C 405.5,892.46372 553.5,861.09903 598.5,854.8182 C 643.5,848.53736 756.5,841.79698 795.5,853.10249 C 834.5,864.408 904.5,866.2725 904.5,866.2725 L 901.5,903.95754 L -154.5,902.70137 L -152.5,877.11847 z"
+ id="path3814"
+ style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="M 902.20121,894.16261 C 632.01828,889.43035 756.73005,860.2801 614.20403,894.1311 C 596.58819,898.315 408.23621,883.21212 400.43291,894.1311 C 376.86263,927.11261 75.265447,868.1243 34.250926,886.79082 C 31.281885,888.14209 12.514878,884.22134 -12.264082,889.72008 C -48.555335,897.77353 -64.717178,885.62471 -103.31472,890.35697 C -141.91229,895.08922 -145.87102,891.93439 -145.87102,891.93439 L -152.79879,903.10131 L 892.3044,902.5755 L 902.20121,894.16261 z"
+ id="path3828"
+ style="fill:#ad8b00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/background.svg b/demos/sub-attaq/pics/scalable/background.svg
new file mode 100644
index 0000000..0be2680
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/background.svg
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2588"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="background.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <metadata
+ id="metadata28">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:window-height="1141"
+ inkscape:window-width="1920"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="0.93884027"
+ inkscape:cx="473.72605"
+ inkscape:cy="538.63678"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs2590">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective30" />
+ <linearGradient
+ id="linearGradient3746">
+ <stop
+ id="stop3748"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3750"
+ style="stop-color:#0074b7;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="82.966125"
+ cy="-178.42453"
+ r="526.79456"
+ fx="82.966125"
+ fy="-178.42453"
+ id="radialGradient3880"
+ xlink:href="#linearGradient3746"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4952094,0.3367191,-0.1040669,0.5264617,-208.61982,282.52272)" />
+ <linearGradient
+ id="linearGradient3624">
+ <stop
+ id="stop3626"
+ style="stop-color:#3a8daf;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3636"
+ style="stop-color:#252525;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="552.98486"
+ y1="390.56842"
+ x2="549.39465"
+ y2="702.3479"
+ id="linearGradient3630"
+ xlink:href="#linearGradient3624"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3373776,0,0,1.5004634,-986.88716,-154.07447)" />
+ <linearGradient
+ id="linearGradient3816">
+ <stop
+ id="stop3818"
+ style="stop-color:#ad8b00;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3820"
+ style="stop-color:#ad8b00;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="573"
+ y1="755.46222"
+ x2="573"
+ y2="700.13464"
+ id="linearGradient3826"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6033628,-151.5,-294.0167)" />
+ <linearGradient
+ id="linearGradient5097">
+ <stop
+ id="stop5099"
+ style="stop-color:#19a2db;stop-opacity:0"
+ offset="0" />
+ <stop
+ id="stop5109"
+ style="stop-color:#1379a7;stop-opacity:0.49803922"
+ offset="0.30000001" />
+ <stop
+ id="stop5101"
+ style="stop-color:#0e5173;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="590.84674"
+ y1="274.57559"
+ x2="590.84674"
+ y2="334.01376"
+ id="linearGradient5103"
+ xlink:href="#linearGradient5097"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-151.5,156.75229)"
+ spreadMethod="pad" />
+ </defs>
+ <g
+ id="layer1">
+ <rect
+ width="1053.5891"
+ height="291.32797"
+ x="-151.79456"
+ y="158.38464"
+ id="rect3638"
+ style="opacity:1;fill:url(#radialGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.1880002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="1054.4708"
+ height="461.52972"
+ x="-152.23541"
+ y="435.10107"
+ id="rect3622"
+ style="opacity:1;fill:url(#linearGradient3630);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13464069;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -152.5,869.5896 C 120.5,855.15934 -202.86309,732.0556 109.5,862.15934 C 172.96247,888.59238 243.5,863.7627 297.5,862.15934 C 351.5,860.55598 311.5,847.48872 358.5,868.33244 C 405.5,889.17615 553.5,849.14252 598.5,841.12571 C 643.5,833.1089 756.5,824.50553 795.5,838.9358 C 834.5,853.36606 904.5,855.74589 904.5,855.74589 L 901.5,903.84677 L -154.5,902.24341 L -152.5,869.5896 z"
+ id="path3814"
+ style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="M 902.20121,891.3446 C 632.01828,885.30439 756.73005,848.09724 614.20403,891.30439 C 596.58819,896.64468 408.23621,877.36748 400.43291,891.30439 C 376.86263,933.40172 75.265447,858.10952 34.250926,881.93531 C 31.281885,883.66006 12.514878,878.65564 -12.264082,885.67419 C -48.555335,895.95355 -64.717178,880.4469 -103.31472,886.48711 C -141.91229,892.52732 -145.87102,888.50052 -145.87102,888.50052 L -152.79879,902.75389 L 892.3044,902.08275 L 902.20121,891.3446 z"
+ id="path3828"
+ style="fill:#ad8b00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/boat.svg b/demos/sub-attaq/pics/scalable/boat.svg
new file mode 100644
index 0000000..5298821b
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/boat.svg
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2584">
+ <defs
+ id="defs2666">
+ <linearGradient
+ x1="542.5"
+ y1="222.59448"
+ x2="559"
+ y2="222.59448"
+ id="linearGradient3387"
+ xlink:href="#linearGradient3746"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-110.6791,190.19124)" />
+ <linearGradient
+ id="linearGradient3167">
+ <stop
+ id="stop3169"
+ style="stop-color:#464646;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3345"
+ style="stop-color:#848788;stop-opacity:1"
+ offset="0.44021741" />
+ <stop
+ id="stop3347"
+ style="stop-color:#9ca0a2;stop-opacity:1"
+ offset="0.56799388" />
+ <stop
+ id="stop3171"
+ style="stop-color:#b5babd;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="474.23065"
+ y1="229.92336"
+ x2="474.1944"
+ y2="218.27365"
+ id="linearGradient3416"
+ xlink:href="#linearGradient3167"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-125.98032,185.95625)" />
+ <linearGradient
+ id="linearGradient3692">
+ <stop
+ id="stop3694"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3696"
+ style="stop-color:#b6b6b6;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="573.5"
+ y1="244.2056"
+ x2="578.25"
+ y2="216.9556"
+ id="linearGradient3972"
+ xlink:href="#linearGradient3692"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-126.5541,188.56624)" />
+ <linearGradient
+ id="linearGradient3438">
+ <stop
+ id="stop3440"
+ style="stop-color:#939393;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3444"
+ style="stop-color:#d6d6d6;stop-opacity:1"
+ offset="0.12354442" />
+ <stop
+ id="stop3446"
+ style="stop-color:#dadada;stop-opacity:1"
+ offset="0.74055624" />
+ <stop
+ id="stop3442"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="660.29303"
+ y1="256.53284"
+ x2="444.79303"
+ y2="255.62085"
+ id="linearGradient3948"
+ xlink:href="#linearGradient3438"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-126.5541,185.56624)" />
+ <linearGradient
+ x1="542.5"
+ y1="222.59448"
+ x2="559"
+ y2="222.59448"
+ id="linearGradient3990"
+ xlink:href="#linearGradient3746"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-132.8041,190.19124)" />
+ <linearGradient
+ id="linearGradient3746">
+ <stop
+ id="stop3748"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3750"
+ style="stop-color:#0074b7;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="542.5"
+ y1="222.59448"
+ x2="559"
+ y2="222.59448"
+ id="linearGradient3994"
+ xlink:href="#linearGradient3746"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-88.054101,190.19124)" />
+ <linearGradient
+ id="linearGradient3428">
+ <stop
+ id="stop3430"
+ style="stop-color:#464646;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3432"
+ style="stop-color:#848788;stop-opacity:1"
+ offset="0.18306103" />
+ <stop
+ id="stop3434"
+ style="stop-color:#9ca0a2;stop-opacity:1"
+ offset="0.66368055" />
+ <stop
+ id="stop3436"
+ style="stop-color:#b5babd;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="592.92798"
+ y1="199.43727"
+ x2="557.05743"
+ y2="196.5448"
+ id="linearGradient3426"
+ xlink:href="#linearGradient3428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-102.5217,149.09845)" />
+ </defs>
+ <g
+ id="layer1">
+ <g
+ id="boat">
+ <path
+ d="M 296.669,434.15623 C 376.12538,436.50959 448.282,436.46711 542.42304,434.15623 C 542.42304,434.15623 544.22253,425.03531 542.42304,422.57953 C 432.90655,403.86953 296.669,418.12547 296.669,422.57953 L 296.669,434.15623 z"
+ id="path3469"
+ style="fill:#a9a9a9;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3.4975698;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <rect
+ width="3.4280596"
+ height="29.611124"
+ x="647.59613"
+ y="173.91156"
+ transform="matrix(0.9327494,0.3605254,-0.3633626,0.9316478,0,0)"
+ id="rect3408"
+ style="opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="48.499989"
+ height="8.5"
+ x="318.48221"
+ y="405.82172"
+ transform="matrix(0.9999952,3.0887777e-3,-3.0887777e-3,0.9999952,0,0)"
+ id="rect3376"
+ style="opacity:1;fill:url(#linearGradient3416);fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:2.99999928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 382.4459,430.66072 C 382.4459,430.66072 420.85999,388.74829 397.4459,385.66072 L 488.4459,397.66072 L 488.4459,432.66072 L 382.4459,430.66072 z"
+ id="path3952"
+ style="fill:url(#linearGradient3972);fill-opacity:1;fill-rule:evenodd;stroke:#323232;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 301.4459,429.66072 C 301.4459,429.66072 330.46329,468.66072 343.4459,468.66072 C 355.42851,471.91072 507.57644,473.70653 525.4459,465.91072 C 534.58031,461.59104 537.90602,455.58662 539.4459,429.66072 C 473.70193,439.43306 371.2651,439.78219 301.4459,429.66072 z"
+ id="path3938"
+ style="fill:url(#linearGradient3948);fill-opacity:1;fill-rule:evenodd;stroke:#545454;stroke-width:3.0999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 339.44863,416.12222 L 357.69854,416.17859 L 368.1622,427.96097 L 339.41234,427.87217 L 339.44863,416.12222 z"
+ id="rect3378"
+ style="fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <rect
+ width="13.5"
+ height="17"
+ x="411.19589"
+ y="404.28574"
+ id="rect3974"
+ style="opacity:1;fill:url(#linearGradient3990);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="13.5"
+ height="17"
+ x="455.94589"
+ y="404.28574"
+ id="rect3992"
+ style="opacity:1;fill:url(#linearGradient3994);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 295.6959,421.91072 C 360.77923,430.41072 446.61257,432.91072 541.9459,421.91072 C 541.9459,421.91072 543.74902,428.6076 541.9459,430.41072 C 432.20839,444.14823 295.6959,433.68104 295.6959,430.41072 L 295.6959,421.91072 z"
+ id="rect2558"
+ style="fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <rect
+ width="94.427879"
+ height="7.236649"
+ x="437.10614"
+ y="342.2645"
+ transform="matrix(0.9947793,0.1020501,-0.1079723,0.9941539,0,0)"
+ id="rect2569"
+ style="opacity:1;fill:#c1c1c1;fill-opacity:1;fill-rule:nonzero;stroke:#404040;stroke-width:3.0365274;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="13.5"
+ height="17"
+ x="433.32089"
+ y="404.28574"
+ id="rect3385"
+ style="opacity:1;fill:url(#linearGradient3387);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 402.86916,380.21847 L 489.80407,388.85485 L 491.52271,394.54919 L 397.58781,384.91281 L 402.86916,380.21847 z"
+ id="rect3466"
+ style="fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#404040;stroke-width:3.03650045;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <rect
+ width="34.5"
+ height="14.5"
+ x="456.4783"
+ y="336.94293"
+ transform="matrix(0.997157,7.5351915e-2,-7.5351915e-2,0.997157,0,0)"
+ id="rect3418"
+ style="opacity:1;fill:url(#linearGradient3426);fill-opacity:1;fill-rule:nonzero;stroke:#494949;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <g
+ transform="matrix(0.9246214,0.3808874,-0.3808874,0.9246214,-13.252851,-40.129692)"
+ id="flag">
+ <rect
+ width="19.75"
+ height="27.75"
+ x="193.34448"
+ y="-709"
+ transform="matrix(0,1,-1,0,0,0)"
+ id="rect3389"
+ style="opacity:1;fill:#b20000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="27.25"
+ height="5.75"
+ x="681.5"
+ y="200.59448"
+ id="rect3393"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="5.75"
+ height="19.5"
+ x="691.25"
+ y="193.59448"
+ id="rect3395"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="27.75"
+ height="2.5"
+ x="681.5"
+ y="202.34448"
+ id="rect3397"
+ style="opacity:1;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ width="3"
+ height="19.25"
+ x="692.5"
+ y="193.59448"
+ id="rect3399"
+ style="opacity:1;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/bomb.svg b/demos/sub-attaq/pics/scalable/bomb.svg
new file mode 100644
index 0000000..294771a
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/bomb.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg3121">
+ <defs
+ id="defs3123">
+ <radialGradient
+ cx="-135.625"
+ cy="148.71948"
+ r="7.625"
+ fx="-135.625"
+ fy="148.71948"
+ id="radialGradient3439"
+ xlink:href="#linearGradient3366"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="-132.85063"
+ y1="173.6969"
+ x2="-145.3662"
+ y2="177.59828"
+ id="linearGradient3418"
+ xlink:href="#linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.2134297,-0.5943658,0.6658882,-0.2391126,-274.53441,123.00067)" />
+ <linearGradient
+ x1="-141.85466"
+ y1="181.49153"
+ x2="-144.95044"
+ y2="175.90179"
+ id="linearGradient3414"
+ xlink:href="#linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2134297,-0.5943658,-0.6658882,-0.2391126,-15.893355,122.67824)" />
+ <linearGradient
+ x1="-149.5"
+ y1="177.59448"
+ x2="-145.7928"
+ y2="180.05936"
+ id="linearGradient3410"
+ xlink:href="#linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6315243,0,0,0.7075182,-227.03781,54.321514)" />
+ <linearGradient
+ x1="-140.46242"
+ y1="177.40488"
+ x2="-147.04802"
+ y2="172.66473"
+ id="linearGradient3406"
+ xlink:href="#linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6315243,0,0,-0.7075182,-226.40365,274.91611)" />
+ <linearGradient
+ x1="-147.2406"
+ y1="180.95567"
+ x2="-140.01878"
+ y2="175.57777"
+ id="linearGradient3402"
+ xlink:href="#linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6315243,0,0,-0.7075182,-64.045217,275.07466)" />
+ <linearGradient
+ x1="-146.98956"
+ y1="174.00922"
+ x2="-142.60332"
+ y2="179.38712"
+ id="linearGradient3398"
+ xlink:href="#linearGradient3366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6315243,0,0,0.7075182,-62.683611,54.187362)" />
+ <linearGradient
+ id="linearGradient3366">
+ <stop
+ id="stop3368"
+ style="stop-color:#bcbcbc;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3370"
+ style="stop-color:#191b1c;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="-208.95004"
+ cy="173.10576"
+ r="31.667252"
+ fx="-208.95004"
+ fy="173.10576"
+ id="radialGradient3364"
+ xlink:href="#linearGradient3366"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <g
+ id="layer1">
+ <g
+ transform="translate(419.4996,488.13454)"
+ id="mine">
+ <path
+ d="M -167.5843,186.54079 A 31.466251,31.466251 0 1 1 -230.5168,186.54079 A 31.466251,31.466251 0 1 1 -167.5843,186.54079 z"
+ transform="matrix(0.6341613,0,0,0.6341613,-18.521242,45.718192)"
+ id="path2586"
+ style="opacity:1;fill:url(#radialGradient3364);fill-opacity:1;stroke:#131313;stroke-width:3.54799318;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -155.20193,175.4167 C -157.60085,176.6451 -156.78074,184.26068 -156.78074,184.26068 C -156.78074,184.26068 -148.33787,181.58301 -148.57092,178.60053 C -148.74283,176.40051 -153.23774,174.41092 -155.20193,175.4167 z"
+ id="path3382"
+ style="fill:url(#linearGradient3398);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -156.56354,153.84532 C -158.96246,152.61693 -158.14235,145.00135 -158.14235,145.00135 C -158.14235,145.00135 -149.69948,147.67902 -149.93253,150.66149 C -150.10444,152.86151 -154.59935,154.85111 -156.56354,153.84532 z"
+ id="path3400"
+ style="fill:url(#linearGradient3402);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -133.88532,153.68678 C -131.48641,152.45838 -132.30652,144.8428 -132.30652,144.8428 C -132.30652,144.8428 -140.74938,147.52047 -140.51633,150.50295 C -140.34442,152.70297 -135.84951,154.69256 -133.88532,153.68678 z"
+ id="path3404"
+ style="fill:url(#linearGradient3406);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -134.51948,175.55085 C -132.12057,176.77925 -132.94068,184.39483 -132.94068,184.39483 C -132.94068,184.39483 -141.38355,181.71716 -141.15049,178.73469 C -140.97858,176.53467 -136.48367,174.54507 -134.51948,175.55085 z"
+ id="path3408"
+ style="fill:url(#linearGradient3410);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -161.25709,168.78221 C -163.22395,170.62484 -170.11427,165.85236 -170.11427,165.85236 C -170.11427,165.85236 -164.7408,160.23808 -162.01257,161.46538 C -160.00011,162.37068 -159.64667,167.27352 -161.25709,168.78221 z"
+ id="path3412"
+ style="fill:url(#linearGradient3414);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -129.17068,169.10464 C -127.20382,170.94727 -120.3135,166.17478 -120.3135,166.17478 C -120.3135,166.17478 -125.68697,160.5605 -128.41519,161.7878 C -130.42766,162.69311 -130.7811,167.59595 -129.17068,169.10464 z"
+ id="path3416"
+ style="fill:url(#linearGradient3418);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M -126,151.21948 A 6.625,6.625 0 1 1 -139.25,151.21948 A 6.625,6.625 0 1 1 -126,151.21948 z"
+ transform="matrix(0.6341613,0,0,0.6341613,-61.039517,68.324922)"
+ id="path3426"
+ style="opacity:1;fill:url(#radialGradient3439);fill-opacity:1;stroke:#131313;stroke-width:3.54799318;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/sand.svg b/demos/sub-attaq/pics/scalable/sand.svg
new file mode 100644
index 0000000..8af11b7
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/sand.svg
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2596">
+ <defs
+ id="defs2598">
+ <linearGradient
+ id="linearGradient3708">
+ <stop
+ id="stop3710"
+ style="stop-color:#202020;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3712"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="518.26996"
+ y1="497.31476"
+ x2="533.02924"
+ y2="497.31476"
+ id="linearGradient3794"
+ xlink:href="#linearGradient3708"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3718">
+ <stop
+ id="stop3720"
+ style="stop-color:#bcbcbc;stop-opacity:0.28169015"
+ offset="0" />
+ <stop
+ id="stop3722"
+ style="stop-color:#bcbcbc;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="516.89508"
+ y1="503.50137"
+ x2="516.89508"
+ y2="543.80646"
+ id="linearGradient3792"
+ xlink:href="#linearGradient3718"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9947644,0,0,1.3346457,2.7877039,-166.60153)" />
+ <linearGradient
+ id="linearGradient3692">
+ <stop
+ id="stop3694"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3696"
+ style="stop-color:#b6b6b6;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="506.95975"
+ y1="469.73706"
+ x2="525.41608"
+ y2="469.73706"
+ id="linearGradient3790"
+ xlink:href="#linearGradient3692"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3816">
+ <stop
+ id="stop3818"
+ style="stop-color:#ad8b00;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3820"
+ style="stop-color:#ad8b00;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="573"
+ y1="755.46222"
+ x2="573"
+ y2="700.13464"
+ id="linearGradient3826"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6033628,-150.63569,-350.3846)" />
+ </defs>
+ <g
+ id="layer1">
+ <path
+ d="M -151.63569,813.2217 C 121.3643,798.79144 -201.99878,675.6877 110.3643,805.79144 C 173.82677,832.22448 244.3643,807.3948 298.3643,805.79144 C 352.3643,804.18808 312.3643,791.12082 359.3643,811.96454 C 406.3643,832.80825 554.3643,792.77462 599.3643,784.75781 C 644.3643,776.741 757.36426,768.13763 796.36426,782.5679 C 835.36426,796.99816 905.36426,799.37799 905.36426,799.37799 L 902.36426,847.47887 L -153.63569,845.87551 L -151.63569,813.2217 z"
+ id="path3814"
+ style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="M 908.86426,836.95812 C 635.8643,830.91791 761.87636,793.71076 617.8643,836.91791 C 600.0648,842.2582 409.74894,822.981 401.8643,836.91791 C 378.04825,879.01524 73.306465,803.72304 31.864305,827.54883 C 28.864305,829.27358 9.9016246,824.26916 -15.135695,831.28771 C -51.805335,841.56707 -68.135695,826.06042 -107.1357,832.10063 C -146.1357,838.14084 -150.13569,834.11404 -150.13569,834.11404 L -157.13569,848.36741 L 898.86426,847.69627 L 908.86426,836.95812 z"
+ id="path3828"
+ style="fill:#ad8b00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/see.svg b/demos/sub-attaq/pics/scalable/see.svg
new file mode 100644
index 0000000..0666691
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/see.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2650">
+ <defs
+ id="defs2652">
+ <linearGradient
+ id="linearGradient3624">
+ <stop
+ id="stop3626"
+ style="stop-color:#3a8daf;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3636"
+ style="stop-color:#252525;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="552.98486"
+ y1="390.56842"
+ x2="549.39465"
+ y2="702.3479"
+ id="linearGradient3630"
+ xlink:href="#linearGradient3624"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3373776,0,0,1.5004634,-996.17287,-279.00679)" />
+ </defs>
+ <g
+ id="layer1">
+ <rect
+ width="1054.4708"
+ height="461.52972"
+ x="-161.52115"
+ y="310.16876"
+ id="rect3622"
+ style="opacity:1;fill:url(#linearGradient3630);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13464069;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/sky.svg b/demos/sub-attaq/pics/scalable/sky.svg
new file mode 100644
index 0000000..1546c08
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/sky.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2721">
+ <defs
+ id="defs2723">
+ <linearGradient
+ id="linearGradient3746">
+ <stop
+ id="stop3748"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3750"
+ style="stop-color:#0074b7;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="82.966125"
+ cy="-178.42453"
+ r="526.79456"
+ fx="82.966125"
+ fy="-178.42453"
+ id="radialGradient3880"
+ xlink:href="#linearGradient3746"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4952094,0.3367191,-0.1040669,0.5264617,-235.04839,425.12197)" />
+ </defs>
+ <g
+ id="layer1">
+ <rect
+ width="1053.5891"
+ height="291.32797"
+ x="-178.22313"
+ y="300.98392"
+ id="rect3638"
+ style="opacity:1;fill:url(#radialGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.1880002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/sub-attaq.svg b/demos/sub-attaq/pics/scalable/sub-attaq.svg
new file mode 100644
index 0000000..b075179
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/sub-attaq.svg
@@ -0,0 +1,1473 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ version="1.0"
+ sodipodi:docname="sub-attaq.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3366"
+ id="radialGradient3439"
+ cx="-135.625"
+ cy="148.71948"
+ fx="-135.625"
+ fy="148.71948"
+ r="7.625"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3366"
+ id="linearGradient3418"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.2134297,-0.5943658,0.6658882,-0.2391126,-274.53441,123.00067)"
+ x1="-132.85063"
+ y1="173.6969"
+ x2="-145.3662"
+ y2="177.59828" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3366"
+ id="linearGradient3414"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2134297,-0.5943658,-0.6658882,-0.2391126,-15.893355,122.67824)"
+ x1="-141.85466"
+ y1="181.49153"
+ x2="-144.95044"
+ y2="175.90179" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3366"
+ id="linearGradient3410"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6315243,0,0,0.7075182,-227.03781,54.321514)"
+ x1="-149.5"
+ y1="177.59448"
+ x2="-145.7928"
+ y2="180.05936" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3366"
+ id="linearGradient3406"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6315243,0,0,-0.7075182,-226.40365,274.91611)"
+ x1="-140.46242"
+ y1="177.40488"
+ x2="-147.04802"
+ y2="172.66473" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3366"
+ id="linearGradient3402"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6315243,0,0,-0.7075182,-64.045217,275.07466)"
+ x1="-147.2406"
+ y1="180.95567"
+ x2="-140.01878"
+ y2="175.57777" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3366"
+ id="linearGradient3398"
+ x1="-146.98956"
+ y1="174.00922"
+ x2="-142.60332"
+ y2="179.38712"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6315243,0,0,0.7075182,-62.683611,54.187362)" />
+ <linearGradient
+ id="linearGradient3366">
+ <stop
+ id="stop3368"
+ offset="0"
+ style="stop-color:#bcbcbc;stop-opacity:1;" />
+ <stop
+ id="stop3370"
+ offset="1"
+ style="stop-color:#191b1c;stop-opacity:1;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3366"
+ id="radialGradient3364"
+ cx="-208.95004"
+ cy="173.10576"
+ fx="-208.95004"
+ fy="173.10576"
+ r="31.667252"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient5097">
+ <stop
+ style="stop-color:#19a2db;stop-opacity:0;"
+ offset="0"
+ id="stop5099" />
+ <stop
+ id="stop5109"
+ offset="0.30000001"
+ style="stop-color:#1379a7;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#0e5173;stop-opacity:1;"
+ offset="1"
+ id="stop5101" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3523"
+ inkscape:collect="always">
+ <stop
+ id="stop3525"
+ offset="0"
+ style="stop-color:#b9b9b9;stop-opacity:1" />
+ <stop
+ id="stop3527"
+ offset="1"
+ style="stop-color:#444444;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3438">
+ <stop
+ style="stop-color:#939393;stop-opacity:1;"
+ offset="0"
+ id="stop3440" />
+ <stop
+ id="stop3444"
+ offset="0.12354442"
+ style="stop-color:#d6d6d6;stop-opacity:1;" />
+ <stop
+ style="stop-color:#dadada;stop-opacity:1;"
+ offset="0.74055624"
+ id="stop3446" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3442" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3428">
+ <stop
+ id="stop3430"
+ offset="0"
+ style="stop-color:#464646;stop-opacity:1;" />
+ <stop
+ style="stop-color:#848788;stop-opacity:1;"
+ offset="0.18306103"
+ id="stop3432" />
+ <stop
+ id="stop3434"
+ offset="0.66368055"
+ style="stop-color:#9ca0a2;stop-opacity:1;" />
+ <stop
+ id="stop3436"
+ offset="1"
+ style="stop-color:#b5babd;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4034">
+ <stop
+ id="stop4036"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.49803922;"
+ offset="0.5"
+ id="stop4038" />
+ <stop
+ id="stop4040"
+ offset="0.63705367"
+ style="stop-color:#ffffff;stop-opacity:0.24705882;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.12156863;"
+ offset="0.79425853"
+ id="stop4042" />
+ <stop
+ id="stop4044"
+ offset="1"
+ style="stop-color:#a0a0a0;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4016">
+ <stop
+ style="stop-color:#283e6a;stop-opacity:1;"
+ offset="0"
+ id="stop4018" />
+ <stop
+ style="stop-color:#283e6a;stop-opacity:0;"
+ offset="1"
+ id="stop4020" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4004">
+ <stop
+ style="stop-color:#dbdbdb;stop-opacity:1;"
+ offset="0"
+ id="stop4010" />
+ <stop
+ style="stop-color:#c4c9cb;stop-opacity:1;"
+ offset="1"
+ id="stop4012" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3998">
+ <stop
+ id="stop4000"
+ offset="0"
+ style="stop-color:#adadad;stop-opacity:1;" />
+ <stop
+ id="stop4002"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3864">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3866" />
+ <stop
+ id="stop4028"
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.24705882;"
+ offset="0.75"
+ id="stop4030" />
+ <stop
+ id="stop4032"
+ offset="0.875"
+ style="stop-color:#ffffff;stop-opacity:0.12156863;" />
+ <stop
+ style="stop-color:#a0a0a0;stop-opacity:1;"
+ offset="1"
+ id="stop3868" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3816">
+ <stop
+ style="stop-color:#ad8b00;stop-opacity:1;"
+ offset="0"
+ id="stop3818" />
+ <stop
+ style="stop-color:#ad8b00;stop-opacity:0;"
+ offset="1"
+ id="stop3820" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3746">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3748" />
+ <stop
+ style="stop-color:#0074b7;stop-opacity:1;"
+ offset="1"
+ id="stop3750" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3718">
+ <stop
+ style="stop-color:#bcbcbc;stop-opacity:0.28169015;"
+ offset="0"
+ id="stop3720" />
+ <stop
+ style="stop-color:#bcbcbc;stop-opacity:0;"
+ offset="1"
+ id="stop3722" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3708">
+ <stop
+ style="stop-color:#202020;stop-opacity:1;"
+ offset="0"
+ id="stop3710" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3712" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3692">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3694" />
+ <stop
+ style="stop-color:#b6b6b6;stop-opacity:1;"
+ offset="1"
+ id="stop3696" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3656">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3658" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3660" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3624">
+ <stop
+ style="stop-color:#3a8daf;stop-opacity:1;"
+ offset="0"
+ id="stop3626" />
+ <stop
+ id="stop3636"
+ offset="1"
+ style="stop-color:#252525;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3532">
+ <stop
+ id="stop3534"
+ offset="0"
+ style="stop-color:#545454;stop-opacity:1;" />
+ <stop
+ style="stop-color:#848788;stop-opacity:1;"
+ offset="0.44021741"
+ id="stop3536" />
+ <stop
+ id="stop3538"
+ offset="0.56799388"
+ style="stop-color:#9ca0a2;stop-opacity:1;" />
+ <stop
+ id="stop3540"
+ offset="1"
+ style="stop-color:#565d60;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3345">
+ <stop
+ id="stop3348"
+ offset="0"
+ style="stop-color:#898989;stop-opacity:1;" />
+ <stop
+ style="stop-color:#9ea1a2;stop-opacity:1;"
+ offset="0.44021741"
+ id="stop3350" />
+ <stop
+ id="stop3352"
+ offset="0.56799388"
+ style="stop-color:#bbbdbf;stop-opacity:1;" />
+ <stop
+ id="stop3354"
+ offset="1"
+ style="stop-color:#f0f1f2;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3227">
+ <stop
+ style="stop-color:#444444;stop-opacity:1;"
+ offset="0"
+ id="stop3229" />
+ <stop
+ style="stop-color:#b0b0b0;stop-opacity:1;"
+ offset="1"
+ id="stop3232" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3435">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3437" />
+ <stop
+ style="stop-color:#c0c0c0;stop-opacity:0;"
+ offset="1"
+ id="stop3439" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3421">
+ <stop
+ style="stop-color:#444444;stop-opacity:1;"
+ offset="0"
+ id="stop3423" />
+ <stop
+ style="stop-color:#444444;stop-opacity:0;"
+ offset="1"
+ id="stop3425" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3293">
+ <stop
+ style="stop-color:#c4b434;stop-opacity:1;"
+ offset="0"
+ id="stop3295" />
+ <stop
+ style="stop-color:#9b5500;stop-opacity:1;"
+ offset="1"
+ id="stop3297" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3229">
+ <stop
+ style="stop-color:#125a7a;stop-opacity:1;"
+ offset="0"
+ id="stop3231" />
+ <stop
+ style="stop-color:#308fc0;stop-opacity:1;"
+ offset="1"
+ id="stop3233" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3219">
+ <stop
+ id="stop3221"
+ offset="0"
+ style="stop-color:#a55b00;stop-opacity:1;" />
+ <stop
+ id="stop3223"
+ offset="1"
+ style="stop-color:#f4e45e;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3189">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3191" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3193" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3167">
+ <stop
+ style="stop-color:#464646;stop-opacity:1;"
+ offset="0"
+ id="stop3169" />
+ <stop
+ id="stop3345"
+ offset="0.44021741"
+ style="stop-color:#848788;stop-opacity:1;" />
+ <stop
+ style="stop-color:#9ca0a2;stop-opacity:1;"
+ offset="0.56799388"
+ id="stop3347" />
+ <stop
+ style="stop-color:#b5babd;stop-opacity:1;"
+ offset="1"
+ id="stop3171" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3167"
+ id="linearGradient3175"
+ x1="443.95602"
+ y1="315.31854"
+ x2="443.95602"
+ y2="247.85609"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4908502,0,0,0.4579593,350.98557,542.12189)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3219"
+ id="linearGradient3253"
+ gradientUnits="userSpaceOnUse"
+ x1="325.57214"
+ y1="280.13632"
+ x2="312.84424"
+ y2="257.60013" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="linearGradient3255"
+ gradientUnits="userSpaceOnUse"
+ x1="310.01578"
+ y1="255.47881"
+ x2="325.92572"
+ y2="280.13632" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3219"
+ id="linearGradient3321"
+ gradientUnits="userSpaceOnUse"
+ x1="325.57214"
+ y1="280.13632"
+ x2="312.84424"
+ y2="257.60013" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="linearGradient3323"
+ gradientUnits="userSpaceOnUse"
+ x1="310.01578"
+ y1="255.47881"
+ x2="325.92572"
+ y2="280.13632" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3219"
+ id="linearGradient3331"
+ gradientUnits="userSpaceOnUse"
+ x1="325.57214"
+ y1="280.13632"
+ x2="312.84424"
+ y2="257.60013" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="linearGradient3333"
+ gradientUnits="userSpaceOnUse"
+ x1="310.01578"
+ y1="255.47881"
+ x2="325.92572"
+ y2="280.13632" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3293"
+ id="linearGradient3343"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3292883,0,0,1.10796,1.5038593,-24.232315)"
+ x1="359.5589"
+ y1="258.84247"
+ x2="370.88239"
+ y2="258.84247" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3219"
+ id="linearGradient3365"
+ gradientUnits="userSpaceOnUse"
+ x1="325.57214"
+ y1="280.13632"
+ x2="312.84424"
+ y2="257.60013" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="linearGradient3367"
+ gradientUnits="userSpaceOnUse"
+ x1="310.01578"
+ y1="255.47881"
+ x2="325.92572"
+ y2="280.13632" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3219"
+ id="linearGradient3369"
+ gradientUnits="userSpaceOnUse"
+ x1="325.57214"
+ y1="280.13632"
+ x2="312.84424"
+ y2="257.60013" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="linearGradient3371"
+ gradientUnits="userSpaceOnUse"
+ x1="310.01578"
+ y1="255.47881"
+ x2="325.92572"
+ y2="280.13632" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3219"
+ id="linearGradient3379"
+ gradientUnits="userSpaceOnUse"
+ x1="325.57214"
+ y1="280.13632"
+ x2="312.84424"
+ y2="257.60013" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="linearGradient3381"
+ gradientUnits="userSpaceOnUse"
+ x1="310.01578"
+ y1="255.47881"
+ x2="325.92572"
+ y2="280.13632" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3293"
+ id="linearGradient3385"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3267302,0,0,1.1332782,-1.5786343,-29.194748)"
+ x1="371.79858"
+ y1="258.84247"
+ x2="364.49646"
+ y2="258.84247" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3293"
+ id="linearGradient3401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9807835,0,0,1.1280701,-361.45126,-28.553769)"
+ x1="371.79858"
+ y1="258.84247"
+ x2="364.49646"
+ y2="258.84247" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3421"
+ id="radialGradient3431"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1862613,0,0,0.3638703,-186.86143,179.02055)"
+ cx="432.3343"
+ cy="233.80295"
+ fx="432.3343"
+ fy="233.80295"
+ r="59.056834" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3435"
+ id="radialGradient3441"
+ cx="290.5"
+ cy="244.34448"
+ fx="290.5"
+ fy="244.34448"
+ r="37.5"
+ gradientTransform="matrix(0.8202102,0.8202102,-0.7960458,0.7960458,246.73838,-189.686)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3345"
+ id="linearGradient3311"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.466978,0,0,0.4500435,352.00841,540.25044)"
+ x1="510.99884"
+ y1="161.99408"
+ x2="396.48914"
+ y2="161.99408" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3421"
+ id="radialGradient3339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4181493,0,0,0.1282619,386.09461,620.15777)"
+ cx="432.3343"
+ cy="233.80295"
+ fx="432.3343"
+ fy="233.80295"
+ r="59.056834" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3219"
+ id="linearGradient3434"
+ gradientUnits="userSpaceOnUse"
+ x1="325.57214"
+ y1="280.13632"
+ x2="312.84424"
+ y2="257.60013" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3229"
+ id="linearGradient3436"
+ gradientUnits="userSpaceOnUse"
+ x1="310.01578"
+ y1="255.47881"
+ x2="325.92572"
+ y2="280.13632" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3532"
+ id="linearGradient3520"
+ x1="525"
+ y1="371.09448"
+ x2="525"
+ y2="395.09448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5865192,0,0,0.2518015,339.73218,572.99479)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3624"
+ id="linearGradient3630"
+ x1="552.98486"
+ y1="390.56842"
+ x2="549.39465"
+ y2="702.3479"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3373776,0,0,1.5004634,-835.38716,-310.82676)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3656"
+ id="radialGradient3662"
+ cx="656.19507"
+ cy="534.45917"
+ fx="656.19507"
+ fy="534.45917"
+ r="13.227922"
+ gradientTransform="matrix(1,0,0,1.2672781,0,-144.63884)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3656"
+ id="radialGradient3668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2672781,0,-144.63884)"
+ cx="656.19507"
+ cy="534.45917"
+ fx="656.19507"
+ fy="534.45917"
+ r="13.227922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3656"
+ id="radialGradient3672"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2672781,0,-144.63884)"
+ cx="656.19507"
+ cy="534.45917"
+ fx="656.19507"
+ fy="534.45917"
+ r="13.227922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3656"
+ id="radialGradient3676"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2672781,0,-144.63884)"
+ cx="656.19507"
+ cy="534.45917"
+ fx="656.19507"
+ fy="534.45917"
+ r="13.227922" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3692"
+ id="linearGradient3772"
+ gradientUnits="userSpaceOnUse"
+ x1="506.95975"
+ y1="469.73706"
+ x2="525.41608"
+ y2="469.73706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3718"
+ id="linearGradient3774"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9947644,0,0,1.3346457,2.7877039,-166.60153)"
+ x1="516.89508"
+ y1="503.50137"
+ x2="516.89508"
+ y2="543.80646" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3708"
+ id="linearGradient3776"
+ gradientUnits="userSpaceOnUse"
+ x1="518.26993"
+ y1="497.31477"
+ x2="533.02923"
+ y2="497.31477" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3692"
+ id="linearGradient3790"
+ gradientUnits="userSpaceOnUse"
+ x1="506.95975"
+ y1="469.73706"
+ x2="525.41608"
+ y2="469.73706" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3718"
+ id="linearGradient3792"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9947644,0,0,1.3346457,2.7877039,-166.60153)"
+ x1="516.89508"
+ y1="503.50137"
+ x2="516.89508"
+ y2="543.80646" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3708"
+ id="linearGradient3794"
+ gradientUnits="userSpaceOnUse"
+ x1="518.26993"
+ y1="497.31477"
+ x2="533.02923"
+ y2="497.31477" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3656"
+ id="radialGradient3804"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2672781,0,-144.63884)"
+ cx="656.19507"
+ cy="534.45917"
+ fx="656.19507"
+ fy="534.45917"
+ r="13.227922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3656"
+ id="radialGradient3808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2672781,0,-144.63884)"
+ cx="656.19507"
+ cy="534.45917"
+ fx="656.19507"
+ fy="534.45917"
+ r="13.227922" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3227"
+ id="linearGradient3812"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1223608,0,0,0.3849769,-17.516054,565.40983)"
+ x1="543.5"
+ y1="205.19257"
+ x2="587.52001"
+ y2="205.19257" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3816"
+ id="linearGradient3826"
+ x1="573"
+ y1="755.46222"
+ x2="573"
+ y2="700.13464"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.6033628,0,-450.76899)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3864"
+ id="radialGradient3874"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9674693,0.8647541,-0.8726553,1.0212484,-15.308759,-74.232772)"
+ cx="94.273849"
+ cy="89.893486"
+ fx="94.273849"
+ fy="89.893486"
+ r="74.397521" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3746"
+ id="radialGradient3880"
+ cx="82.966125"
+ cy="-178.42453"
+ fx="82.966125"
+ fy="-178.42453"
+ r="526.79456"
+ gradientTransform="matrix(1.4952094,0.3367191,-0.1040669,0.5264617,-57.119818,125.77043)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3438"
+ id="linearGradient3948"
+ x1="660.29303"
+ y1="256.53284"
+ x2="444.79303"
+ y2="255.62085"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,32.526912)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3692"
+ id="linearGradient3972"
+ x1="573.5"
+ y1="244.2056"
+ x2="578.25"
+ y2="216.9556"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,35.526912)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3746"
+ id="linearGradient3990"
+ x1="542.5"
+ y1="222.59448"
+ x2="559"
+ y2="222.59448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-6.25,37.151912)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3746"
+ id="linearGradient3994"
+ gradientUnits="userSpaceOnUse"
+ x1="542.5"
+ y1="222.59448"
+ x2="559"
+ y2="222.59448"
+ gradientTransform="translate(38.5,37.151912)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4016"
+ id="linearGradient4022"
+ x1="639"
+ y1="262.09448"
+ x2="667"
+ y2="262.09448"
+ gradientUnits="userSpaceOnUse" />
+ <inkscape:perspective
+ id="perspective2578"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3746"
+ id="linearGradient3387"
+ gradientUnits="userSpaceOnUse"
+ x1="542.5"
+ y1="222.59448"
+ x2="559"
+ y2="222.59448"
+ gradientTransform="translate(15.875,37.151912)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3167"
+ id="linearGradient3416"
+ x1="474.23065"
+ y1="229.92336"
+ x2="474.1944"
+ y2="218.27365"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.1004684,32.526757)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3428"
+ id="linearGradient3426"
+ x1="592.92798"
+ y1="199.43727"
+ x2="557.05743"
+ y2="196.5448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(12.140805,-13.041887)" />
+ <filter
+ inkscape:collect="always"
+ id="filter3507">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="3.0523171"
+ id="feGaussianBlur3509" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3523"
+ id="linearGradient3521"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-0.7291751,0,521.83983)"
+ x1="562.55634"
+ y1="285.89896"
+ x2="562.55634"
+ y2="244.09448" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5097"
+ id="linearGradient5103"
+ x1="590.84674"
+ y1="274.57559"
+ x2="590.84674"
+ y2="334.01376"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="pad" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3864"
+ id="radialGradient5107"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9674693,0.8647541,-0.8726553,1.0212484,-15.308759,-74.232772)"
+ cx="94.273849"
+ cy="89.893486"
+ fx="94.273849"
+ fy="89.893486"
+ r="74.397521" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.70710678"
+ inkscape:cx="532.91407"
+ inkscape:cy="457.84365"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1674"
+ inkscape:window-height="1000"
+ inkscape:window-x="2"
+ inkscape:window-y="14"
+ showguides="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:1;fill:url(#radialGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.1880002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3638"
+ width="1053.5891"
+ height="291.32797"
+ x="-0.29455566"
+ y="1.6323624" />
+ <path
+ style="fill:url(#radialGradient3874);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3507)"
+ d="M 158.37853,75.817898 C 130.95894,49.483192 82.14552,74.615971 85.85382,95.15981 C 49.691853,94.8009 50.214842,139.36083 83.29101,132.16343 C 144.66465,163.16454 159.26268,129.80212 164.6863,136.51386 C 225.60448,157.97672 246.34362,130.65438 265.24417,127.0714 C 294.43981,137.91859 337.16986,121.78798 297.03636,102.77604 C 331.73096,64.597047 277.96882,60.229366 253.07028,70.400868 C 191.09597,33.610112 168.89234,63.292037 158.37853,75.817898 z"
+ id="path3872"
+ sodipodi:nodetypes="cccccccc"
+ transform="matrix(1.5062893,0,0,1.1720951,618.04001,132.36768)" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3630);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.13464069;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3622"
+ width="1054.4708"
+ height="461.52972"
+ x="-0.7354126"
+ y="278.34879" />
+ <path
+ style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M -0.99999999,712.83731 C 272,698.40705 -51.363087,575.30331 261,705.40705 C 324.46247,731.84009 395,707.01041 449,705.40705 C 503,703.80369 463,690.73643 510,711.58015 C 557,732.42386 705,692.39023 750,684.37342 C 795,676.35661 908,667.75324 947,682.18351 C 986,696.61377 1056,698.9936 1056,698.9936 L 1053,747.09448 L -3,745.49112 L -0.99999999,712.83731 z"
+ id="path3814"
+ sodipodi:nodetypes="cssssscccc" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3520);fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:0.56879884;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3512"
+ width="10.557344"
+ height="6.0432386"
+ x="642.3761"
+ y="666.43695" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path2455"
+ id="use3258"
+ transform="matrix(0.869168,0,0,-0.869168,81.98751,1246.5374)"
+ width="1052.3622"
+ height="744.09448" />
+ <path
+ style="fill:url(#linearGradient3812);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.77744257;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 593.04822,651.68104 C 593.04822,651.68104 653.65569,615.49321 639.065,637.05192 C 624.47431,658.61061 624.47431,658.61061 624.47431,658.61061 L 593.04822,651.68104 z"
+ id="path2455" />
+ <path
+ style="fill:url(#linearGradient3175);fill-opacity:1;fill-rule:evenodd;stroke:#393939;stroke-width:1.90693891;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 485.26939,643.71814 C 443.15507,651.66437 458.5319,680.53556 502.21486,686.27814 C 551.68229,692.78115 568.45042,691.0115 605.34827,686.27814 C 657.60843,679.57406 657.68143,651.78445 605.34827,643.25553 C 553.98131,634.88408 516.10913,637.89923 485.26939,643.71814 z"
+ id="path2385"
+ sodipodi:nodetypes="cssss" />
+ <path
+ style="fill:url(#radialGradient3339);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 542.18031,648.1112 C 548.56327,665.42741 608.42397,656.72745 586.93551,642.57104 C 586.93551,642.57104 543.33293,648.61096 542.18031,648.1112 z"
+ id="path3403"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:url(#linearGradient3311);fill-opacity:1;fill-rule:evenodd;stroke:#2d2d2d;stroke-width:2.07042313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 537.39402,641.90906 C 537.39402,656.7605 583.62247,656.30589 583.62247,641.45445 L 583.62247,636.06071 C 583.62247,621.21003 537.39402,613.87461 537.39402,628.72529 L 537.39402,641.90906 z"
+ id="path3291"
+ sodipodi:nodetypes="cssss" />
+ <g
+ id="g3235"
+ transform="matrix(1.4016868,0,0,1.1319742,112.22001,-99.678822)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#radialGradient3441);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.227;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3433"
+ sodipodi:cx="303.5"
+ sodipodi:cy="263.09448"
+ sodipodi:rx="37.5"
+ sodipodi:ry="40"
+ d="M 341,263.09448 A 37.5,40 0 1 1 266,263.09448 A 37.5,40 0 1 1 341,263.09448 z"
+ transform="matrix(0.692163,0,1.4106583e-2,0.289185,275.31394,582.37251)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.06500006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3458"
+ sodipodi:cx="369.5"
+ sodipodi:cy="316.09448"
+ sodipodi:rx="27.5"
+ sodipodi:ry="7"
+ d="M 397,316.09448 A 27.5,7 0 1 1 342,316.09448 A 27.5,7 0 1 1 397,316.09448 z"
+ transform="matrix(0.5642633,0,0,0.5642633,348.03095,450.47113)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:4.23126984;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3510"
+ sodipodi:cx="369.5"
+ sodipodi:cy="316.09448"
+ sodipodi:rx="27.5"
+ sodipodi:ry="7"
+ d="M 397,316.09448 A 27.5,7 0 1 1 342,316.09448 A 27.5,7 0 1 1 397,316.09448 z"
+ transform="matrix(0,0.30778,-0.5642633,0,828.66499,563.5944)" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path3510"
+ id="use3544"
+ transform="translate(0.5000005,-17.23511)"
+ width="1052.3622"
+ height="744.09448" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#787878;fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:2.38492584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3584"
+ sodipodi:cx="237.5"
+ sodipodi:cy="366.09448"
+ sodipodi:rx="8.5"
+ sodipodi:ry="8"
+ d="M 246,366.09448 A 8.5,8 0 1 1 229,366.09448 A 8.5,8 0 1 1 246,366.09448 z"
+ transform="matrix(1.7798114,-4.2997512e-2,1.3318941e-2,0.5513151,196.65666,476.1443)" />
+ <path
+ style="fill:#a9a9a9;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3.49756980000000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 423.2231,281.1169 C 502.67948,283.47026 574.8361,283.42778 668.97714,281.1169 C 668.97714,281.1169 670.77663,271.99598 668.97714,269.5402 C 559.46065,250.8302 423.2231,265.08614 423.2231,269.5402 L 423.2231,281.1169 z"
+ id="path3469"
+ sodipodi:nodetypes="cccsc" />
+ <rect
+ style="opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3408"
+ width="3.4280596"
+ height="29.611124"
+ x="709.89148"
+ y="-14.462622"
+ transform="matrix(0.9327494,0.3605254,-0.3633626,0.9316478,0,0)" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3416);fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:2.99999928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3376"
+ width="48.499989"
+ height="8.5"
+ x="444.56302"
+ y="252.39224"
+ transform="matrix(0.9999952,3.0887776e-3,-3.0887776e-3,0.9999952,0,0)" />
+ <path
+ style="fill:url(#linearGradient3972);fill-opacity:1;fill-rule:evenodd;stroke:#323232;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 509,277.62139 C 509,277.62139 547.41409,235.70896 524,232.62139 L 615,244.62139 L 615,279.62139 L 509,277.62139 z"
+ id="path3952"
+ sodipodi:nodetypes="csccc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#radialGradient3662);fill-opacity:1;fill-rule:nonzero;stroke:#41526b;stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3654"
+ sodipodi:cx="656.19507"
+ sodipodi:cy="541.15485"
+ sodipodi:rx="12.727922"
+ sodipodi:ry="16.263456"
+ d="M 668.92299,541.15485 A 12.727922,16.263456 0 1 1 643.46715,541.15485 A 12.727922,16.263456 0 1 1 668.92299,541.15485 z"
+ transform="matrix(0.5187874,0,0,0.3968421,374.8524,387.30025)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#radialGradient3668);fill-opacity:1;fill-rule:nonzero;stroke:#41526b;stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3666"
+ sodipodi:cx="656.19507"
+ sodipodi:cy="541.15485"
+ sodipodi:rx="12.727922"
+ sodipodi:ry="16.263456"
+ d="M 668.92299,541.15485 A 12.727922,16.263456 0 1 1 643.46715,541.15485 A 12.727922,16.263456 0 1 1 668.92299,541.15485 z"
+ transform="matrix(0.5734968,0,0,0.4386917,316.52295,315.62837)" />
+ <path
+ transform="matrix(0.8598866,0,0,0.5637407,192.52282,220.77351)"
+ d="M 668.92299,541.15485 A 12.727922,16.263456 0 1 1 643.46715,541.15485 A 12.727922,16.263456 0 1 1 668.92299,541.15485 z"
+ sodipodi:ry="16.263456"
+ sodipodi:rx="12.727922"
+ sodipodi:cy="541.15485"
+ sodipodi:cx="656.19507"
+ id="path3670"
+ style="opacity:1;fill:url(#radialGradient3672);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.90000010000000020;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#radialGradient3676);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.90000010000000020;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3674"
+ sodipodi:cx="656.19507"
+ sodipodi:cy="541.15485"
+ sodipodi:rx="12.727922"
+ sodipodi:ry="16.263456"
+ d="M 668.92299,541.15485 A 12.727922,16.263456 0 1 1 643.46715,541.15485 A 12.727922,16.263456 0 1 1 668.92299,541.15485 z"
+ transform="matrix(0.7435991,0,0,0.6264519,225.8301,127.83701)" />
+ <g
+ id="g3759"
+ transform="matrix(0.8830571,0,0,0.8830571,104.83144,103.2985)">
+ <path
+ d="M 523.9661,469.73706 A 7.7781744,34.648232 0 1 1 508.40975,469.73706 A 7.7781744,34.648232 0 1 1 523.9661,469.73706 z"
+ sodipodi:ry="34.648232"
+ sodipodi:rx="7.7781744"
+ sodipodi:cy="469.73706"
+ sodipodi:cx="516.18793"
+ id="path3682"
+ style="opacity:1;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:#272727;stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <g
+ id="g3754">
+ <rect
+ style="opacity:1;fill:url(#linearGradient3774);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3716"
+ width="33.58757"
+ height="59.927299"
+ x="498.86386"
+ y="497.84454" />
+ <path
+ style="fill:url(#linearGradient3776);fill-opacity:1;fill-rule:evenodd;stroke:#1f1f1f;stroke-width:1.99788344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 523.35045,482.89424 C 523.35045,482.89424 532.31256,488.20203 532.02344,500.14638 C 531.73431,512.09072 531.73431,511.73417 531.73431,511.73417 C 531.73431,511.73417 520.70627,493.83104 519.26887,499.77636 L 523.35045,482.89424 z"
+ id="path3704"
+ sodipodi:nodetypes="cscsc" />
+ <path
+ sodipodi:nodetypes="cscsc"
+ id="path3706"
+ d="M 508.50327,482.89424 C 508.50327,482.89424 499.54116,488.20203 499.83028,500.14638 C 500.11941,512.09072 500.11941,511.73417 500.11941,511.73417 C 500.11941,511.73417 511.14745,493.83104 512.58485,499.77636 L 508.50327,482.89424 z"
+ style="fill:#bcbcbc;fill-opacity:1;fill-rule:evenodd;stroke:#1f1f1f;stroke-width:1.99788344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.8830571,0,0,0.8830571,192.45885,-66.370546)"
+ id="g3778">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#linearGradient3790);fill-opacity:1;fill-rule:nonzero;stroke:#272727;stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3780"
+ sodipodi:cx="516.18793"
+ sodipodi:cy="469.73706"
+ sodipodi:rx="7.7781744"
+ sodipodi:ry="34.648232"
+ d="M 523.9661,469.73706 A 7.7781744,34.648232 0 1 1 508.40975,469.73706 A 7.7781744,34.648232 0 1 1 523.9661,469.73706 z" />
+ <g
+ id="g3782">
+ <rect
+ y="497.84454"
+ x="498.86386"
+ height="59.927299"
+ width="33.58757"
+ id="rect3784"
+ style="opacity:1;fill:url(#linearGradient3792);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cscsc"
+ id="path3786"
+ d="M 523.35045,482.89424 C 523.35045,482.89424 532.31256,488.20203 532.02344,500.14638 C 531.73431,512.09072 531.73431,511.73417 531.73431,511.73417 C 531.73431,511.73417 520.70627,493.83104 519.26887,499.77636 L 523.35045,482.89424 z"
+ style="fill:url(#linearGradient3794);fill-opacity:1;fill-rule:evenodd;stroke:#1f1f1f;stroke-width:1.99788344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#bcbcbc;fill-opacity:1;fill-rule:evenodd;stroke:#1f1f1f;stroke-width:1.99788344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 508.50327,482.89424 C 508.50327,482.89424 499.54116,488.20203 499.83028,500.14638 C 500.11941,512.09072 500.11941,511.73417 500.11941,511.73417 C 500.11941,511.73417 511.14745,493.83104 512.58485,499.77636 L 508.50327,482.89424 z"
+ id="path3788"
+ sodipodi:nodetypes="cscsc" />
+ </g>
+ </g>
+ <path
+ transform="matrix(0.4292897,0,0,0.3283816,384.32775,481.20689)"
+ d="M 668.92299,541.15485 A 12.727922,16.263456 0 1 1 643.46715,541.15485 A 12.727922,16.263456 0 1 1 668.92299,541.15485 z"
+ sodipodi:ry="16.263456"
+ sodipodi:rx="12.727922"
+ sodipodi:cy="541.15485"
+ sodipodi:cx="656.19507"
+ id="path3802"
+ style="opacity:1;fill:url(#radialGradient3804);fill-opacity:1;fill-rule:nonzero;stroke:#41526b;stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#radialGradient3808);fill-opacity:1;fill-rule:nonzero;stroke:#41526b;stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3806"
+ sodipodi:cx="656.19507"
+ sodipodi:cy="541.15485"
+ sodipodi:rx="12.727922"
+ sodipodi:ry="16.263456"
+ d="M 668.92299,541.15485 A 12.727922,16.263456 0 1 1 643.46715,541.15485 A 12.727922,16.263456 0 1 1 668.92299,541.15485 z"
+ transform="matrix(0.5842998,0,0,0.4469553,299.7804,369.91514)" />
+ <path
+ style="fill:#ad8b00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 1059.5,736.57373 C 786.5,730.53352 912.51207,693.32637 768.5,736.53352 C 750.7005,741.87381 560.38464,722.59661 552.5,736.53352 C 528.68395,778.63085 223.94216,703.33865 182.5,727.16444 C 179.5,728.88919 160.53732,723.88477 135.5,730.90332 C 98.830356,741.18268 82.5,725.67603 43.5,731.71624 C 4.5,737.75645 0.5,733.72965 0.5,733.72965 L -6.5,747.98302 L 1049.5,747.31188 L 1059.5,736.57373 z"
+ id="path3828"
+ sodipodi:nodetypes="cssssscccc" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5103);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3448"
+ width="1053.5891"
+ height="67.882248"
+ x="-0.29455566"
+ y="274.57559" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3519"
+ d="M 428,343.85222 C 428,343.85222 457.01739,315.41439 470,315.41439 C 481.98261,313.04457 634.13054,311.73511 652,317.41962 C 661.13441,320.56943 664.46012,324.9477 666,343.85222 C 600.25603,336.72647 497.8192,336.4719 428,343.85222 z"
+ style="opacity:0.43933058;fill:url(#linearGradient3521);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient3948);fill-opacity:1;fill-rule:evenodd;stroke:#545454;stroke-width:3.0999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 428,276.62139 C 428,276.62139 457.01739,315.62139 470,315.62139 C 481.98261,318.87139 634.13054,320.6672 652,312.87139 C 661.13441,308.55171 664.46012,302.54729 666,276.62139 C 600.25603,286.39373 497.8192,286.74286 428,276.62139 z"
+ id="path3938"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 466.00273,263.08289 L 484.25264,263.13926 L 494.7163,274.92164 L 465.96644,274.83284 L 466.00273,263.08289 z"
+ id="rect3378"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3990);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3974"
+ width="13.5"
+ height="17"
+ x="537.75"
+ y="251.2464"
+ inkscape:transform-center-x="30" />
+ <rect
+ inkscape:transform-center-x="30"
+ y="251.2464"
+ x="582.5"
+ height="17"
+ width="13.5"
+ id="rect3992"
+ style="opacity:1;fill:url(#linearGradient3994);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:#484848;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 422.25,268.87139 C 487.33333,277.37139 573.16667,279.87139 668.5,268.87139 C 668.5,268.87139 670.30312,275.56827 668.5,277.37139 C 558.76249,291.1089 422.25,280.64171 422.25,277.37139 L 422.25,268.87139 z"
+ id="rect2558"
+ sodipodi:nodetypes="cccsc" />
+ <rect
+ style="opacity:1;fill:#c1c1c1;fill-opacity:1;fill-rule:nonzero;stroke:#404040;stroke-width:3.0365274;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2569"
+ width="94.427879"
+ height="7.236649"
+ x="546.39832"
+ y="177.10637"
+ transform="matrix(0.9947793,0.1020501,-0.1079723,0.9941539,0,0)" />
+ <rect
+ inkscape:transform-center-x="30"
+ y="251.2464"
+ x="559.875"
+ height="17"
+ width="13.5"
+ id="rect3385"
+ style="opacity:1;fill:url(#linearGradient3387);fill-opacity:1;fill-rule:nonzero;stroke:#323232;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <g
+ id="g3401"
+ transform="matrix(0.9246214,0.3808874,-0.3808874,0.9246214,113.30125,-193.16902)"
+ inkscape:transform-center-x="17.590385"
+ inkscape:transform-center-y="-15.415449">
+ <rect
+ inkscape:transform-center-y="-43.888889"
+ transform="matrix(0,1,-1,0,0,0)"
+ style="opacity:1;fill:#b20000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3389"
+ width="19.75"
+ height="27.75"
+ x="193.34448"
+ y="-709" />
+ <rect
+ y="200.59448"
+ x="681.5"
+ height="5.75"
+ width="27.25"
+ id="rect3393"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="193.59448"
+ x="691.25"
+ height="19.5"
+ width="5.75"
+ id="rect3395"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="202.34448"
+ x="681.5"
+ height="2.5"
+ width="27.75"
+ id="rect3397"
+ style="opacity:1;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="193.59448"
+ x="692.5"
+ height="19.25"
+ width="3"
+ id="rect3399"
+ style="opacity:1;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <path
+ style="fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#404040;stroke-width:3.03650045;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 529.42326,227.17914 L 616.35817,235.81552 L 618.07681,241.50986 L 524.14191,231.87348 L 529.42326,227.17914 z"
+ id="rect3466"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3426);fill-opacity:1;fill-rule:nonzero;stroke:#494949;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3418"
+ width="34.5"
+ height="14.5"
+ x="571.14081"
+ y="174.8026"
+ transform="matrix(0.997157,7.5351915e-2,-7.5351915e-2,0.997157,0,0)"
+ inkscape:transform-center-x="-8"
+ inkscape:transform-center-y="2" />
+ <g
+ id="mine"
+ transform="translate(971.11461,237.62715)"
+ inkscape:label="#g3441">
+ <path
+ transform="matrix(0.6341613,0,0,0.6341613,-18.521242,45.718192)"
+ d="M -167.5843,186.54079 A 31.466251,31.466251 0 1 1 -230.5168,186.54079 A 31.466251,31.466251 0 1 1 -167.5843,186.54079 z"
+ sodipodi:ry="31.466251"
+ sodipodi:rx="31.466251"
+ sodipodi:cy="186.54079"
+ sodipodi:cx="-199.05055"
+ id="path2586"
+ style="opacity:1;fill:url(#radialGradient3364);fill-opacity:1;stroke:#131313;stroke-width:3.54799318;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path3382"
+ d="M -155.20193,175.4167 C -157.60085,176.6451 -156.78074,184.26068 -156.78074,184.26068 C -156.78074,184.26068 -148.33787,181.58301 -148.57092,178.60053 C -148.74283,176.40051 -153.23774,174.41092 -155.20193,175.4167 z"
+ style="fill:url(#linearGradient3398);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path3400"
+ d="M -156.56354,153.84532 C -158.96246,152.61693 -158.14235,145.00135 -158.14235,145.00135 C -158.14235,145.00135 -149.69948,147.67902 -149.93253,150.66149 C -150.10444,152.86151 -154.59935,154.85111 -156.56354,153.84532 z"
+ style="fill:url(#linearGradient3402);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path3404"
+ d="M -133.88532,153.68678 C -131.48641,152.45838 -132.30652,144.8428 -132.30652,144.8428 C -132.30652,144.8428 -140.74938,147.52047 -140.51633,150.50295 C -140.34442,152.70297 -135.84951,154.69256 -133.88532,153.68678 z"
+ style="fill:url(#linearGradient3406);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path3408"
+ d="M -134.51948,175.55085 C -132.12057,176.77925 -132.94068,184.39483 -132.94068,184.39483 C -132.94068,184.39483 -141.38355,181.71716 -141.15049,178.73469 C -140.97858,176.53467 -136.48367,174.54507 -134.51948,175.55085 z"
+ style="fill:url(#linearGradient3410);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path3412"
+ d="M -161.25709,168.78221 C -163.22395,170.62484 -170.11427,165.85236 -170.11427,165.85236 C -170.11427,165.85236 -164.7408,160.23808 -162.01257,161.46538 C -160.00011,162.37068 -159.64667,167.27352 -161.25709,168.78221 z"
+ style="fill:url(#linearGradient3414);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccss"
+ id="path3416"
+ d="M -129.17068,169.10464 C -127.20382,170.94727 -120.3135,166.17478 -120.3135,166.17478 C -120.3135,166.17478 -125.68697,160.5605 -128.41519,161.7878 C -130.42766,162.69311 -130.7811,167.59595 -129.17068,169.10464 z"
+ style="fill:url(#linearGradient3418);fill-opacity:1;fill-rule:evenodd;stroke:#131313;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.6341613,0,0,0.6341613,-61.039517,68.324922)"
+ d="M -126,151.21948 A 6.625,6.625 0 1 1 -139.25,151.21948 A 6.625,6.625 0 1 1 -126,151.21948 z"
+ sodipodi:ry="6.625"
+ sodipodi:rx="6.625"
+ sodipodi:cy="151.21948"
+ sodipodi:cx="-132.625"
+ id="path3426"
+ style="opacity:1;fill:url(#radialGradient3439);fill-opacity:1;stroke:#131313;stroke-width:3.54799318;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/submarine.svg b/demos/sub-attaq/pics/scalable/submarine.svg
new file mode 100644
index 0000000..8a0ffdd
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/submarine.svg
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2594">
+ <defs
+ id="defs2596">
+ <linearGradient
+ id="linearGradient3345">
+ <stop
+ id="stop3348"
+ style="stop-color:#898989;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3350"
+ style="stop-color:#9ea1a2;stop-opacity:1"
+ offset="0.44021741" />
+ <stop
+ id="stop3352"
+ style="stop-color:#bbbdbf;stop-opacity:1"
+ offset="0.56799388" />
+ <stop
+ id="stop3354"
+ style="stop-color:#f0f1f2;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="510.99884"
+ y1="161.99408"
+ x2="396.48914"
+ y2="161.99408"
+ id="linearGradient3311"
+ xlink:href="#linearGradient3345"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.466978,0,0,0.4500435,231.58508,159.95135)" />
+ <linearGradient
+ id="linearGradient3532">
+ <stop
+ id="stop3534"
+ style="stop-color:#545454;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3536"
+ style="stop-color:#848788;stop-opacity:1"
+ offset="0.44021741" />
+ <stop
+ id="stop3538"
+ style="stop-color:#9ca0a2;stop-opacity:1"
+ offset="0.56799388" />
+ <stop
+ id="stop3540"
+ style="stop-color:#565d60;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="525"
+ y1="371.09448"
+ x2="525"
+ y2="395.09448"
+ id="linearGradient3520"
+ xlink:href="#linearGradient3532"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5865192,0,0,0.2518015,219.30885,192.6957)" />
+ <linearGradient
+ id="linearGradient3227">
+ <stop
+ id="stop3229"
+ style="stop-color:#444444;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3232"
+ style="stop-color:#b0b0b0;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="543.5"
+ y1="205.19257"
+ x2="587.52002"
+ y2="205.19257"
+ id="linearGradient3812"
+ xlink:href="#linearGradient3227"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1223608,0,0,0.3849769,-137.93938,185.11074)" />
+ <linearGradient
+ id="linearGradient3167">
+ <stop
+ id="stop3169"
+ style="stop-color:#464646;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3345"
+ style="stop-color:#848788;stop-opacity:1"
+ offset="0.44021741" />
+ <stop
+ id="stop3347"
+ style="stop-color:#9ca0a2;stop-opacity:1"
+ offset="0.56799388" />
+ <stop
+ id="stop3171"
+ style="stop-color:#b5babd;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="443.95602"
+ y1="315.31854"
+ x2="443.95602"
+ y2="247.85609"
+ id="linearGradient3175"
+ xlink:href="#linearGradient3167"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4908502,0,0,0.4579593,230.56224,161.8228)" />
+ <linearGradient
+ id="linearGradient3421">
+ <stop
+ id="stop3423"
+ style="stop-color:#444444;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3425"
+ style="stop-color:#444444;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="432.33429"
+ cy="233.80295"
+ r="59.056835"
+ fx="432.33429"
+ fy="233.80295"
+ id="radialGradient3339"
+ xlink:href="#linearGradient3421"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4181493,0,0,0.1282619,265.67128,239.85868)" />
+ <linearGradient
+ id="linearGradient3435">
+ <stop
+ id="stop3437"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3439"
+ style="stop-color:#c0c0c0;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="290.5"
+ cy="244.34448"
+ r="37.5"
+ fx="290.5"
+ fy="244.34448"
+ id="radialGradient3441"
+ xlink:href="#linearGradient3435"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8202102,0.8202102,-0.7960458,0.7960458,246.73838,-189.686)" />
+ </defs>
+ <g
+ id="submarine">
+ <rect
+ width="10.557344"
+ height="6.0432386"
+ x="521.95276"
+ y="286.13785"
+ id="rect3512"
+ style="opacity:1;fill:url(#linearGradient3520);fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:0.56879884;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 472.62489,271.38195 C 472.62489,271.38195 533.23236,235.19412 518.64167,256.75283 C 504.05098,278.31152 504.05098,278.31152 504.05098,278.31152 L 472.62489,271.38195 z"
+ id="path2455"
+ style="fill:url(#linearGradient3812);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.77744257;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 364.84606,263.41905 C 322.73174,271.36528 338.10857,300.23647 381.79153,305.97905 C 431.25896,312.48206 448.02709,310.71241 484.92494,305.97905 C 537.1851,299.27497 537.2581,271.48536 484.92494,262.95644 C 433.55798,254.58499 395.6858,257.60014 364.84606,263.41905 z"
+ id="path2385"
+ style="fill:url(#linearGradient3175);fill-opacity:1;fill-rule:evenodd;stroke:#393939;stroke-width:1.90693891;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 421.75698,267.81211 C 428.13994,285.12832 488.00064,276.42836 466.51218,262.27195 C 466.51218,262.27195 422.9096,268.31187 421.75698,267.81211 z"
+ id="path3403"
+ style="fill:url(#radialGradient3339);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="M 416.97069,261.60997 C 416.97069,276.46141 463.19914,276.0068 463.19914,261.15536 L 463.19914,255.76162 C 463.19914,240.91094 416.97069,233.57552 416.97069,248.4262 L 416.97069,261.60997 z"
+ id="path3291"
+ style="fill:url(#linearGradient3311);fill-opacity:1;fill-rule:evenodd;stroke:#2d2d2d;stroke-width:2.07042313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 341,263.09448 A 37.5,40 0 1 1 266,263.09448 A 37.5,40 0 1 1 341,263.09448 z"
+ transform="matrix(0.692163,0,1.4106583e-2,0.289185,154.89061,202.07342)"
+ id="path3433"
+ style="opacity:1;fill:url(#radialGradient3441);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.227;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 397,316.09448 A 27.5,7 0 1 1 342,316.09448 A 27.5,7 0 1 1 397,316.09448 z"
+ transform="matrix(0.5642633,0,0,0.5642633,227.60762,70.172035)"
+ id="path3458"
+ style="opacity:1;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.06500006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 397,316.09448 A 27.5,7 0 1 1 342,316.09448 A 27.5,7 0 1 1 397,316.09448 z"
+ transform="matrix(0,0.30778,-0.5642633,0,708.24166,183.29531)"
+ id="path3510"
+ style="opacity:1;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:4.23126984;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <use
+ transform="translate(0.5000044,-17.235115)"
+ id="use3544"
+ x="0"
+ y="0"
+ width="1052.3622"
+ height="744.09448"
+ xlink:href="#path3510" />
+ <path
+ d="M 246,366.09448 A 8.5,8 0 1 1 229,366.09448 A 8.5,8 0 1 1 246,366.09448 z"
+ transform="matrix(1.7798114,-4.2997512e-2,1.3318941e-2,0.5513151,76.233334,95.845205)"
+ id="path3584"
+ style="opacity:1;fill:#787878;fill-opacity:1;fill-rule:nonzero;stroke:#1b1e1f;stroke-width:2.38492584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/surface.svg b/demos/sub-attaq/pics/scalable/surface.svg
new file mode 100644
index 0000000..40ed239
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/surface.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2685">
+ <defs
+ id="defs2687">
+ <linearGradient
+ id="linearGradient5097">
+ <stop
+ id="stop5099"
+ style="stop-color:#19a2db;stop-opacity:0"
+ offset="0" />
+ <stop
+ id="stop5109"
+ style="stop-color:#1379a7;stop-opacity:0.49803922"
+ offset="0.30000001" />
+ <stop
+ id="stop5101"
+ style="stop-color:#0e5173;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="590.84674"
+ y1="274.57559"
+ x2="590.84674"
+ y2="334.01376"
+ id="linearGradient5103"
+ xlink:href="#linearGradient5097"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-172.21428,209.55976)"
+ spreadMethod="pad" />
+ </defs>
+ <g
+ id="layer1">
+ <rect
+ width="1053.5891"
+ height="67.882248"
+ x="-172.50883"
+ y="484.13535"
+ id="rect3448"
+ style="opacity:1;fill:url(#linearGradient5103);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/scalable/torpedo.svg b/demos/sub-attaq/pics/scalable/torpedo.svg
new file mode 100644
index 0000000..48e429d
--- /dev/null
+++ b/demos/sub-attaq/pics/scalable/torpedo.svg
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2584">
+ <defs
+ id="defs2586">
+ <linearGradient
+ id="linearGradient3708">
+ <stop
+ id="stop3710"
+ style="stop-color:#202020;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3712"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="518.26996"
+ y1="497.31476"
+ x2="533.02924"
+ y2="497.31476"
+ id="linearGradient3776"
+ xlink:href="#linearGradient3708"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3718">
+ <stop
+ id="stop3720"
+ style="stop-color:#bcbcbc;stop-opacity:0.28169015"
+ offset="0" />
+ <stop
+ id="stop3722"
+ style="stop-color:#bcbcbc;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="516.89508"
+ y1="503.50137"
+ x2="516.89508"
+ y2="543.80646"
+ id="linearGradient3774"
+ xlink:href="#linearGradient3718"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9947644,0,0,1.3346457,2.7877039,-166.60153)" />
+ <linearGradient
+ id="linearGradient3692">
+ <stop
+ id="stop3694"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3696"
+ style="stop-color:#b6b6b6;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="506.95975"
+ y1="469.73706"
+ x2="525.41608"
+ y2="469.73706"
+ id="linearGradient3772"
+ xlink:href="#linearGradient3692"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="506.95975"
+ y1="469.73706"
+ x2="525.41608"
+ y2="469.73706"
+ id="linearGradient2403"
+ xlink:href="#linearGradient3692"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="516.89508"
+ y1="503.50137"
+ x2="516.89508"
+ y2="543.80646"
+ id="linearGradient2405"
+ xlink:href="#linearGradient3718"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9947644,0,0,1.3346457,2.7877039,-166.60153)" />
+ <linearGradient
+ x1="518.26996"
+ y1="497.31476"
+ x2="533.02924"
+ y2="497.31476"
+ id="linearGradient2407"
+ xlink:href="#linearGradient3708"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <g
+ transform="translate(-128.69958,6.6568748)"
+ id="torpedo">
+ <g
+ transform="matrix(0.8830571,0,0,0.8830571,-119.78327,177.67947)"
+ id="g3525">
+ <path
+ d="M 523.9661,469.73706 A 7.7781744,34.648232 0 1 1 508.40975,469.73706 A 7.7781744,34.648232 0 1 1 523.9661,469.73706 z"
+ id="path3682"
+ style="opacity:1;fill:url(#linearGradient2403);fill-opacity:1;fill-rule:nonzero;stroke:#272727;stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <g
+ id="g3754">
+ <rect
+ width="33.58757"
+ height="59.927299"
+ x="498.86386"
+ y="497.84454"
+ id="rect3716"
+ style="opacity:1;fill:url(#linearGradient2405);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 523.35045,482.89424 C 523.35045,482.89424 532.31256,488.20203 532.02344,500.14638 C 531.73431,512.09072 531.73431,511.73417 531.73431,511.73417 C 531.73431,511.73417 520.70627,493.83104 519.26887,499.77636 L 523.35045,482.89424 z"
+ id="path3704"
+ style="fill:url(#linearGradient2407);fill-opacity:1;fill-rule:evenodd;stroke:#1f1f1f;stroke-width:1.99788344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ d="M 508.50327,482.89424 C 508.50327,482.89424 499.54116,488.20203 499.83028,500.14638 C 500.11941,512.09072 500.11941,511.73417 500.11941,511.73417 C 500.11941,511.73417 511.14745,493.83104 512.58485,499.77636 L 508.50327,482.89424 z"
+ id="path3706"
+ style="fill:#bcbcbc;fill-opacity:1;fill-rule:evenodd;stroke:#1f1f1f;stroke-width:1.99788344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/demos/sub-attaq/pics/small/background.png b/demos/sub-attaq/pics/small/background.png
new file mode 100644
index 0000000..5ad3db6
--- /dev/null
+++ b/demos/sub-attaq/pics/small/background.png
Binary files differ
diff --git a/demos/sub-attaq/pics/small/boat.png b/demos/sub-attaq/pics/small/boat.png
new file mode 100644
index 0000000..114ccc3
--- /dev/null
+++ b/demos/sub-attaq/pics/small/boat.png
Binary files differ
diff --git a/demos/sub-attaq/pics/small/bomb.png b/demos/sub-attaq/pics/small/bomb.png
new file mode 100644
index 0000000..3af5f2f
--- /dev/null
+++ b/demos/sub-attaq/pics/small/bomb.png
Binary files differ
diff --git a/demos/sub-attaq/pics/small/submarine.png b/demos/sub-attaq/pics/small/submarine.png
new file mode 100644
index 0000000..0c0c350
--- /dev/null
+++ b/demos/sub-attaq/pics/small/submarine.png
Binary files differ
diff --git a/demos/sub-attaq/pics/small/surface.png b/demos/sub-attaq/pics/small/surface.png
new file mode 100644
index 0000000..06d0e47
--- /dev/null
+++ b/demos/sub-attaq/pics/small/surface.png
Binary files differ
diff --git a/demos/sub-attaq/pics/small/torpedo.png b/demos/sub-attaq/pics/small/torpedo.png
new file mode 100644
index 0000000..f9c2687
--- /dev/null
+++ b/demos/sub-attaq/pics/small/torpedo.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-a.png b/demos/sub-attaq/pics/welcome/logo-a.png
new file mode 100644
index 0000000..67dd76d
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-a.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-a2.png b/demos/sub-attaq/pics/welcome/logo-a2.png
new file mode 100644
index 0000000..17668b0
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-a2.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-b.png b/demos/sub-attaq/pics/welcome/logo-b.png
new file mode 100644
index 0000000..cf6c045
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-b.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-dash.png b/demos/sub-attaq/pics/welcome/logo-dash.png
new file mode 100644
index 0000000..219233c
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-dash.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-excl.png b/demos/sub-attaq/pics/welcome/logo-excl.png
new file mode 100644
index 0000000..8dd0a2e
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-excl.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-q.png b/demos/sub-attaq/pics/welcome/logo-q.png
new file mode 100644
index 0000000..86e588d
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-q.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-s.png b/demos/sub-attaq/pics/welcome/logo-s.png
new file mode 100644
index 0000000..7b6a36e
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-s.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-t.png b/demos/sub-attaq/pics/welcome/logo-t.png
new file mode 100644
index 0000000..b2e3526
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-t.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-t2.png b/demos/sub-attaq/pics/welcome/logo-t2.png
new file mode 100644
index 0000000..b11a778
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-t2.png
Binary files differ
diff --git a/demos/sub-attaq/pics/welcome/logo-u.png b/demos/sub-attaq/pics/welcome/logo-u.png
new file mode 100644
index 0000000..24eede8
--- /dev/null
+++ b/demos/sub-attaq/pics/welcome/logo-u.png
Binary files differ
diff --git a/demos/sub-attaq/pixmapitem.cpp b/demos/sub-attaq/pixmapitem.cpp
new file mode 100644
index 0000000..87c2ee3
--- /dev/null
+++ b/demos/sub-attaq/pixmapitem.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "pixmapitem.h"
+
+//Qt
+#include <QtCore/QDir>
+
+PixmapItem::PixmapItem(const QString &fileName,GraphicsScene::Mode mode, QGraphicsItem * parent) : QGraphicsPixmapItem(parent),name(fileName)
+{
+ loadPixmap(mode);
+}
+
+void PixmapItem::loadPixmap(GraphicsScene::Mode mode)
+{
+ if (mode == GraphicsScene::Big)
+ setPixmap(":/big/" + name);
+ else
+ setPixmap(":/small/" + name);
+}
diff --git a/demos/sub-attaq/pixmapitem.h b/demos/sub-attaq/pixmapitem.h
new file mode 100644
index 0000000..8edbd8e
--- /dev/null
+++ b/demos/sub-attaq/pixmapitem.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __PIXMAPITEM__H__
+#define __PIXMAPITEM__H__
+
+//Own
+#include "graphicsscene.h"
+
+//Qt
+#include <QtGui/QGraphicsPixmapItem>
+
+class PixmapItem : public QGraphicsPixmapItem
+{
+public:
+ PixmapItem(const QString &fileName, GraphicsScene::Mode mode, QGraphicsItem * parent = 0);
+
+private:
+ void loadPixmap(GraphicsScene::Mode mode);
+
+ QString name;
+ QPixmap pixmap;
+};
+
+#endif //__PIXMAPITEM__H__
diff --git a/demos/sub-attaq/progressitem.cpp b/demos/sub-attaq/progressitem.cpp
new file mode 100644
index 0000000..33b8928
--- /dev/null
+++ b/demos/sub-attaq/progressitem.cpp
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "progressitem.h"
+#include "pixmapitem.h"
+
+ProgressItem::ProgressItem (QGraphicsItem * parent)
+ : QGraphicsTextItem(parent), currentLevel(1), currentScore(0)
+{
+ setFont(QFont("Comic Sans MS"));
+ setPos(parentItem()->boundingRect().topRight() - QPointF(180, -5));
+}
+
+void ProgressItem::setLevel(int level)
+{
+ currentLevel = level;
+ updateProgress();
+}
+
+void ProgressItem::setScore(int score)
+{
+ currentScore = score;
+ updateProgress();
+}
+
+void ProgressItem::updateProgress()
+{
+ setHtml(QString("Level : %1 Score : %2").arg(currentLevel).arg(currentScore));
+}
diff --git a/demos/sub-attaq/progressitem.h b/demos/sub-attaq/progressitem.h
new file mode 100644
index 0000000..1da329c
--- /dev/null
+++ b/demos/sub-attaq/progressitem.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PROGRESSITEM_H
+#define PROGRESSITEM_H
+
+//Qt
+#include <QtGui/QGraphicsTextItem>
+
+class ProgressItem : public QGraphicsTextItem
+{
+public:
+ ProgressItem(QGraphicsItem * parent = 0);
+ void setLevel(int level);
+ void setScore(int score);
+
+private:
+ void updateProgress();
+ int currentLevel;
+ int currentScore;
+};
+
+#endif // PROGRESSITEM_H
diff --git a/demos/sub-attaq/qanimationstate.cpp b/demos/sub-attaq/qanimationstate.cpp
new file mode 100644
index 0000000..a031da6
--- /dev/null
+++ b/demos/sub-attaq/qanimationstate.cpp
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qanimationstate.h"
+
+#include <QtCore/qstate.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+\class QAnimationState
+
+\brief The QAnimationState class provides state that handle an animation and emit
+a signal when this animation is finished.
+
+\ingroup statemachine
+
+QAnimationState provides a state that handle an animation. It will start this animation
+when the state is entered and stop it when it is leaved. When the animation has finished the
+state emit animationFinished signal.
+QAnimationState is part of \l{The State Machine Framework}.
+
+\code
+QStateMachine machine;
+QAnimationState *s = new QAnimationState(machine->rootState());
+QPropertyAnimation *animation = new QPropertyAnimation(obj, "pos");
+s->setAnimation(animation);
+QState *s2 = new QState(machine->rootState());
+s->addTransition(s, SIGNAL(animationFinished()), s2);
+machine.start();
+\endcode
+
+\sa QState, {The Animation Framework}
+*/
+
+
+#ifndef QT_NO_ANIMATION
+
+/*!
+ Constructs a new state with the given \a parent state.
+*/
+QAnimationState::QAnimationState(QState *parent)
+ : QState(parent), m_animation(0)
+{
+}
+
+/*!
+ Destroys the animation state.
+*/
+QAnimationState::~QAnimationState()
+{
+}
+
+/*!
+ Set an \a animation for this QAnimationState. If an animation was previously handle by this
+ state then it won't emit animationFinished for the old animation. The QAnimationState doesn't
+ take the ownership of the animation.
+*/
+void QAnimationState::setAnimation(QAbstractAnimation *animation)
+{
+ if (animation == m_animation)
+ return;
+
+ //Disconnect from the previous animation if exist
+ if(m_animation)
+ disconnect(m_animation, SIGNAL(finished()), this, SIGNAL(animationFinished()));
+
+ m_animation = animation;
+
+ if (m_animation) {
+ //connect the new animation
+ connect(m_animation, SIGNAL(finished()), this, SIGNAL(animationFinished()));
+ }
+}
+
+/*!
+ Returns the animation handle by this animation state, or 0 if there is no animation.
+*/
+QAbstractAnimation* QAnimationState::animation() const
+{
+ return m_animation;
+}
+
+/*!
+ \reimp
+*/
+void QAnimationState::onEntry(QEvent *)
+{
+ if (m_animation)
+ m_animation->start();
+}
+
+/*!
+ \reimp
+*/
+void QAnimationState::onExit(QEvent *)
+{
+ if (m_animation)
+ m_animation->stop();
+}
+
+/*!
+ \reimp
+*/
+bool QAnimationState::event(QEvent *e)
+{
+ return QState::event(e);
+}
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/demos/sub-attaq/qanimationstate.h b/demos/sub-attaq/qanimationstate.h
new file mode 100644
index 0000000..140bba3
--- /dev/null
+++ b/demos/sub-attaq/qanimationstate.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QANIMATIONSTATE_H
+#define QANIMATIONSTATE_H
+
+#ifndef QT_STATEMACHINE_SOLUTION
+# include <QtCore/qstate.h>
+# include <QtCore/qabstractanimation.h>
+#else
+# include "qstate.h"
+# include "qabstractanimation.h"
+#endif
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+#ifndef QT_NO_ANIMATION
+
+class QAbstractAnimation;
+
+class QAnimationState : public QState
+{
+ Q_OBJECT
+public:
+ QAnimationState(QState *parent = 0);
+ ~QAnimationState();
+
+ void setAnimation(QAbstractAnimation *animation);
+ QAbstractAnimation* animation() const;
+
+signals:
+ void animationFinished();
+
+protected:
+ void onEntry(QEvent *);
+ void onExit(QEvent *);
+ bool event(QEvent *e);
+
+private:
+ Q_DISABLE_COPY(QAnimationState)
+ QAbstractAnimation *m_animation;
+};
+
+#endif
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QANIMATIONSTATE_H
diff --git a/demos/sub-attaq/states.cpp b/demos/sub-attaq/states.cpp
new file mode 100644
index 0000000..5c809cb
--- /dev/null
+++ b/demos/sub-attaq/states.cpp
@@ -0,0 +1,342 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "states.h"
+#include "graphicsscene.h"
+#include "boat.h"
+#include "submarine.h"
+#include "torpedo.h"
+#include "animationmanager.h"
+#include "progressitem.h"
+#include "textinformationitem.h"
+
+//Qt
+#include <QtGui/QMessageBox>
+#include <QtGui/QGraphicsView>
+#include <QtCore/QStateMachine>
+#include <QtGui/QKeyEventTransition>
+#include <QtCore/QSignalEvent>
+#include <QtCore/QFinalState>
+
+PlayState::PlayState(GraphicsScene *scene, QState *parent)
+ : QState(parent),
+ scene(scene),
+ machine(0),
+ currentLevel(0),
+ score(0)
+{
+}
+
+PlayState::~PlayState()
+{
+}
+
+void PlayState::onEntry(QEvent *)
+{
+ //We are now playing?
+ if (machine) {
+ machine->stop();
+ scene->clearScene();
+ currentLevel = 0;
+ score = 0;
+ delete machine;
+ }
+
+ machine = new QStateMachine(this);
+
+ //This state is when player is playing
+ LevelState *levelState = new LevelState(scene, this, machine);
+
+ //This state is when the player is actually playing but the game is not paused
+ QState *playingState = new QState(levelState);
+ levelState->setInitialState(playingState);
+
+ //This state is when the game is paused
+ PauseState *pauseState = new PauseState(scene, levelState);
+
+ //We have one view, it receive the key press event
+ QKeyEventTransition *pressPplay = new QKeyEventTransition(scene->views().at(0), QEvent::KeyPress, Qt::Key_P);
+ pressPplay->setTargetState(pauseState);
+ QKeyEventTransition *pressPpause = new QKeyEventTransition(scene->views().at(0), QEvent::KeyPress, Qt::Key_P);
+ pressPpause->setTargetState(playingState);
+
+ //Pause "P" is triggered, the player pause the game
+ playingState->addTransition(pressPplay);
+
+ //To get back playing when the game has been paused
+ pauseState->addTransition(pressPpause);
+
+ //This state is when player have lost
+ LostState *lostState = new LostState(scene, this, machine);
+
+ //This state is when player have won
+ WinState *winState = new WinState(scene, this, machine);
+
+ //The boat has been destroyed then the game is finished
+ levelState->addTransition(scene->boat, SIGNAL(boatExecutionFinished()),lostState);
+
+ //This transition check if we won or not
+ WinTransition *winTransition = new WinTransition(scene, this, winState);
+
+ //The boat has been destroyed then the game is finished
+ levelState->addTransition(winTransition);
+
+ //This state is an animation when the score changed
+ UpdateScoreState *scoreState = new UpdateScoreState(this, levelState);
+
+ //This transition update the score when a submarine die
+ UpdateScoreTransition *scoreTransition = new UpdateScoreTransition(scene, this, levelState);
+ scoreTransition->setTargetState(scoreState);
+
+ //The boat has been destroyed then the game is finished
+ playingState->addTransition(scoreTransition);
+
+ //We go back to play state
+ scoreState->addTransition(playingState);
+
+ //We start playing!!!
+ machine->setInitialState(levelState);
+
+ //Final state
+ QFinalState *final = new QFinalState(machine);
+
+ //This transition is triggered when the player press space after completing a level
+ CustomSpaceTransition *spaceTransition = new CustomSpaceTransition(scene->views().at(0), this, QEvent::KeyPress, Qt::Key_Space);
+ spaceTransition->setTargetState(levelState);
+ winState->addTransition(spaceTransition);
+
+ //We lost we should reach the final state
+ lostState->addTransition(lostState, SIGNAL(finished()), final);
+
+ machine->start();
+}
+
+LevelState::LevelState(GraphicsScene *scene, PlayState *game, QState *parent) : QState(parent), scene(scene), game(game)
+{
+}
+void LevelState::onEntry(QEvent *)
+{
+ initializeLevel();
+}
+
+void LevelState::initializeLevel()
+{
+ //we re-init the boat
+ scene->boat->setPos(scene->width()/2, scene->sealLevel() - scene->boat->size().height());
+ scene->boat->setCurrentSpeed(0);
+ scene->boat->setCurrentDirection(Boat::None);
+ scene->boat->setBombsLaunched(0);
+ scene->boat->show();
+ scene->setFocusItem(scene->boat,Qt::OtherFocusReason);
+ scene->boat->run();
+
+ scene->progressItem->setScore(game->score);
+ scene->progressItem->setLevel(game->currentLevel + 1);
+
+ GraphicsScene::LevelDescription currentLevelDescription = scene->levelsData.value(game->currentLevel);
+
+ for (int i = 0; i < currentLevelDescription.submarines.size(); ++i ) {
+
+ QPair<int,int> subContent = currentLevelDescription.submarines.at(i);
+ GraphicsScene::SubmarineDescription submarineDesc = scene->submarinesData.at(subContent.first);
+
+ for (int j = 0; j < subContent.second; ++j ) {
+ SubMarine *sub = new SubMarine(submarineDesc.type, submarineDesc.name, submarineDesc.points);
+ scene->addItem(sub);
+ int random = (qrand() % 15 + 1);
+ qreal x = random == 13 || random == 5 ? 0 : scene->width() - sub->size().width();
+ qreal y = scene->height() -(qrand() % 150 + 1) - sub->size().height();
+ sub->setPos(x,y);
+ sub->setCurrentDirection(x == 0 ? SubMarine::Right : SubMarine::Left);
+ sub->setCurrentSpeed(qrand() % 3 + 1);
+ }
+ }
+}
+
+/** Pause State */
+PauseState::PauseState(GraphicsScene *scene, QState *parent) : QState(parent),scene(scene)
+{
+}
+void PauseState::onEntry(QEvent *)
+{
+ AnimationManager::self()->pauseAll();
+ scene->boat->setEnabled(false);
+}
+void PauseState::onExit(QEvent *)
+{
+ AnimationManager::self()->resumeAll();
+ scene->boat->setEnabled(true);
+ scene->boat->setFocus();
+}
+
+/** Lost State */
+LostState::LostState(GraphicsScene *scene, PlayState *game, QState *parent) : QState(parent), scene(scene), game(game)
+{
+}
+
+void LostState::onEntry(QEvent *)
+{
+ //The message to display
+ QString message = QString("You lose on level %1. Your score is %2.").arg(game->currentLevel+1).arg(game->score);
+
+ //We set the level back to 0
+ game->currentLevel = 0;
+
+ //We set the score back to 0
+ game->score = 0;
+
+ //We clear the scene
+ scene->clearScene();
+
+ //We inform the player
+ scene->textInformationItem->setMessage(message);
+ scene->textInformationItem->show();
+}
+
+void LostState::onExit(QEvent *)
+{
+ //we hide the information
+ scene->textInformationItem->hide();
+}
+
+/** Win State */
+WinState::WinState(GraphicsScene *scene, PlayState *game, QState *parent) : QState(parent), scene(scene), game(game)
+{
+}
+
+void WinState::onEntry(QEvent *)
+{
+ //We clear the scene
+ scene->clearScene();
+
+ QString message;
+ if (scene->levelsData.size() - 1 != game->currentLevel) {
+ message = QString("You win the level %1. Your score is %2.\nPress Space to continue.").arg(game->currentLevel+1).arg(game->score);
+ //We increment the level number
+ game->currentLevel++;
+ } else {
+ message = QString("You finish the game on level %1. Your score is %2.").arg(game->currentLevel+1).arg(game->score);
+ //We set the level back to 0
+ game->currentLevel = 0;
+ //We set the score back to 0
+ game->score = 0;
+ }
+
+ //We inform the player
+ scene->textInformationItem->setMessage(message);
+ scene->textInformationItem->show();
+}
+
+void WinState::onExit(QEvent *)
+{
+ //we hide the information
+ scene->textInformationItem->hide();
+}
+
+/** UpdateScore State */
+UpdateScoreState::UpdateScoreState(PlayState *game, QState *parent) : QState(parent)
+{
+ this->game = game;
+}
+void UpdateScoreState::onEntry(QEvent *e)
+{
+ QState::onEntry(e);
+}
+
+/** Win transition */
+UpdateScoreTransition::UpdateScoreTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target)
+ : QSignalTransition(scene,SIGNAL(subMarineDestroyed(int))),
+ game(game), scene(scene)
+{
+ setTargetState(target);
+}
+
+bool UpdateScoreTransition::eventTest(QEvent *event)
+{
+ if (!QSignalTransition::eventTest(event))
+ return false;
+ else {
+ QSignalEvent *se = static_cast<QSignalEvent*>(event);
+ game->score += se->arguments().at(0).toInt();
+ scene->progressItem->setScore(game->score);
+ return true;
+ }
+}
+
+/** Win transition */
+WinTransition::WinTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target)
+ : QSignalTransition(scene,SIGNAL(allSubMarineDestroyed(int))),
+ game(game), scene(scene)
+{
+ setTargetState(target);
+}
+
+bool WinTransition::eventTest(QEvent *event)
+{
+ if (!QSignalTransition::eventTest(event))
+ return false;
+ else {
+ QSignalEvent *se = static_cast<QSignalEvent*>(event);
+ game->score += se->arguments().at(0).toInt();
+ scene->progressItem->setScore(game->score);
+ return true;
+ }
+}
+
+/** Space transition */
+CustomSpaceTransition::CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key)
+ : QKeyEventTransition(widget, type, key),
+ game(game)
+{
+}
+
+bool CustomSpaceTransition::eventTest(QEvent *event)
+{
+ Q_UNUSED(event);
+ if (!QKeyEventTransition::eventTest(event))
+ return false;
+ if (game->currentLevel != 0)
+ return true;
+ else
+ return false;
+
+}
diff --git a/demos/sub-attaq/states.h b/demos/sub-attaq/states.h
new file mode 100644
index 0000000..3176571
--- /dev/null
+++ b/demos/sub-attaq/states.h
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef STATES_H
+#define STATES_H
+
+//Qt
+#include <QtCore/QState>
+#include <QtCore/QSignalTransition>
+#include <QtCore/QPropertyAnimation>
+#include <QtGui/QKeyEventTransition>
+#include <QtCore/QSet>
+
+class GraphicsScene;
+class Boat;
+class SubMarine;
+QT_BEGIN_NAMESPACE
+class QStateMachine;
+QT_END_NAMESPACE
+
+class PlayState : public QState
+{
+public:
+ PlayState(GraphicsScene *scene, QState *parent = 0);
+ ~PlayState();
+
+ protected:
+ void onEntry(QEvent *);
+
+private :
+ GraphicsScene *scene;
+ QStateMachine *machine;
+ int currentLevel;
+ int score;
+ QState *parallelChild;
+
+ friend class UpdateScoreState;
+ friend class UpdateScoreTransition;
+ friend class WinTransition;
+ friend class CustomSpaceTransition;
+ friend class WinState;
+ friend class LostState;
+ friend class LevelState;
+};
+
+class LevelState : public QState
+{
+public:
+ LevelState(GraphicsScene *scene, PlayState *game, QState *parent = 0);
+protected:
+ void onEntry(QEvent *);
+private :
+ void initializeLevel();
+ GraphicsScene *scene;
+ PlayState *game;
+};
+
+class PauseState : public QState
+{
+public:
+ PauseState(GraphicsScene *scene, QState *parent = 0);
+
+protected:
+ void onEntry(QEvent *);
+ void onExit(QEvent *);
+private :
+ GraphicsScene *scene;
+ Boat *boat;
+};
+
+class LostState : public QState
+{
+public:
+ LostState(GraphicsScene *scene, PlayState *game, QState *parent = 0);
+
+protected:
+ void onEntry(QEvent *);
+ void onExit(QEvent *);
+private :
+ GraphicsScene *scene;
+ PlayState *game;
+};
+
+class WinState : public QState
+{
+public:
+ WinState(GraphicsScene *scene, PlayState *game, QState *parent = 0);
+
+protected:
+ void onEntry(QEvent *);
+ void onExit(QEvent *);
+private :
+ GraphicsScene *scene;
+ PlayState *game;
+};
+
+class UpdateScoreState : public QState
+{
+public:
+ UpdateScoreState(PlayState *game, QState *parent);
+protected:
+ void onEntry(QEvent *);
+private:
+ QPropertyAnimation *scoreAnimation;
+ PlayState *game;
+};
+
+//These transtion is used to update the score
+class UpdateScoreTransition : public QSignalTransition
+{
+public:
+ UpdateScoreTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target);
+protected:
+ virtual bool eventTest(QEvent *event);
+private:
+ PlayState * game;
+ GraphicsScene *scene;
+};
+
+//These transtion test if we have won the game
+class WinTransition : public QSignalTransition
+{
+public:
+ WinTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target);
+protected:
+ virtual bool eventTest(QEvent *event);
+private:
+ PlayState * game;
+ GraphicsScene *scene;
+};
+
+//These transtion is true if one level has been completed and the player want to continue
+ class CustomSpaceTransition : public QKeyEventTransition
+{
+public:
+ CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key);
+protected:
+ virtual bool eventTest(QEvent *event);
+private:
+ PlayState *game;
+ int key;
+};
+
+#endif // STATES_H
diff --git a/demos/sub-attaq/sub-attaq.pro b/demos/sub-attaq/sub-attaq.pro
new file mode 100644
index 0000000..ba2b54b
--- /dev/null
+++ b/demos/sub-attaq/sub-attaq.pro
@@ -0,0 +1,43 @@
+contains(QT_CONFIG, opengl):QT += opengl
+HEADERS += boat.h \
+ bomb.h \
+ mainwindow.h \
+ submarine.h \
+ torpedo.h \
+ pixmapitem.h \
+ graphicsscene.h \
+ animationmanager.h \
+ states.h \
+ boat_p.h \
+ submarine_p.h \
+ custompropertyanimation.h \
+ qanimationstate.h \
+ progressitem.h \
+ textinformationitem.h
+SOURCES += boat.cpp \
+ bomb.cpp \
+ main.cpp \
+ mainwindow.cpp \
+ submarine.cpp \
+ torpedo.cpp \
+ pixmapitem.cpp \
+ graphicsscene.cpp \
+ animationmanager.cpp \
+ states.cpp \
+ custompropertyanimation.cpp \
+ qanimationstate.cpp \
+ progressitem.cpp \
+ textinformationitem.cpp
+RESOURCES += subattaq.qrc
+
+# install
+target.path = $$[QT_INSTALL_DEMOS]/animation/sub-attaq
+sources.files = $$SOURCES \
+ $$HEADERS \
+ $$RESOURCES \
+ $$FORMS \
+ sub-attaq.pro \
+ pics
+sources.path = $$[QT_INSTALL_DEMOS]/animation/sub-attaq
+INSTALLS += target \
+ sources
diff --git a/demos/sub-attaq/subattaq.qrc b/demos/sub-attaq/subattaq.qrc
new file mode 100644
index 0000000..80a3af1
--- /dev/null
+++ b/demos/sub-attaq/subattaq.qrc
@@ -0,0 +1,39 @@
+<RCC>
+ <qresource prefix="/" >
+ <file alias="all" >pics/scalable/sub-attaq.svg</file>
+ <file alias="submarine" >pics/scalable/submarine.svg</file>
+ <file alias="boat" >pics/scalable/boat.svg</file>
+ <file alias="torpedo" >pics/scalable/torpedo.svg</file>
+ <file alias="logo-s" >pics/welcome/logo-s.png</file>
+ <file alias="logo-u" >pics/welcome/logo-u.png</file>
+ <file alias="logo-b" >pics/welcome/logo-b.png</file>
+ <file alias="logo-dash" >pics/welcome/logo-dash.png</file>
+ <file alias="logo-a" >pics/welcome/logo-a.png</file>
+ <file alias="logo-t" >pics/welcome/logo-t.png</file>
+ <file alias="logo-t2" >pics/welcome/logo-t2.png</file>
+ <file alias="logo-a2" >pics/welcome/logo-a2.png</file>
+ <file alias="logo-q" >pics/welcome/logo-q.png</file>
+ <file alias="logo-excl" >pics/welcome/logo-excl.png</file>
+ <file alias="big/background" >pics/big/background.png</file>
+ <file alias="big/boat" >pics/big/boat.png</file>
+ <file alias="big/bomb" >pics/big/bomb.png</file>
+ <file alias="big/submarine" >pics/big/submarine.png</file>
+ <file alias="big/surface" >pics/big/surface.png</file>
+ <file alias="big/torpedo" >pics/big/torpedo.png</file>
+ <file alias="small/background" >pics/small/background.png</file>
+ <file alias="small/boat" >pics/small/boat.png</file>
+ <file alias="small/bomb" >pics/small/bomb.png</file>
+ <file alias="small/submarine" >pics/small/submarine.png</file>
+ <file alias="small/surface" >pics/small/surface.png</file>
+ <file alias="small/torpedo" >pics/small/torpedo.png</file>
+ <file alias="big/explosion/boat/step1" >pics/big/explosion/boat/step1.png</file>
+ <file alias="big/explosion/boat/step2" >pics/big/explosion/boat/step2.png</file>
+ <file alias="big/explosion/boat/step3" >pics/big/explosion/boat/step3.png</file>
+ <file alias="big/explosion/boat/step4" >pics/big/explosion/boat/step4.png</file>
+ <file alias="big/explosion/submarine/step1" >pics/big/explosion/submarine/step1.png</file>
+ <file alias="big/explosion/submarine/step2" >pics/big/explosion/submarine/step2.png</file>
+ <file alias="big/explosion/submarine/step3" >pics/big/explosion/submarine/step3.png</file>
+ <file alias="big/explosion/submarine/step4" >pics/big/explosion/submarine/step4.png</file>
+ <file>data.xml</file>
+ </qresource>
+</RCC>
diff --git a/demos/sub-attaq/submarine.cpp b/demos/sub-attaq/submarine.cpp
new file mode 100644
index 0000000..2e19b67
--- /dev/null
+++ b/demos/sub-attaq/submarine.cpp
@@ -0,0 +1,218 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "submarine.h"
+#include "submarine_p.h"
+#include "torpedo.h"
+#include "pixmapitem.h"
+#include "graphicsscene.h"
+#include "animationmanager.h"
+#include "custompropertyanimation.h"
+#include "qanimationstate.h"
+
+#include <QtCore/QPropertyAnimation>
+#include <QtCore/QStateMachine>
+#include <QtCore/QFinalState>
+#include <QtCore/QSequentialAnimationGroup>
+
+static QAbstractAnimation *setupDestroyAnimation(SubMarine *sub)
+{
+ QSequentialAnimationGroup *group = new QSequentialAnimationGroup(sub);
+#if QT_VERSION >=0x040500
+ PixmapItem *step1 = new PixmapItem(QString("explosion/submarine/step1"),GraphicsScene::Big, sub);
+ step1->setZValue(6);
+ PixmapItem *step2 = new PixmapItem(QString("explosion/submarine/step2"),GraphicsScene::Big, sub);
+ step2->setZValue(6);
+ PixmapItem *step3 = new PixmapItem(QString("explosion/submarine/step3"),GraphicsScene::Big, sub);
+ step3->setZValue(6);
+ PixmapItem *step4 = new PixmapItem(QString("explosion/submarine/step4"),GraphicsScene::Big, sub);
+ step4->setZValue(6);
+ step1->setOpacity(0);
+ step2->setOpacity(0);
+ step3->setOpacity(0);
+ step4->setOpacity(0);
+ CustomPropertyAnimation *anim1 = new CustomPropertyAnimation(sub);
+ anim1->setMemberFunctions((QGraphicsItem*)step1, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim1->setDuration(100);
+ anim1->setEndValue(1);
+ CustomPropertyAnimation *anim2 = new CustomPropertyAnimation(sub);
+ anim2->setMemberFunctions((QGraphicsItem*)step2, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim2->setDuration(100);
+ anim2->setEndValue(1);
+ CustomPropertyAnimation *anim3 = new CustomPropertyAnimation(sub);
+ anim3->setMemberFunctions((QGraphicsItem*)step3, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim3->setDuration(100);
+ anim3->setEndValue(1);
+ CustomPropertyAnimation *anim4 = new CustomPropertyAnimation(sub);
+ anim4->setMemberFunctions((QGraphicsItem*)step4, &QGraphicsItem::opacity, &QGraphicsItem::setOpacity);
+ anim4->setDuration(100);
+ anim4->setEndValue(1);
+ group->addAnimation(anim1);
+ group->addAnimation(anim2);
+ group->addAnimation(anim3);
+ group->addAnimation(anim4);
+#else
+ // work around for a bug where we don't transition if the duration is zero.
+ QtPauseAnimation *anim = new QtPauseAnimation(group);
+ anim->setDuration(1);
+ group->addAnimation(anim);
+#endif
+ AnimationManager::self()->registerAnimation(group);
+ return group;
+}
+
+
+SubMarine::SubMarine(int type, const QString &name, int points, QGraphicsItem * parent, Qt::WindowFlags wFlags)
+ : QGraphicsWidget(parent,wFlags), subType(type), subName(name), subPoints(points), speed(0), direction(SubMarine::None)
+{
+ pixmapItem = new PixmapItem(QString("submarine"),GraphicsScene::Big, this);
+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ setZValue(5);
+ setFlags(QGraphicsItem::ItemIsMovable);
+ resize(pixmapItem->boundingRect().width(),pixmapItem->boundingRect().height());
+ setTransformOriginPoint(boundingRect().center());
+
+ graphicsRotation = new QGraphicsRotation(this);
+ graphicsRotation->setAxis(QVector3D(0, 1, 0));
+ graphicsRotation->setOrigin(QVector3D(size().width()/2, size().height()/2, 0));
+ QList<QGraphicsTransform *> r;
+ r.append(graphicsRotation);
+ setTransformations(r);
+
+ //We setup the state machine of the submarine
+ QStateMachine *machine = new QStateMachine(this);
+
+ //This state is when the boat is moving/rotating
+ QState *moving = new QState(machine);
+
+ //This state is when the boat is moving from left to right
+ MovementState *movement = new MovementState(this, moving);
+
+ //This state is when the boat is moving from left to right
+ ReturnState *rotation = new ReturnState(this, moving);
+
+ //This is the initial state of the moving root state
+ moving->setInitialState(movement);
+
+ movement->addTransition(this, SIGNAL(subMarineStateChanged()), moving);
+
+ //This is the initial state of the machine
+ machine->setInitialState(moving);
+
+ //End
+ QFinalState *final = new QFinalState(machine);
+
+ //If the moving animation is finished we move to the return state
+ movement->addTransition(movement, SIGNAL(animationFinished()), rotation);
+
+ //If the return animation is finished we move to the moving state
+ rotation->addTransition(rotation, SIGNAL(animationFinished()), movement);
+
+ //This state play the destroyed animation
+ QAnimationState *destroyedState = new QAnimationState(machine);
+ destroyedState->setAnimation(setupDestroyAnimation(this));
+
+ //Play a nice animation when the submarine is destroyed
+ moving->addTransition(this, SIGNAL(subMarineDestroyed()), destroyedState);
+
+ //Transition to final state when the destroyed animation is finished
+ destroyedState->addTransition(destroyedState, SIGNAL(animationFinished()), final);
+
+ //The machine has finished to be executed, then the submarine is dead
+ connect(machine,SIGNAL(finished()),this, SIGNAL(subMarineExecutionFinished()));
+
+ machine->start();
+}
+
+int SubMarine::points()
+{
+ return subPoints;
+}
+
+void SubMarine::setCurrentDirection(SubMarine::Movement direction)
+{
+ if (this->direction == direction)
+ return;
+ if (direction == SubMarine::Right && this->direction == SubMarine::None) {
+ graphicsRotation->setAngle(180);
+ }
+ this->direction = direction;
+}
+
+enum SubMarine::Movement SubMarine::currentDirection() const
+{
+ return direction;
+}
+
+void SubMarine::setCurrentSpeed(int speed)
+{
+ if (speed < 0 || speed > 3) {
+ qWarning("SubMarine::setCurrentSpeed : The speed is invalid");
+ }
+ this->speed = speed;
+ emit subMarineStateChanged();
+}
+
+int SubMarine::currentSpeed() const
+{
+ return speed;
+}
+
+void SubMarine::launchTorpedo(int speed)
+{
+ Torpedo * torp = new Torpedo();
+ GraphicsScene *scene = static_cast<GraphicsScene *>(this->scene());
+ scene->addItem(torp);
+ torp->setPos(x(), y());
+ torp->setCurrentSpeed(speed);
+ torp->launch();
+}
+
+void SubMarine::destroy()
+{
+ emit subMarineDestroyed();
+}
+
+int SubMarine::type() const
+{
+ return Type;
+}
diff --git a/demos/sub-attaq/submarine.h b/demos/sub-attaq/submarine.h
new file mode 100644
index 0000000..9f0e258
--- /dev/null
+++ b/demos/sub-attaq/submarine.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __SUBMARINE__H__
+#define __SUBMARINE__H__
+
+//Qt
+#include <QtCore/QVariantAnimation>
+#include <QtGui/QGraphicsWidget>
+#include <QtGui/QGraphicsTransform>
+
+class PixmapItem;
+
+class Torpedo;
+
+class SubMarine : public QGraphicsWidget
+{
+Q_OBJECT
+public:
+ enum Movement {
+ None = 0,
+ Left,
+ Right
+ };
+ enum { Type = UserType + 1 };
+ SubMarine(int type, const QString &name, int points, QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0);
+
+ int points();
+
+ void setCurrentDirection(Movement direction);
+ enum Movement currentDirection() const;
+
+ void setCurrentSpeed(int speed);
+ int currentSpeed() const;
+
+ void launchTorpedo(int speed);
+ void destroy();
+
+ virtual int type() const;
+
+ QGraphicsRotation *rotation() const { return graphicsRotation; }
+
+signals:
+ void subMarineDestroyed();
+ void subMarineExecutionFinished();
+ void subMarineStateChanged();
+
+private:
+ int subType;
+ QString subName;
+ int subPoints;
+ int speed;
+ Movement direction;
+ PixmapItem *pixmapItem;
+ QGraphicsRotation *graphicsRotation;
+};
+
+#endif //__SUBMARINE__H__
diff --git a/demos/sub-attaq/submarine_p.h b/demos/sub-attaq/submarine_p.h
new file mode 100644
index 0000000..9c7a2a6
--- /dev/null
+++ b/demos/sub-attaq/submarine_p.h
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SUBMARINE_P_H
+#define SUBMARINE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+//Own
+#include "animationmanager.h"
+#include "submarine.h"
+#include "qanimationstate.h"
+
+//Qt
+#include <QtCore/QPropertyAnimation>
+#include <QtGui/QGraphicsScene>
+
+//This state is describing when the boat is moving right
+class MovementState : public QAnimationState
+{
+Q_OBJECT
+public:
+ MovementState(SubMarine *submarine, QState *parent = 0) : QAnimationState(parent)
+ {
+ movementAnimation = new QPropertyAnimation(submarine, "pos");
+ connect(movementAnimation,SIGNAL(valueChanged(const QVariant &)),this,SLOT(onAnimationMovementValueChanged(const QVariant &)));
+ setAnimation(movementAnimation);
+ AnimationManager::self()->registerAnimation(movementAnimation);
+ this->submarine = submarine;
+ }
+
+protected slots:
+ void onAnimationMovementValueChanged(const QVariant &)
+ {
+ if (qrand() % 200 + 1 == 3)
+ submarine->launchTorpedo(qrand() % 3 + 1);
+ }
+
+protected:
+ void onEntry(QEvent *e)
+ {
+ if (submarine->currentDirection() == SubMarine::Left) {
+ movementAnimation->setEndValue(QPointF(0,submarine->y()));
+ movementAnimation->setDuration(submarine->x()/submarine->currentSpeed()*12);
+ }
+ else /*if (submarine->currentDirection() == SubMarine::Right)*/ {
+ movementAnimation->setEndValue(QPointF(submarine->scene()->width()-submarine->size().width(),submarine->y()));
+ movementAnimation->setDuration((submarine->scene()->width()-submarine->size().width()-submarine->x())/submarine->currentSpeed()*12);
+ }
+ movementAnimation->setStartValue(submarine->pos());
+ QAnimationState::onEntry(e);
+ }
+
+private:
+ SubMarine *submarine;
+ QPropertyAnimation *movementAnimation;
+};
+
+//This state is describing when the boat is moving right
+class ReturnState : public QAnimationState
+{
+public:
+ ReturnState(SubMarine *submarine, QState *parent = 0) : QAnimationState(parent)
+ {
+ returnAnimation = new QPropertyAnimation(submarine->rotation(), "angle");
+ returnAnimation->setDuration(500);
+ AnimationManager::self()->registerAnimation(returnAnimation);
+ setAnimation(returnAnimation);
+ this->submarine = submarine;
+ }
+
+protected:
+ void onEntry(QEvent *e)
+ {
+ returnAnimation->stop();
+ returnAnimation->setEndValue(submarine->currentDirection() == SubMarine::Right ? 360. : 180.);
+ QAnimationState::onEntry(e);
+ }
+
+ void onExit(QEvent *e)
+ {
+ submarine->currentDirection() == SubMarine::Right ? submarine->setCurrentDirection(SubMarine::Left) : submarine->setCurrentDirection(SubMarine::Right);
+ QAnimationState::onExit(e);
+ }
+
+private:
+ SubMarine *submarine;
+ QPropertyAnimation *returnAnimation;
+};
+
+#endif // SUBMARINE_P_H
diff --git a/demos/sub-attaq/textinformationitem.cpp b/demos/sub-attaq/textinformationitem.cpp
new file mode 100644
index 0000000..759aa56
--- /dev/null
+++ b/demos/sub-attaq/textinformationitem.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "textinformationitem.h"
+#include "pixmapitem.h"
+
+TextInformationItem::TextInformationItem (QGraphicsItem * parent)
+ : QGraphicsTextItem(parent)
+{
+ setFont(QFont("Comic Sans MS", 25));
+}
+#include <QDebug>
+void TextInformationItem::setMessage(const QString& text)
+{
+ setHtml(text);
+ setPos(parentItem()->boundingRect().center().x() - boundingRect().size().width()/2 , parentItem()->boundingRect().center().y());
+}
diff --git a/demos/sub-attaq/textinformationitem.h b/demos/sub-attaq/textinformationitem.h
new file mode 100644
index 0000000..aa7f0be
--- /dev/null
+++ b/demos/sub-attaq/textinformationitem.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TEXTINFORMATIONITEM_H
+#define TEXTINFORMATIONITEM_H
+
+//Qt
+#include <QtGui/QGraphicsTextItem>
+
+class TextInformationItem : public QGraphicsTextItem
+{
+public:
+ TextInformationItem(QGraphicsItem * parent = 0);
+ void setMessage(const QString& text);
+};
+
+#endif // TEXTINFORMATIONITEM_H
diff --git a/demos/sub-attaq/torpedo.cpp b/demos/sub-attaq/torpedo.cpp
new file mode 100644
index 0000000..e17c7bf
--- /dev/null
+++ b/demos/sub-attaq/torpedo.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//Own
+#include "torpedo.h"
+#include "pixmapitem.h"
+#include "boat.h"
+#include "graphicsscene.h"
+#include "animationmanager.h"
+#include "qanimationstate.h"
+
+#include <QtCore/QPropertyAnimation>
+#include <QtCore/QStateMachine>
+#include <QtCore/QFinalState>
+
+Torpedo::Torpedo(QGraphicsItem * parent, Qt::WindowFlags wFlags)
+ : QGraphicsWidget(parent,wFlags), currentSpeed(0), launchAnimation(0)
+{
+ pixmapItem = new PixmapItem(QString::fromLatin1("torpedo"),GraphicsScene::Big, this);
+ setZValue(2);
+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ setFlags(QGraphicsItem::ItemIsMovable);
+ resize(pixmapItem->boundingRect().size());
+}
+
+void Torpedo::launch()
+{
+ launchAnimation = new QPropertyAnimation(this, "pos");
+ AnimationManager::self()->registerAnimation(launchAnimation);
+ launchAnimation->setEndValue(QPointF(x(),qobject_cast<GraphicsScene *>(scene())->sealLevel() - 15));
+ launchAnimation->setEasingCurve(QEasingCurve::InQuad);
+ launchAnimation->setDuration(y()/currentSpeed*10);
+ connect(launchAnimation,SIGNAL(valueChanged(const QVariant &)),this,SLOT(onAnimationLaunchValueChanged(const QVariant &)));
+
+ //We setup the state machine of the torpedo
+ QStateMachine *machine = new QStateMachine(this);
+
+ //This state is when the launch animation is playing
+ QAnimationState *launched = new QAnimationState(machine);
+ launched->setAnimation(launchAnimation);
+
+ //End
+ QFinalState *final = new QFinalState(machine);
+
+ machine->setInitialState(launched);
+
+ //### Add a nice animation when the torpedo is destroyed
+ launched->addTransition(this, SIGNAL(torpedoExplosed()),final);
+
+ //If the animation is finished, then we move to the final state
+ launched->addTransition(launched, SIGNAL(animationFinished()), final);
+
+ //The machine has finished to be executed, then the boat is dead
+ connect(machine,SIGNAL(finished()),this, SIGNAL(torpedoExecutionFinished()));
+
+ machine->start();
+}
+
+void Torpedo::setCurrentSpeed(int speed)
+{
+ if (speed < 0) {
+ qWarning("Torpedo::setCurrentSpeed : The speed is invalid");
+ return;
+ }
+ currentSpeed = speed;
+}
+
+void Torpedo::onAnimationLaunchValueChanged(const QVariant &)
+{
+ foreach (QGraphicsItem *item , collidingItems(Qt::IntersectsItemBoundingRect)) {
+ if (item->type() == Boat::Type) {
+ Boat *b = static_cast<Boat *>(item);
+ b->destroy();
+ }
+ }
+}
+
+void Torpedo::destroy()
+{
+ launchAnimation->stop();
+ emit torpedoExplosed();
+}
diff --git a/demos/sub-attaq/torpedo.h b/demos/sub-attaq/torpedo.h
new file mode 100644
index 0000000..def2a55
--- /dev/null
+++ b/demos/sub-attaq/torpedo.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __TORPEDO__H__
+#define __TORPEDO__H__
+
+//Qt
+#include <QtCore/QObject>
+
+#include <QtCore/QVariantAnimation>
+#include <QtGui/QGraphicsWidget>
+
+class PixmapItem;
+
+class Torpedo : public QGraphicsWidget
+{
+Q_OBJECT
+public:
+ Torpedo(QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0);
+ void launch();
+ void setCurrentSpeed(int speed);
+ void destroy();
+
+signals:
+ void torpedoExplosed();
+ void torpedoExecutionFinished();
+
+private slots:
+ void onAnimationLaunchValueChanged(const QVariant &);
+
+private:
+ int currentSpeed;
+ PixmapItem *pixmapItem;
+ QVariantAnimation *launchAnimation;
+};
+
+#endif //__TORPEDO__H__
diff --git a/demos/symbianpkgrules.pri b/demos/symbianpkgrules.pri
new file mode 100644
index 0000000..7e6852b
--- /dev/null
+++ b/demos/symbianpkgrules.pri
@@ -0,0 +1,13 @@
+!symbian: error(Only include this file for Symbian platforms)
+
+RSS_RULES ="group_name=\"QtDemos\";"
+
+vendorinfo = \
+ "; Localised Vendor name" \
+ "%{\"Nokia, Qt\"}" \
+ " " \
+ "; Unique Vendor name" \
+ ":\"Nokia, Qt\"" \
+ " "
+
+default_deployment.pkg_prerules += vendorinfo
diff --git a/demos/textedit/textedit.cpp b/demos/textedit/textedit.cpp
index 9cd6efd..5a20285 100644
--- a/demos/textedit/textedit.cpp
+++ b/demos/textedit/textedit.cpp
@@ -75,6 +75,7 @@ const QString rsrcPath = ":/images/win";
TextEdit::TextEdit(QWidget *parent)
: QMainWindow(parent)
{
+ setToolButtonStyle(Qt::ToolButtonFollowStyle);
setupFileActions();
setupEditActions();
setupTextActions();
@@ -127,7 +128,9 @@ TextEdit::TextEdit(QWidget *parent)
connect(textEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool)));
connect(textEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool)));
+#ifndef QT_NO_CLIPBOARD
connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(clipboardDataChanged()));
+#endif
QString initialFile = ":/example.html";
const QStringList args = QCoreApplication::arguments();
@@ -157,13 +160,16 @@ void TextEdit::setupFileActions()
QAction *a;
- a = new QAction(QIcon(rsrcPath + "/filenew.png"), tr("&New"), this);
+ QIcon newIcon = QIcon::fromTheme("document-new", QIcon(rsrcPath + "/filenew.png"));
+ a = new QAction( newIcon, tr("&New"), this);
+ a->setPriority(QAction::LowPriority);
a->setShortcut(QKeySequence::New);
connect(a, SIGNAL(triggered()), this, SLOT(fileNew()));
tb->addAction(a);
menu->addAction(a);
- a = new QAction(QIcon(rsrcPath + "/fileopen.png"), tr("&Open..."), this);
+ a = new QAction(QIcon::fromTheme("document-open", QIcon(rsrcPath + "/fileopen.png")),
+ tr("&Open..."), this);
a->setShortcut(QKeySequence::Open);
connect(a, SIGNAL(triggered()), this, SLOT(fileOpen()));
tb->addAction(a);
@@ -171,7 +177,8 @@ void TextEdit::setupFileActions()
menu->addSeparator();
- actionSave = a = new QAction(QIcon(rsrcPath + "/filesave.png"), tr("&Save"), this);
+ actionSave = a = new QAction(QIcon::fromTheme("document-save", QIcon(rsrcPath + "/filesave.png")),
+ tr("&Save"), this);
a->setShortcut(QKeySequence::Save);
connect(a, SIGNAL(triggered()), this, SLOT(fileSave()));
a->setEnabled(false);
@@ -179,22 +186,28 @@ void TextEdit::setupFileActions()
menu->addAction(a);
a = new QAction(tr("Save &As..."), this);
+ a->setPriority(QAction::LowPriority);
connect(a, SIGNAL(triggered()), this, SLOT(fileSaveAs()));
menu->addAction(a);
menu->addSeparator();
#ifndef QT_NO_PRINTER
- a = new QAction(QIcon(rsrcPath + "/fileprint.png"), tr("&Print..."), this);
+ a = new QAction(QIcon::fromTheme("document-print", QIcon(rsrcPath + "/fileprint.png")),
+ tr("&Print..."), this);
+ a->setPriority(QAction::LowPriority);
a->setShortcut(QKeySequence::Print);
connect(a, SIGNAL(triggered()), this, SLOT(filePrint()));
tb->addAction(a);
menu->addAction(a);
- a = new QAction(QIcon(rsrcPath + "/fileprint.png"), tr("Print Preview..."), this);
+ a = new QAction(QIcon::fromTheme("fileprint", QIcon(rsrcPath + "/fileprint.png")),
+ tr("Print Preview..."), this);
connect(a, SIGNAL(triggered()), this, SLOT(filePrintPreview()));
menu->addAction(a);
- a = new QAction(QIcon(rsrcPath + "/exportpdf.png"), tr("&Export PDF..."), this);
+ a = new QAction(QIcon::fromTheme("exportpdf", QIcon(rsrcPath + "/exportpdf.png")),
+ tr("&Export PDF..."), this);
+ a->setPriority(QAction::LowPriority);
a->setShortcut(Qt::CTRL + Qt::Key_D);
connect(a, SIGNAL(triggered()), this, SLOT(filePrintPdf()));
tb->addAction(a);
@@ -214,33 +227,43 @@ void TextEdit::setupEditActions()
QToolBar *tb = new QToolBar(this);
tb->setWindowTitle(tr("Edit Actions"));
addToolBar(tb);
-
QMenu *menu = new QMenu(tr("&Edit"), this);
menuBar()->addMenu(menu);
QAction *a;
- a = actionUndo = new QAction(QIcon(rsrcPath + "/editundo.png"), tr("&Undo"), this);
+ a = actionUndo = new QAction(QIcon::fromTheme("edit-undo", QIcon(rsrcPath + "/editundo.png")),
+ tr("&Undo"), this);
a->setShortcut(QKeySequence::Undo);
tb->addAction(a);
menu->addAction(a);
- a = actionRedo = new QAction(QIcon(rsrcPath + "/editredo.png"), tr("&Redo"), this);
+ a = actionRedo = new QAction(QIcon::fromTheme("edit-redo", QIcon(rsrcPath + "/editredo.png")),
+ tr("&Redo"), this);
+ a->setPriority(QAction::LowPriority);
a->setShortcut(QKeySequence::Redo);
tb->addAction(a);
menu->addAction(a);
menu->addSeparator();
- a = actionCut = new QAction(QIcon(rsrcPath + "/editcut.png"), tr("Cu&t"), this);
+ a = actionCut = new QAction(QIcon::fromTheme("edit-cut", QIcon(rsrcPath + "/editcut.png")),
+ tr("Cu&t"), this);
+ a->setPriority(QAction::LowPriority);
a->setShortcut(QKeySequence::Cut);
tb->addAction(a);
menu->addAction(a);
- a = actionCopy = new QAction(QIcon(rsrcPath + "/editcopy.png"), tr("&Copy"), this);
+ a = actionCopy = new QAction(QIcon::fromTheme("edit-copy", QIcon(rsrcPath + "/editcopy.png")),
+ tr("&Copy"), this);
+ a->setPriority(QAction::LowPriority);
a->setShortcut(QKeySequence::Copy);
tb->addAction(a);
menu->addAction(a);
- a = actionPaste = new QAction(QIcon(rsrcPath + "/editpaste.png"), tr("&Paste"), this);
+ a = actionPaste = new QAction(QIcon::fromTheme("edit-paste", QIcon(rsrcPath + "/editpaste.png")),
+ tr("&Paste"), this);
+ a->setPriority(QAction::LowPriority);
a->setShortcut(QKeySequence::Paste);
tb->addAction(a);
menu->addAction(a);
+#ifndef QT_NO_CLIPBOARD
actionPaste->setEnabled(!QApplication::clipboard()->text().isEmpty());
+#endif
}
void TextEdit::setupTextActions()
@@ -252,9 +275,11 @@ void TextEdit::setupTextActions()
QMenu *menu = new QMenu(tr("F&ormat"), this);
menuBar()->addMenu(menu);
- actionTextBold = new QAction(QIcon(rsrcPath + "/textbold.png"), tr("&Bold"), this);
+ actionTextBold = new QAction(QIcon::fromTheme("format-text-bold", QIcon(rsrcPath + "/textbold.png")),
+ tr("&Bold"), this);
actionTextBold->setShortcut(Qt::CTRL + Qt::Key_B);
- QFont bold;
+ actionTextBold->setPriority(QAction::LowPriority);
+ QFont bold;
bold.setBold(true);
actionTextBold->setFont(bold);
connect(actionTextBold, SIGNAL(triggered()), this, SLOT(textBold()));
@@ -262,7 +287,9 @@ void TextEdit::setupTextActions()
menu->addAction(actionTextBold);
actionTextBold->setCheckable(true);
- actionTextItalic = new QAction(QIcon(rsrcPath + "/textitalic.png"), tr("&Italic"), this);
+ actionTextItalic = new QAction(QIcon::fromTheme("format-text-italic", QIcon(rsrcPath + "/textitalic.png")),
+ tr("&Italic"), this);
+ actionTextItalic->setPriority(QAction::LowPriority);
actionTextItalic->setShortcut(Qt::CTRL + Qt::Key_I);
QFont italic;
italic.setItalic(true);
@@ -272,8 +299,10 @@ void TextEdit::setupTextActions()
menu->addAction(actionTextItalic);
actionTextItalic->setCheckable(true);
- actionTextUnderline = new QAction(QIcon(rsrcPath + "/textunder.png"), tr("&Underline"), this);
+ actionTextUnderline = new QAction(QIcon::fromTheme("format-text-underline", QIcon(rsrcPath + "/textunder.png")),
+ tr("&Underline"), this);
actionTextUnderline->setShortcut(Qt::CTRL + Qt::Key_U);
+ actionTextUnderline->setPriority(QAction::LowPriority);
QFont underline;
underline.setUnderline(true);
actionTextUnderline->setFont(underline);
@@ -289,24 +318,29 @@ void TextEdit::setupTextActions()
// Make sure the alignLeft is always left of the alignRight
if (QApplication::isLeftToRight()) {
- actionAlignLeft = new QAction(QIcon(rsrcPath + "/textleft.png"), tr("&Left"), grp);
- actionAlignCenter = new QAction(QIcon(rsrcPath + "/textcenter.png"), tr("C&enter"), grp);
- actionAlignRight = new QAction(QIcon(rsrcPath + "/textright.png"), tr("&Right"), grp);
+ actionAlignLeft = new QAction(QIcon::fromTheme("format-justify-left", QIcon(rsrcPath + "/textleft.png")),
+ tr("&Left"), grp);
+ actionAlignCenter = new QAction(QIcon::fromTheme("format-justify-center", QIcon(rsrcPath + "/textcenter.png")), tr("C&enter"), grp);
+ actionAlignRight = new QAction(QIcon::fromTheme("format-justify-right", QIcon(rsrcPath + "/textright.png")), tr("&Right"), grp);
} else {
- actionAlignRight = new QAction(QIcon(rsrcPath + "/textright.png"), tr("&Right"), grp);
- actionAlignCenter = new QAction(QIcon(rsrcPath + "/textcenter.png"), tr("C&enter"), grp);
- actionAlignLeft = new QAction(QIcon(rsrcPath + "/textleft.png"), tr("&Left"), grp);
+ actionAlignRight = new QAction(QIcon::fromTheme("format-justify-right", QIcon(rsrcPath + "/textright.png")), tr("&Right"), grp);
+ actionAlignCenter = new QAction(QIcon::fromTheme("format-justify-center", QIcon(rsrcPath + "/textcenter.png")), tr("C&enter"), grp);
+ actionAlignLeft = new QAction(QIcon::fromTheme("format-justify-left", QIcon(rsrcPath + "/textleft.png")), tr("&Left"), grp);
}
- actionAlignJustify = new QAction(QIcon(rsrcPath + "/textjustify.png"), tr("&Justify"), grp);
+ actionAlignJustify = new QAction(QIcon::fromTheme("format-justify-fill", QIcon(rsrcPath + "/textjustify.png")), tr("&Justify"), grp);
actionAlignLeft->setShortcut(Qt::CTRL + Qt::Key_L);
actionAlignLeft->setCheckable(true);
+ actionAlignLeft->setPriority(QAction::LowPriority);
actionAlignCenter->setShortcut(Qt::CTRL + Qt::Key_E);
actionAlignCenter->setCheckable(true);
+ actionAlignCenter->setPriority(QAction::LowPriority);
actionAlignRight->setShortcut(Qt::CTRL + Qt::Key_R);
actionAlignRight->setCheckable(true);
+ actionAlignRight->setPriority(QAction::LowPriority);
actionAlignJustify->setShortcut(Qt::CTRL + Qt::Key_J);
actionAlignJustify->setCheckable(true);
+ actionAlignJustify->setPriority(QAction::LowPriority);
tb->addActions(grp->actions());
menu->addActions(grp->actions());
@@ -336,6 +370,8 @@ void TextEdit::setupTextActions()
comboStyle->addItem("Ordered List (Decimal)");
comboStyle->addItem("Ordered List (Alpha lower)");
comboStyle->addItem("Ordered List (Alpha upper)");
+ comboStyle->addItem("Ordered List (Roman lower)");
+ comboStyle->addItem("Ordered List (Roman upper)");
connect(comboStyle, SIGNAL(activated(int)),
this, SLOT(textStyle(int)));
@@ -573,6 +609,12 @@ void TextEdit::textStyle(int styleIndex)
case 6:
style = QTextListFormat::ListUpperAlpha;
break;
+ case 7:
+ style = QTextListFormat::ListLowerRoman;
+ break;
+ case 8:
+ style = QTextListFormat::ListUpperRoman;
+ break;
}
cursor.beginEditBlock();
@@ -638,7 +680,9 @@ void TextEdit::cursorPositionChanged()
void TextEdit::clipboardDataChanged()
{
+#ifndef QT_NO_CLIPBOARD
actionPaste->setEnabled(!QApplication::clipboard()->text().isEmpty());
+#endif
}
void TextEdit::about()
diff --git a/demos/textedit/textedit.pro b/demos/textedit/textedit.pro
index 1ef4256..9669ec8 100644
--- a/demos/textedit/textedit.pro
+++ b/demos/textedit/textedit.pro
@@ -19,3 +19,4 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.html *.doc images
sources.path = $$[QT_INSTALL_DEMOS]/textedit
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/demos/undo/undo.pro b/demos/undo/undo.pro
index e26d07c..0667bdd 100644
--- a/demos/undo/undo.pro
+++ b/demos/undo/undo.pro
@@ -15,3 +15,4 @@ sources.files = $$SOURCES $$HEADERS *.pro icons $$RESOURCES $$FORMS
sources.path = $$[QT_INSTALL_DEMOS]/undo
INSTALLS += target sources
+symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
diff --git a/dist/README b/dist/README
index 6fe7672..d8ab958 100644
--- a/dist/README
+++ b/dist/README
@@ -6,7 +6,7 @@ http://qt.nokia.com/doc/latest/qt4-intro.html for details.
The Qt 4.x series is not binary compatible or source compatible with
the 3.x series. For more information on porting from Qt 3 to Qt 4, see
-http://qt.nokia.com/doc/latest/porting4.html.
+http://qt.nokia.com/doc/latest/porting4.html .
INSTALLING Qt
@@ -37,7 +37,7 @@ The Qt reference documentation is available locally in Qt's doc/html
directory. You can use Qt Assistant to view it; to launch Assistant,
type 'assistant' on the command line or use the Start menu. On Mac OS
X, you can find it in /Developer/Applications/Qt. The latest
-documentation is available at http://qt.nokia.com/doc/.
+documentation is available at http://qt.nokia.com/doc/ .
SUPPORTED PLATFORMS
@@ -90,7 +90,7 @@ For this release, the following platforms have been tested:
wincewm60standard-msvc2008
For a complete list of supported platforms, see
-http://qt.nokia.com/doc/supported-platforms.html.
+http://qt.nokia.com/doc/latest/supported-platforms.html.
COMMERCIAL EDITIONS
@@ -103,7 +103,7 @@ the QtCore, QtGui (except QGraphicsView), QtTest, QtDBus and
Qt3Support modules.
For a full listing of the contents of each module, please refer to
-http://qt.nokia.com/doc/4.4/modules.html.
+http://qt.nokia.com/doc/latest/modules.html
HOW TO REPORT A BUG
diff --git a/dist/changes-3.0.0 b/dist/changes-3.0.0
index 4f8776b..819bc0c 100644
--- a/dist/changes-3.0.0
+++ b/dist/changes-3.0.0
@@ -433,8 +433,8 @@ from one single project description. It is the C++ successor of
'tmake' which required Perl.
qmake offers additional functionallity that is difficult to reproduce
-in tmake. Qt uses qmake in its build system and we have released it
-as free software.
+in tmake. Qt uses qmake in its build system and we have released it as
+free software.
diff --git a/dist/changes-3.0.0-beta1 b/dist/changes-3.0.0-beta1
index 37f4c36..e351ed1 100644
--- a/dist/changes-3.0.0-beta1
+++ b/dist/changes-3.0.0-beta1
@@ -405,8 +405,8 @@ QMake
To ease portability we now provide the qmake utility to replace tmake.
QMake is a C++ version of tmake which offers additional functionallity
-that is difficult to reproduce in tmake. Qt uses qmake in its build
-system and we have released it as free software.
+that is difficult to reproduce in tmake. Qt uses qmake in its
+build system and we have released it as free software.
Qt Functions
diff --git a/dist/changes-4.3.0 b/dist/changes-4.3.0
index 1f3cbc4..c0bcc48 100644
--- a/dist/changes-4.3.0
+++ b/dist/changes-4.3.0
@@ -34,7 +34,7 @@ General Improvements
- Documentation and Examples
* Added information about the TS file format used in Linguist.
* Moved platform and compiler support information from
- Qt website into the documentation.
+ website into the documentation.
* Added an Accessibility overview document.
* Added new example to show usage of QCompleter with custom tree models.
diff --git a/dist/changes-4.4.4-temple b/dist/changes-4.4.4-temple
new file mode 100644
index 0000000..25f1f0b
--- /dev/null
+++ b/dist/changes-4.4.4-temple
@@ -0,0 +1,65 @@
+Qt for S60 4.4.4 Temple introduces new ported modules and few other improvements.
+It guarantees no source or binary compatibility between any other versions.
+
+Some of the changes listed in this file include internal issue tracking
+numbers.
+
+This file only lists changes specific to Qt for S60.
+
+
+****************************************************************************
+* Platform Specific Changes *
+****************************************************************************
+
+Qt for S60
+----------
+ * Changes to qmake:
+ * [228860] Fixed bld.inf and .mmp generation when not under Qt src tree,
+ i.e. when the makespec is default.
+ * [231121] Added no_icon CONFIG keyword to suppress showing application
+ icon in the application menu.
+ * [233497] EPOCROOT is no longer required as environment variable as long
+ as a Symbian device can be determined.
+ * [234551] Generated .pkg files no longer include Qt libraries directly,
+ instead they have a dependency to a separate QtLibs package.
+ * [234555] Added support for generic mmp file content in form of
+ MMP_RULES variable. Also, EXPORTUNFROZEN is now defined using this
+ variable instead of being hardcoded.
+ * [234557] Improved user ability to control include order via INCLUDEPATH
+ variable.
+ * [234557] Support for STDDLL, STDEXE and STDLIB Open C target types via
+ stdbinary CONFIG keyword.
+ * [235975] The -r switch is no longer required with qmake to recurse
+ subdirs template.
+ * Fixed: Resources with similar basenames corrupted makefile.
+
+ * [230751] Improved Elastic Nodes application stability.
+ * [230752] Mouse drag events work now.
+ * [234558] Ported QSharedMemory.
+ * [234559] Ported QSystemSemaphore.
+ * [234560] Ported all of QtXml.
+ * [234561] Ported all of QtScript.
+ * [234562] Ported all of QtSvg.
+ * [234869] QFileDialog no longer uses desktop layout in Qt for S60.
+ * QtNetwork now supports SSL.
+ * If current path returned by Open C doesn't exist when queried, it is
+ created.
+ * All supported libs and plugins built under src dir now have proper UIDs.
+ * Fixed GCCE build breaking on atomics.
+ * Improved fonts support:
+ * Anti aliasing
+ * Italic/bold
+ * Higher text layout precision
+ * QPixmapCache size limited to 2MB.
+ * Createpackage script looks for RnD certs in Qt installation root instead
+ of EPOCROOT.
+ * Iconengines plugins included in the default build.
+ * More examples and demos added in the default build to showcase newly
+ ported modules.
+ * QFileSystemWatcher thread stack size increased to avoid crashing when
+ entering directories that need AllFiles capability.
+ * Createpackage will now support signing with custom certificates in
+ addition to default ones.
+ * A perl script patch_capabilities.pl is provided for changing capabilities
+ of all binaries specified in a single .pkg file.
+ \ No newline at end of file
diff --git a/dist/changes-4.5.0-garden b/dist/changes-4.5.0-garden
new file mode 100644
index 0000000..ce258e7
--- /dev/null
+++ b/dist/changes-4.5.0-garden
@@ -0,0 +1,241 @@
+Qt 4.5.0-garden
+---------------
+
+The Qt for S60 "Garden" release is the fourth pre-release from the
+Qt for S60 porting project. "Garden" is based on the Qt 4.5 codebase
+and release focus has been on proper GUI integration.
+
+Up to and including change: b7621555cb1d1c97967dd40d63dd7e85a418407c
+
+Lists just S60 fixes, for general 4.5.0 changes go to:
+
+ http://qt.nokia.com/developer/changes/changes-4.5.0
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Task Tracker:
+
+ http://qt.nokia.com/developer/task-tracker
+
+Each of these identifiers can be entered in the task tracker to obtain
+more information about a particular change. Sometimes the task is internal
+and cannot be viewed by the public, a lot of them are non-public for Qt for
+S60 at the moment.
+
+****************************************************************************
+* New features *
+****************************************************************************
+
+New modules
+-----------
+
+- qtmain
+ * Added a small static library called qtmain which is linked in
+ automatically for Qt applications on S60. qtmain includes an
+ implementation of E32Main() that sets up Qt correctly for S60. This
+ means that Qt no longer links to libcrt0.lib but uses qtmain instead.
+ However, if you are not linking against QtGui, you'll still have to
+ link to libcrt0.
+
+New classes
+------------
+
+- QS60Style
+ * Native look for Qt applications on S60 3.1 and later versions. The
+ style picks up the current theme parts, palettes and font settings
+ through the skinserver and uses these when painting in Qt.
+ The layout data for different resolutions is considered.
+
+Ported classes
+--------------
+
+- QDesktopServices
+ * Provides methods for accessing common desktop services: Opening the
+ browser with an url, launching documents with the standard application
+ and getting default system directories.
+
+- QClipboard
+ * Provides access to the window system clipboard.
+
+- QSysInfo
+ * QSysInfo class provides information about the system.
+
+Features
+--------
+
+- Input methods
+ * QInputMethodEvent will now be generated by Qt.
+ To use it, widgets must set the attribute WA_InputMethodEnabled and
+ implement QWidget::inputMethodQuery(...).
+ * Qt will use the underlaying FEP framework from S60.
+ * Multitap and T9 supported.
+ * Virtual keyboard for touch phones is supported.
+ * Most of the Qt widgets already have support for input methods.
+
+- Drag-n-Drop
+ * At the moment works only within same Qt process.
+
+- STL support for QtS60
+ * use -stl switch when configuring Qt.
+
+Optimizations
+-------------
+
+
+****************************************************************************
+* Build issues *
+****************************************************************************
+
+- Fixed compilation on private S60 platforms by adding neccessary include paths.
+- Fix compiler error if --gnu flag is given to RVCT.
+
+
+****************************************************************************
+* Changes to existing classes *
+****************************************************************************
+
+- qapplication_s60.cpp (non-public)
+ * Simplified by introduction of qtmain.
+ * added CCoeControl to be the native representation of QWidget.
+ * Use window group from CEikonEnv instead of creating our own.
+ * No need to create/destroy RWsSession, this is now done by the Avkon
+ application.
+ * Handle pointer events from QSymbianControl.
+ * Stopped using QETWidget for translation, now handled by
+ QSymbianControl.
+ * MouseButtonDblClick mapped to EModifierDoubleClick (after dblclick
+ Symbian will send mouseButtonRelease.
+
+- QApplication
+ * Implemented setDoubleClickInterval(...).
+ * Improved widgetAt().
+ * Added support for resizing widget's when the screen orientation
+ changes from portrait to landscape. For fullscreen and maximized
+ widgets this will ensure that they look correct in the new screen
+ layout.
+
+- qwindowsurface_s60.cpp (non-public)
+ * Stopped creating our own CWindowGc based on the RWindow and get
+ SystemGc from the CCoeControl we are currently painting on instead.
+
+- qeventdispatcher_s60.cpp
+ * Stopped using Active Objects to recieve events, we get them from
+ C*AppUi and CCoeControl instead.
+
+- QWidget
+ * Proper implementation for QDesktopWidget::availableGeometry.
+ * Improved raising and lowering widgets.
+ * Implemented setWindowTitle(...).
+ * Implemented QWidget::setWindowIcon(...) and made it to react to
+ different statuspane layouts.
+ * Improved focus handling (improved setFocus_sys).
+ * Fixed native window scrolling. Only use accelerated scroll if we are
+ scrolling a window owning widget.
+ * Improved setWindowState(...).
+ * Added implementation for createDefaultWindowSurface_sys().
+ * Added implementation for setMask_sys().
+ * Not creating a backing store for the top level widget (saves memory).
+ * winId() now returns a CCoeControl instead of RWindow.
+
+- QMenuBar
+ * Added support for using native S60 menues.
+ * Supported infinite level of menues inside menues.
+ * Supported checkboxes next to menu items).
+
+- QtCore and QtGui
+ * link to CONE and Uikon libraries and stop linking to glib and gthread.
+ * Renamed qt_deployment.pro to qt_libs.pro as it is more consistent.
+
+- Event loop / Event dispatcher
+ * We now integrate with the native loop, allowing CActiveScheduler and
+ QEventLoop to be used interchangably.
+ * Enabled posted events to work from the Symbian active scheduler too.
+ * Enable use of QEventLoop::ExcludeSocketEvents on Symbian.
+ * Improved handling of zero timers.
+
+- QColumnView
+ * Fixed a typo in one instance of QT_NO_QCOLUMNVIEW.
+
+- font rendering
+ * Speed increase
+ * Correctly render RTL text
+ * Proper shaping of complex writing systems
+ * Automatic font linking (aka merging) of different writing systems
+ * Rudimentary fallback glyph outline support
+ * Defaults to Symbians native (usually iType based) font rendering.
+ Alternatively, supports FreeType. Configure with -qt-freetype.
+
+- qcore_symbian_p.h (non-public)
+ * Added helper functions to convert QRect <-> TRect.
+ * Renamed qstringToTPtrC to qt_QString2TPtrC.
+ * Added helper function qt_TDisplayMode2Format.
+ * Added helper function to convert QSize <-> TSize.
+ * Added helper function to convert QString ->HBufC.
+ * Added helper function to convert TDesC -> QString.
+
+- QGraphicsSystem
+ * QRasterPixmapData(...) is specified as default pixmap data for S60.
+
+- QPixmap
+ * Improved grabWindow(...) when it comes to selecting client rect.
+
+- QDirModel
+ * Returns root dir name similary as done in Windows
+
+- QFSFileEngine
+ * copy(...) now uses Symbian native copy implementation which is more efficient
+ and doesn't leave temp files behind
+
+- QLocale
+ * Now has Symbian system locale support.
+
+****************************************************************************
+* Examples and demos *
+****************************************************************************
+
+****************************************************************************
+* Tools *
+****************************************************************************
+
+- qmake
+ * Support for QMAKE_EXTRA_TARGETS and QMAKE_EXTRA_COMPILERS variables.
+ * Support BLD_INF_RULES variable. Adds entries to generated bld.inf file
+ * Added 'make' targets '<build>-<platform>' 'distclean' and 'run'
+ * New platform_paths.prf and data_caging_paths.prf contain several
+ variables and replacement functions for including known paths.
+ * The .pro file qt_libs.pro was moved to src/s60installs.
+ * Support for ICON variable for setting application icon.
+ * Support for RSS_RULES variable, which enables entries to be added to
+ generated application registration files.
+ * When bulding qmake and other bootstrapped tools we now use
+ "-warnings on" instead of "-warnings all".
+ * Improved error message if calls to $$system() fails.
+ * Fixed several issues when qmake is built for platform win32-mwc.
+ * Moved mocing step to the build step so it is not longer required to
+ do "abld build" or "abld makefile" to remoc.
+ * Improved "make clean".
+ * Increased max heap to 8Mb.
+ * Enabled __CC_ARM flag used by some versions of RVCT.
+ * Removed hard coded INCLUDEPATH from qmake - developer can control
+ the whole include path hierachy.
+ * Symbian export mechanism is no longer used for emulator deployment,
+ instead copy commands are generated to wrapper makefile and
+ executed during final phase of building, after post link.
+ * Removed -O1 flag from WINSCW builds.
+ * Added qmake function (size) to ask number of items in QStringList.
+ * Qt demos are now installed to QtDemos folder in S60 emulator.
+ * Qt examples are now installed to QtExamples folder in S60 emulator/HW.
+ * Plugin stubs suffix changed to ".qtplugin".
+ * Paths containing $${EPOCROOT}/epoc32 will now properly generate
+ absolute paths in mmps.
+
+
+-configure
+ * Defaults for FREETYPE and SCRIPTTOOLS set to "no".
+
+****************************************************************************
+* Plugins *
+****************************************************************************
+
+****************************************************************************
+* Important Behavior Changes *
+****************************************************************************
diff --git a/dist/changes-4.5.2-tower b/dist/changes-4.5.2-tower
new file mode 100644
index 0000000..8252c29
--- /dev/null
+++ b/dist/changes-4.5.2-tower
@@ -0,0 +1,436 @@
+Qt 4.5.2-tower
+---------------
+
+The Qt for S60 "Tower" release is the fifth pre-release from the Qt for
+S60 porting project. "Tower" is based on the Qt 4.5 codebase (mostly Qt 4.5.2).
+
+This list of changes lists S60 specific fixes only,
+for general 4.5.x changes go to:
+
+ http://qt.nokia.com/developer/changes/changes-4.5.0
+ http://qt.nokia.com/developer/changes/changes-4.5.1
+ http://qt.nokia.com/developer/changes/changes-4.5.2 (partially in Tower)
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Task Tracker:
+
+ http://qt.nokia.com/developer/task-tracker
+
+Each of these identifiers can be entered in the task tracker to obtain
+more information about a particular change. Sometimes the task is internal
+and cannot be viewed by the public, a lot of them are non-public for Qt for
+S60 at the moment.
+
+****************************************************************************
+* New features *
+****************************************************************************
+
+New modules
+-----------
+
+- Input methods
+ * Added events to support opening and closing the virtual keyboard, called
+ software input panel in Qt.
+ * Added an option to QApplication to choose between single or double click
+ input panel activation.
+ * Added input method hints API to Qt. These can be used to instruct input methods
+ to only allow certain characters or tailor their appearance.
+ * Added Qt::ImAnchorPosition to support querying for selections through input
+ methods.
+ * Added QInputMethodEvent::Selection to support setting the selection through
+ input methods.
+
+- Phonon
+ * The Phonon library is now part of Qt, but it comes without a backend.
+ This means that applications can build and run against the Phonon
+ library, but there is currently no S60 backend plugin providing actual
+ multimedia playback. Possible alternatives such as Helix and MMF are
+ being investigated.
+
+- QtSql
+ * Implemented QtSql module with sqlite3 backend. For now backend is
+ provided only in binary format.
+
+- QtWebkit
+ * Experimental webkit build for S60. Can be enabled by passing -webkit
+ to configure.
+
+New classes
+------------
+
+- QScopedPointer
+ * Smart pointer, which deletes pointer when destroyed.
+
+Ported classes
+--------------
+
+- QColormap
+ * Added basic implementation of QColormap for Symbian.
+
+- QLocalSocket and QLocalServer
+ * Added support for QLocalSocket and QLocalServer on Symbian.
+
+- QSound
+ * Implemented CMdaAudioPlayerUtility based Symbian backend for QSound.
+
+Features
+--------
+
+- QApplication
+ * Implemented QApplication::beep() for Symbian.
+
+- QPixmap
+ * Added supported for converting to/from CFbsBitmap
+
+- QSslSocket
+ * Added support for -openssl option i.e. runtime resolving of OpenSSL
+ symbols.
+
+- QWidget
+ * Basic widgets are now navigatable and usable via keypad on SDK 3
+ FP 1 and FP 2.
+ * Widgets can now be made semi-transparent on systems that support it
+ using Qt::WA_TranslucentBackground.
+
+- Exception safety
+ * Improving the exception safety of Qt, not yet complete.
+ * Added support for translating between Symbian leaves and standard C++
+ exceptions.
+
+Optimizations
+-------------
+
+- qdrawhelper
+ * Optimized drawing operations for RVCT builds, particulary for ARMV6.
+
+- QFont
+ * Use cached DPI for metrics.
+
+- qwidget_s60.cpp
+ * Avoid unnecessary calls to FocusChanged in Symbian.
+
+- qwindowsurface_s60.cpp
+ * Avoid updating raster buffer pointer on window hide
+
+Documentation
+-------------
+
+- exceptionsafety.qdoc
+ * A guide to exception safety in Qt.
+
+- symbian-exceptionsafety.qdoc
+ * A guide to integrating exception safety in Qt with Symbian.
+
+****************************************************************************
+* Code clean-up *
+****************************************************************************
+
+- Cleanup qeventdispatcher_unix.cpp
+ * 247268: All qeventdispatcher_unix.cpp changes were reverted since
+ this file is not anymore used in Symbian OS branch.
+
+- Cleanup QtNetwork workarounds implemented earlier due to Open C bugs.
+ * 247287: Removed getaddrinfo workaround.
+ * 247288: Removed waitForConnected workaround.
+ * 247289: Removed qt_socket_accept workaround.
+ * 247290: Removed qt_socket_connect workaround.
+ * 247290: Removed E32IONREAD workaround.
+ * 247293: Removed nativeHasPendingDatagrams workaround.
+ * 247295: Removed QNativeSocketEnginePrivate::nativeRead EPIPE
+ workaround.
+
+- Other code clean-ups
+ * 247278: Removed unnecessary includes from qbackingstore.cpp.
+ * Fixed Q_OS_SYMBIAN ifdef usage in qfiledialog_p.h.
+ * 247272: Removed qtestnetworkservers.h dependency, used
+ network-settings.h.
+ * Revert "Work around compiler bug on Nokia Metrowerks compiler."
+ * Remove UI highlights being inverted colors based on highlight text
+ colors.
+
+****************************************************************************
+* Build issues *
+****************************************************************************
+
+- Macros
+ * QT_NO_DEBUG now properly defined in release mode.
+
+- QTest
+ * Fixed testlib export macros for RVCT builds.
+
+- Namespaces
+ * Now builds when -qtnamespace option is defined.
+
+****************************************************************************
+* Changes to existing classes *
+****************************************************************************
+
+- QApplication
+ * 252798: Fixed layout when orientation changed via
+ AknAppUi::SetOrientationL.
+ * Generating MouseEvents has gone through several changes.
+ * qt_init() has been changed: auto flush is always enabled for
+ window server sessions on 3.1 SDK for both UDEB and UREL.
+ * Added support for '-graphics-system' command line option
+
+- QCoeFepInputContext (non-public)
+ * Fixes FEP crash when changing the focused Qt widget to NULL.
+ * Fixed a bug where the virtual keyboard could not be opened if there
+ was only one input widget.
+ * Fixed a crash in FEP when exiting application.
+
+- QDebug
+ * Fixed debug printing (incl. qWarning, qFatal) for strings longer
+ than 256 characters.
+ * introduce a breakpoint to get the emulator to stop in the debugger
+ when qFatal is called
+
+- QDesktopServices
+ * Fixed forwardslash/backslash usage as an path separator.
+ * Switched QDesktopServices mail-to URL handling to RSendAs in Symbian,
+ due to the fact that CSendUi requires extensive capabilities to work
+ correctly. Currently e-mail sending with qdesktopservices::openUrl
+ works in Symbian only if e-mail account already exists.
+
+- QDesktopWidget
+ * 253930: Implement proper resize behavior and emit necessary signals.
+
+- QEventDispatcherSymbian (non-public)
+ * Lowered the timeout for reprioritizing the process to 100ms.
+ * Fixed ASSERT panic in Symbian event dispatcher.
+ * 246600: Fix problem in eventdispatcher destructor / AO canceling.
+ * Fixed active scheduler removal when calling QThread::terminate.
+ * Fix to Open C bug: select sometimes returns -1 and errno is
+ ECONNREFUSED.
+ * Fix a crash when using QEventLoop::ExcludeSocketNotifiers flag.
+ * Changed to round robin scheduling for Qt's active objects. Other
+ active objects will still be scheduled like before.
+ * Fixed crash if events are posted before QApplication construction
+
+- QFontDataBase
+ * Now, also fonts from the user's /resources/fonts directories are
+ available.
+
+- QFontEngine
+ * Fix the vertical advance of glyph metrics.
+
+- QFontMetrics
+ * Fixed the boundingRect calculation for text.
+
+- QGraphicsView
+ * Added support for virtual keyboard to the the viewport.
+
+- QGraphicsTextItem
+ * Added support for virtual keyboard.
+
+- QHostInfo
+ * Added support for host lookups with multiple ipv4 addresses.
+
+- QInputContext
+ * Added QInputContext::s60FilterEvent().
+
+- QIoDevice
+ * Fixed compilation error when QIODEVICE_DEBUG is defined.
+
+- QKeyMapper (non-public)
+ * Fixed a broken keymapping where Enter key would be mapped to Tab.
+
+- QLocale
+ * Removed workaround for missing tzname symbol, fixes QLocal timeZone
+ implementation for Symbian.
+
+- QLocalSocket
+ * Connecting to QLocalServer is always done in blocking mode.
+
+- QMenuBar
+ * Native menus are handled properly even when application has multiple
+ QMainWindows.
+ * Fixed a bug causing both native and qt menu to be created.
+ * Fix for disappearing options menu after coming back from dialog.
+
+- QNativeSocketEnginePrivate (non-public)
+ * Socket connect and listen failure is indicated in exception set.
+ (Workaround to Open C bug)
+
+- QNetworkInterface
+ * Fixed R-handle leak in Symbian version of qnetworkinterface_unix.cpp.
+ * Introduced a new qnetworkinterface_symbian.cpp, because there wasn't
+ really anything common to UNIX equivalent.
+
+- QPixmap
+ * Added fromSymbianCFbsBitmap() and toSymbianCFbsBitmap().
+
+- QPlainTextEdit
+ * Added support for virtual keyboard.
+
+- QPluginLoader
+ * QPluginLoader will look for plugin stubs from the same folder on other
+ drives if it can't find them from the indicated drive.
+
+- QS60Style
+ * Added subElementRect implementation for SE_ItemViewItemCheckIndicator.
+ * Added support for E90 layouts.
+ * Added support for QScrollArea, QTextEditor, QGroupBox, QTreeView,
+ QToolBar and QDial styling.
+ * Better support for theme and layout changes.
+ * Better support for themed palettes and themed text colors.
+ * Better support for multiselection in item views.
+ * Better theming for QTable and QPanel.
+ * Better support of highlight graphics and texts for QLists, QTreeViews,
+ QCalendarWidgets and QComboBoxes.
+ * Support polishing fonts. Fonts are no longer changed within the drawing
+ code.
+ * Draw spinbox arrowbuttons side-by-side, instead one on top of the other.
+ * Harmonize widget drawing so that widgets are of similar height.
+ * Support check states for QLists and QPushButtons.
+ * Support flat QPushButtons.
+ * Support busy indicator.
+ * Support QScrollBar pressed state.
+ * Support QPushButton disabled theme graphics.
+ * Separate theme background for QDialogs.
+ * Clarify QToolButton pressed state.
+ * Removed linedrawing of panels and groupboxes.
+ * Fix palette-polution for a style that is activated from an application
+ after S60Style has been in use.
+ * Fix for frame masks with color depth other than EGrey2.
+ * Fix for squeezed QTabBars.
+ * Fix memory leak when color skinning graphics.
+ * Show focus/Editfocus visualization for KeyPad navigation on
+ SDK 3 FP 1 and FP 2.
+ * Fix for overwriting user specified palettes.
+
+- QSelectThread (non-public)
+ * We force monitoring sockets exception status as well, and not
+ just read/write.
+ * Notification related to the particular socket signaled via exception
+ fd_set will be mapped to the appropriate read/write notification.
+
+- QTemporaryFile
+ * Fixed temporary file rename in Symbian OS.
+
+- QTest
+ * Disable keypad navigation for autotests by default
+
+- QTextEdit
+ * Added support for virtual keyboard.
+
+- QThread
+ * Fixed thread termination in Symbian OS.
+
+- QUdpSocket
+ * Updated BindFlag documentation to reflect behaviour on Symbian OS.
+ * Wrote hack for QUdpSocket::writeDatagram return value in Symbian OS.
+
+- QWidget
+ * Added API for setting softkeys.
+ * Fixed background painting. Background can now be overwritten from
+ setting the respective palette role.
+ * Add support for Qt::WA_TranslucentBackground.
+
+- Many classes
+ * Improved exception safety.
+
+****************************************************************************
+* Examples and demos *
+****************************************************************************
+
+- Anomaly browser
+ * Added to demonstrate QtWebkit usage.
+
+- Deform, Pathstroke, and Wiggly
+ * Removed Symbian specific animation timer fixes since more generic
+ fix was made to event dispatcher.
+
+- DesktopServices
+ * Implemented content filters for desktopservices example.
+ * Added error handling to qdesktopservices example when openUrl fails.
+
+- Drilldown
+ * Added to demonstrate QtSql usage in Symbian OS.
+
+- Fluidlauncher
+ * Removed ugly workaround to make emulator deployment work correctly,
+ since the issue has been fixed in qmake.
+ * Included drilldown to demonstrate QtSql usage.
+ * Updated screenshots to S60 style.
+ * Added softkeys example.
+ * Added Anomaly browser to fluidlauncher.
+
+- Ftp
+ * Enabled default IAP setting for FTP example.
+ * IAP dialog will show after FTP UI is on screen.
+ * If active IAP exist that one will be used.
+
+- SecureSocketClient
+ * Fixed build issue caused by lack of cursor.
+
+- Softkeys
+ * New example showing how to use softkeys API in QWidget.
+
+****************************************************************************
+* Tools *
+****************************************************************************
+
+- configure
+ * -cetest is no longer a supported switch for configure.
+ * -stl option is enabled by default for Symbian OS
+ * -openssl option is enabled by default for Symbian OS.
+ * -fpu option enables vfpu type selection for ARM targets.
+
+- qmake
+ * Support for generating Symbian "test" targets: CONFIG += symbian_test.
+ * Support for Symbian Build System, version 2 (aka Raptor) via
+ symbian-sbsv2 mkspec.
+ * PAGED keyword is added to all MMP files by default, except in S60 3.1
+ builds.
+ * Read-only flag is no longer preserved when deploying files into
+ emulator environment.
+ * Changed the timestamp to ISO format in all files generated
+ by qmake for symbian-* mkspecs.
+ * Qt's VERSION variable will now generate VERSION keyword in mmp files.
+ * Made Open C include paths handling bit more robust.
+ * Support both Symbian Foundation header structure in /epoc32/include,
+ as well as old Symbian/S60 structure
+
+- Release package creation
+ * Removed the obsolete script to create release package.
+
+- Createpackage script
+ * Now creates packages with .sis suffix.
+
+- Patch_capabilities script
+ * Will now patch also vendor id in binaries and the UID in the pkg file.
+
+
+****************************************************************************
+* Documentation *
+****************************************************************************
+
+- qmake-manual
+ * 250370: Added documentation for ICON keyword.
+
+****************************************************************************
+* Plugins *
+****************************************************************************
+
+- S60 version specific plugins
+ * Isolated S60 version dependent functionality to S60 version specific
+ plugins (qts60plugin_x_y.dll) to make it possible for single build to
+ run on any supported device, even if with reduced functionality on
+ some.
+
+****************************************************************************
+* Important Behavior Changes *
+****************************************************************************
+
+- Qt libs
+ * Qt libs are now built with "All -Tcb" capabilities always. It is now
+ always necessary to run patch_capabilities.pl script if self-signing
+ of Qt libs is desired.
+ * QtCore and QtSql made UNPAGED when installed via SIS file as a
+ workaround for an obscure crash when they are paged.
+ * qt_libs.pro updated to reflect Open C dependencies, as Qt requires
+ 1.5.0 and newer release.
+ * Qt libs are now build with the "STDCPP" mmp flag. On platforms from
+ TB9.2, Qt code will throw std::bad_alloc exceptions on allocation
+ failure.
diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0
new file mode 100644
index 0000000..ca984ac
--- /dev/null
+++ b/dist/changes-4.6.0
@@ -0,0 +1,121 @@
+Qt 4.6 introduces many new features and improvements as well as bugfixes
+over the 4.5.x series. For more details, refer to the online documentation
+included in this distribution. The documentation is also available online:
+
+ http://qt.nokia.com/doc/4.6
+
+The Qt version 4.6 series is binary compatible with the 4.5.x series.
+Applications compiled for 4.5 will continue to run with 4.6.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Task Tracker:
+
+ http://qt.nokia.com/developer/task-tracker
+
+Each of these identifiers can be entered in the task tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* General *
+****************************************************************************
+
+
+
+****************************************************************************
+* Library *
+****************************************************************************
+
+ * [245219] Added QXmlQuery::setFocus(const QString &focus);
+
+ - QVariant
+ * Many optimisations
+ * Added QVariant::toFloat() and QVariant::toReal()
+ * Added QVariant(float) constructor
+
+****************************************************************************
+* Platform Specific Changes *
+****************************************************************************
+
+ - Significant external contribution from Milan Burda for planned removal
+ of (non-unicode) Windows 9x/ME support.
+
+ - QRegion is no longer a GDI object by default. This means it is no
+ longer subject to gui-thread only nor does it potentially impact
+ the 10.000 GDI object limit per process. By explicitly calling
+ .handle() a GDI object will be created and memory managed by
+ QRegion. The native handle is for reading out only. Any GDI calls
+ made on the HRGN handle will not affect the QRegion.
+
+****************************************************************************
+* Important Behavior Changes *
+****************************************************************************
+
+ - The experimental Direct3D paint engine has been removed. The reason for
+ this is that Nokia focuses on OpenGL for desktop hardware accelerated
+ rendering.
+
+ - When mixing OpenGL and QPainter calls you need to surround your custom
+ OpenGL calls with QPainter::beginNativePainting() and
+ QPainter::endNativePainting().
+ This is to ensure that the paint engine flushes any pending drawing and sets
+ up the GL modelview/projection matrices properly before you can issue custom
+ OpenGL calls, and to let the paint engine synchronize to the painter state
+ before resuming regular QPainter based drawing.
+
+ - Graphics View has undergone heavy optimization work, and as a result of
+ this work, the following behavior changes were introduced.
+
+ a) QStyleOptionGraphicsItem::exposedRect now contains the item's bounding
+ rectangle, and QStyleOptionGraphicsItem::matrix is uninitialized by
+ default. You can enable an exact exposed rectangle and a correct matrix
+ by enabling the flag QGraphicsItem::ItemUsesExtendedStyleOptions.
+
+ b) QStyleOptionGraphicsItem::levelOfDetails is obsoleted and its value is
+ always initialized to 1. Instead you can call
+ QStyleOptionGraphicsItem::levelOfDetailFromTransform(const QTransform &)
+ to determine the level of detail.
+
+ c) QGraphicsView no longer calls QGraphicsView::drawItems(), and in turn
+ QGraphicsScene::drawItems(), by default. You can get the old behavior
+ back by enabling QGraphicsView::IndirectPainting.
+
+ d) QGraphicsItem no longer calls itemChange() for position and
+ transformation changes. If you want to receive notifications for changes
+ to the item's position and transformation, you can set the flag
+ QGraphicsItem::ItemSendsGeometryChanges (which is enabled by default by
+ QGraphicsWidget and QGraphicsProxyWidget).
+
+ - QDesktopWidget on X11 no longer emits the resized(int) signal when screens
+ are added or removed. This was not done on other platforms. Use the
+ screenCountChanged signal instead
+
+ - QUrl's parser is more strict when for hostnames in URLs. QUrl now
+ enforces STD 3 rules:
+
+ * each individual hostname section (between dots) must be at most
+ 63 ASCII characters in length;
+
+ * only letters, digits, and the hyphen character are allowed in the
+ ASCII range; letters outside the ASCII range follow the normal
+ IDN rules
+
+ That means QUrl no longer accepts some URLs that were invalid
+ before, but weren't interpreted as such.
+
+ - The Unix configure-time check for STL is stricter now in Qt
+ 4.6.0. This means some legacy STL implementations may fail to pass
+ the test and, therefore, Qt will automatically disable STL support.
+
+ This is a binary-compatible change: existing code will continue to
+ work without being recompiled. However, it affects the source code,
+ since some STL-compatibility API will not be enabled.
+
+ Platforms affected by this change:
+ * solaris-cc-* with the default (Cstd) C++ STL library
+ recommendation: use -library=stlport4
+ See Sun Studio's documentation for the effects of this option
+
+ - QVariant has now a new implicit constructor that takes a float. This
+ means that code that assigned a float to a variant would create a
+ variant with userType QMetaType::Float, instead of QVariant::Double.
+
diff --git a/doc/doc.pri b/doc/doc.pri
index a4c77fe..66953e6 100644
--- a/doc/doc.pri
+++ b/doc/doc.pri
@@ -2,13 +2,6 @@
# Qt documentation build
#####################################################################
-win32 {
- QT_WINCONFIG = release/
- !CONFIG(release, debug|release) {
- QT_WINCONFIG = debug/
- }
-}
-
DOCS_GENERATION_DEFINES = -Dopensourceedition
GENERATOR = $$QT_BUILD_TREE/bin/qhelpgenerator
@@ -21,9 +14,9 @@ win32:!win32-g++ {
}
$$unixstyle {
- QDOC = cd $$QT_SOURCE_TREE/tools/qdoc3/test && QT_BUILD_TREE=$$QT_BUILD_TREE QT_SOURCE_TREE=$$QT_SOURCE_TREE $$QT_BUILD_TREE/tools/qdoc3/$${QT_WINCONFIG}qdoc3 $$DOCS_GENERATION_DEFINES
+ QDOC = cd $$QT_SOURCE_TREE/tools/qdoc3/test && QT_BUILD_TREE=$$QT_BUILD_TREE QT_SOURCE_TREE=$$QT_SOURCE_TREE $$QT_BUILD_TREE/bin/qdoc3 $$DOCS_GENERATION_DEFINES
} else {
- QDOC = cd $$QT_SOURCE_TREE/tools/qdoc3/test && set QT_BUILD_TREE=$$QT_BUILD_TREE&& set QT_SOURCE_TREE=$$QT_SOURCE_TREE&& $$QT_BUILD_TREE/tools/qdoc3/$${QT_WINCONFIG}qdoc3.exe $$DOCS_GENERATION_DEFINES
+ QDOC = cd $$QT_SOURCE_TREE/tools/qdoc3/test && set QT_BUILD_TREE=$$QT_BUILD_TREE&& set QT_SOURCE_TREE=$$QT_SOURCE_TREE&& $$QT_BUILD_TREE/bin/qdoc3.exe $$DOCS_GENERATION_DEFINES
QDOC = $$replace(QDOC, "/", "\\")
}
macx {
diff --git a/doc/src/accelerators.qdoc b/doc/src/accelerators.qdoc
deleted file mode 100644
index 370a66e..0000000
--- a/doc/src/accelerators.qdoc
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page accelerators.html
- \title Standard Accelerator Keys
- \ingroup gui-programming
-
- Applications invariably need to define accelerator keys for actions.
- Qt fully supports accelerators, for example with \l Q3Accel::shortcutKey().
-
- Here are Microsoft's recommendations for accelerator keys, with
- comments about the Open Group's recommendations where they exist
- and differ. For most commands, the Open Group either has no advice or
- agrees with Microsoft.
-
- The emboldened letter plus Alt is Microsoft's recommended choice, and
- we recommend supporting it. For an Apply button, for example, we
- recommend QAbstractButton::setText(\link QWidget::tr() tr \endlink("&Apply"));
-
- If you have conflicting commands (e.g. About and Apply buttons in the
- same dialog), you must decide for yourself.
-
- \list
- \i \bold{\underline{A}}bout
- \i Always on \bold{\underline{T}}op
- \i \bold{\underline{A}}pply
- \i \bold{\underline{B}}ack
- \i \bold{\underline{B}}rowse
- \i \bold{\underline{C}}lose (CDE: Alt+F4; Alt+F4 is "close window" in Windows)
- \i \bold{\underline{C}}opy (CDE: Ctrl+C, Ctrl+Insert)
- \i \bold{\underline{C}}opy Here
- \i Create \bold{\underline{S}}hortcut
- \i Create \bold{\underline{S}}hortcut Here
- \i Cu\bold{\underline{t}}
- \i \bold{\underline{D}}elete
- \i \bold{\underline{E}}dit
- \i \bold{\underline{E}}xit (CDE: E\bold{\underline{x}}it)
- \i \bold{\underline{E}}xplore
- \i \bold{\underline{F}}ile
- \i \bold{\underline{F}}ind
- \i \bold{\underline{H}}elp
- \i Help \bold{\underline{T}}opics
- \i \bold{\underline{H}}ide
- \i \bold{\underline{I}}nsert
- \i Insert \bold{\underline{O}}bject
- \i \bold{\underline{L}}ink Here
- \i Ma\bold{\underline{x}}imize
- \i Mi\bold{\underline{n}}imize
- \i \bold{\underline{M}}ove
- \i \bold{\underline{M}}ove Here
- \i \bold{\underline{N}}ew
- \i \bold{\underline{N}}ext
- \i \bold{\underline{N}}o
- \i \bold{\underline{O}}pen
- \i Open \bold{\underline{W}}ith
- \i Page Set\bold{\underline{u}}p
- \i \bold{\underline{P}}aste
- \i Paste \bold{\underline{L}}ink
- \i Paste \bold{\underline{S}}hortcut
- \i Paste \bold{\underline{S}}pecial
- \i \bold{\underline{P}}ause
- \i \bold{\underline{P}}lay
- \i \bold{\underline{P}}rint
- \i \bold{\underline{P}}rint Here
- \i P\bold{\underline{r}}operties
- \i \bold{\underline{Q}}uick View
- \i \bold{\underline{R}}edo (CDE: Ctrl+Y, Shift+Alt+Backspace)
- \i \bold{\underline{R}}epeat
- \i \bold{\underline{R}}estore
- \i \bold{\underline{R}}esume
- \i \bold{\underline{R}}etry
- \i \bold{\underline{R}}un
- \i \bold{\underline{S}}ave
- \i Save \bold{\underline{A}}s
- \i Select \bold{\underline{A}}ll
- \i Se\bold{\underline{n}}d To
- \i \bold{\underline{S}}how
- \i \bold{\underline{S}}ize
- \i S\bold{\underline{p}}lit
- \i \bold{\underline{S}}top
- \i \bold{\underline{U}}ndo (CDE: Ctrl+Z or Alt+Backspace)
- \i \bold{\underline{V}}iew
- \i \bold{\underline{W}}hat's This?
- \i \bold{\underline{W}}indow
- \i \bold{\underline{Y}}es
- \endlist
-
- There are also a lot of other keys and actions (that use other
- modifier keys than Alt). See the Microsoft and The Open Group
- documentation for details.
-
- The
- \l{http://www.amazon.com/exec/obidos/ASIN/0735605661/trolltech/t}{Microsoft book}
- has ISBN 0735605661. The corresponding Open Group
- book is very hard to find, rather expensive and we cannot recommend
- it. However, if you really want it, ogpubs@opengroup.org might be able
- to help. Ask them for ISBN 1859121047.
-*/
diff --git a/doc/src/accessible.qdoc b/doc/src/accessible.qdoc
deleted file mode 100644
index a6d65df..0000000
--- a/doc/src/accessible.qdoc
+++ /dev/null
@@ -1,600 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page accessible.html
- \title Accessibility
- \ingroup accessibility
-
- \tableofcontents
-
- \section1 Introduction
-
- Accessibility in computer software is making applications usable
- for people with disabilities. This could be achieved by providing
- keyboard shortcuts, a high-contrast user interface that uses
- specially selected colors and fonts, or support for assistive tools
- such as screen readers and braille displays.
-
- An application does not usually communicate directly with
- assistive tools but through an assistive technology, which is a
- bridge for exchange of information between the applications and
- the tools. Information about user interface elements, such
- as buttons and scroll bars, is exposed to the assistive technologies.
- Qt supports Microsoft Active Accessibility (MSAA) on Windows and
- Mac OS X Accessibility on Mac OS X.
- On Unix/X11, support is preliminary. The individual technologies
- are abstracted from Qt, and there is only a single interface to
- consider. We will use MSAA throughout this document when we need
- to address technology related issues.
-
- In this overview document, we will examine the overall Qt
- accessibility architecture, and how to implement accessibility for
- custom widgets and elements.
-
- \section1 Architecture
-
- Providing accessibility is a collaboration between accessibility
- compliant applications, the assistive technology, and the
- assistive tools.
-
- \image accessibilityarchitecture.png
-
- Accessibility compliant applications are called AT-Servers while
- assistive tools are called AT-Clients. A Qt application will
- typically be an AT-Server, but specialized programs might also
- function like AT-Clients. We will refer to clients and servers
- when talking about AT-Clients and AT-Servers in the rest of this
- document.
-
- We will from now on focus on the Qt accessibility interface and
- how it is implemented to create Qt applications that support
- accessibility.
-
- \section2 Accessibility in Qt
-
- When we communicate with the assistive technologies, we need to
- describe Qt's user interface in a way that they can understand. Qt
- applications use QAccessibleInterface to expose information about the
- individual UI elements. Currently, Qt provides support for its widgets
- and widget parts, e.g., slider handles, but the interface could
- also be implemented for any QObject if necessary. QAccessible
- contains enums that describe the UI. The description is mainly
- based on MSAA and is independent of Qt. We will examine the enums
- in the course of this document.
-
- The structure of the UI is represented as a tree of
- QAccessibleInterface subclasses. You can think of this as a
- representation of a UI like the QObject tree built by Qt. Objects
- can be widgets or widget parts (such as scroll bar handles). We
- examine the tree in detail in the next section.
-
- Servers notify clients through \l{QAccessible::}{updateAccessibility()}
- about changes in objects by sending events, and the clients
- register to receive the events. The available events are defined
- by the QAccessible::Event enum. The clients may then query for
- the object that generated the event through
- QAccessible::queryAccessibleInterface().
-
- Three of the enums in QAccessible help clients query and alter
- accessible objects:
-
- \list
- \o \l{QAccessible::}{Role}: Describes the role the object
- fills in the user interface, e.g., if it is a main
- window, a text caret, or a cell in an item view.
- \o \l{QAccessible::}{Action}: The actions that the
- clients can perform on the objects, e.g., pushing a
- button.
- \o \l{QAccessible::}{Relation}: Describes the relationship
- between objects in the object tree.
- This is used for navigation.
- \endlist
-
- The clients also have some possibilities to get the content of
- objects, e.g., a button's text; the object provides strings
- defined by the QAccessible::Text enum, that give information
- about content.
-
- The objects can be in a number of different states as defined by
- the \l{QAccessible::}{State} enum. Examples of states are whether
- the object is disabled, if it has focus, or if it provides a pop-up
- menu.
-
- \section2 The Accessible Object Tree
-
- As mentioned, a tree structure is built from the accessible
- objects of an application. By navigating through the tree, the
- clients can access all elements in the UI. Object relations give
- clients information about the UI. For instance, a slider handle is
- a child of the slider to which it belongs. QAccessible::Relation
- describes the various relationships the clients can ask objects
- for.
-
- Note that there are no direct mapping between the Qt QObject tree
- and the accessible object tree. For instance, scroll bar handles
- are accessible objects but are not widgets or objects in Qt.
-
- AT-Clients have access to the accessibility object tree through
- the root object in the tree, which is the QApplication. They can
- query other objects through QAccessible::navigate(), which fetches
- objects based on \l{QAccessible::}{Relation}s. The children of any
- node is 1-based numbered. The child numbered 0 is the object
- itself. The children of all interfaces are numbered this way,
- i.e., it is not a fixed numbering from the root node in the entire
- tree.
-
- Qt provides accessible interfaces for its widgets. Interfaces for
- any QObject subclass can be requested through
- QAccessible::queryInterface(). A default implementation is
- provided if a more specialized interface is not defined. An
- AT-Client cannot acquire an interface for accessible objects that
- do not have an equivalent QObject, e.g., scroll bar handles, but
- they appear as normal objects through interfaces of parent
- accessible objects, e.g., you can query their relationships with
- QAccessible::relationTo().
-
- To illustrate, we present an image of an accessible object tree.
- Beneath the tree is a table with examples of object relationships.
-
- \image accessibleobjecttree.png
-
- The labels in top-down order are: the QAccessibleInterface class
- name, the widget for which an interface is provided, and the
- \l{QAccessible::}{Role} of the object. The Position, PageLeft and
- PageRight correspond to the slider handle, the slider groove left
- and the slider groove right, respectively. These accessible objects
- do not have an equivalent QObject.
-
- \table 40%
- \header
- \o Source Object
- \o Target Object
- \o Relation
- \row
- \o Slider
- \o Indicator
- \o Controller
- \row
- \o Indicator
- \o Slider
- \o Controlled
- \row
- \o Slider
- \o Application
- \o Ancestor
- \row
- \o Application
- \o Slider
- \o Child
- \row
- \o PushButton
- \o Indicator
- \o Sibling
- \endtable
-
- \section2 The Static QAccessible Functions
-
- The accessibility is managed by QAccessible's static functions,
- which we will examine shortly. They produce QAccessible
- interfaces, build the object tree, and initiate the connection
- with MSAA or the other platform specific technologies. If you are
- only interested in learning how to make your application
- accessible, you can safely skip over this section to
- \l{Implementing Accessibility}.
-
- The communication between clients and the server is initiated when
- \l{QAccessible::}{setRootObject()} is called. This is done when
- the QApplication instance is instantiated and you should not have
- to do this yourself.
-
- When a QObject calls \l{QAccessible::}{updateAccessibility()},
- clients that are listening to events are notified of the
- change. The function is used to post events to the assistive
- technology, and accessible \l{QAccessible::Event}{events} are
- posted by \l{QAccessible::}{updateAccessibility()}.
-
- \l{QAccessible::}{queryAccessibleInterface()} returns accessible
- interfaces for \l{QObject}s. All widgets in Qt provide interfaces;
- if you need interfaces to control the behavior of other \l{QObject}
- subclasses, you must implement the interfaces yourself, although
- the QAccessibleObject convenience class implements parts of the
- functionality for you.
-
- The factory that produces accessibility interfaces for QObjects is
- a function of type QAccessible::InterfaceFactory. It is possible
- to have several factories installed. The last factory installed
- will be the first to be asked for interfaces.
- \l{QAccessible::}{queryAccessibleInterface()} uses the factories
- to create interfaces for \l{QObject}s. Normally, you need not be
- concerned about factories because you can implement plugins that
- produce interfaces. We will give examples of both approaches
- later.
-
- \section1 Implementing Accessibility
-
- To provide accessibility support for a widget or other user
- interface element, you need to implement the QAccessibleInterface
- and distribute it in a QAccessiblePlugin. It is also possible to
- compile the interface into the application and provide a
- QAccessible::InterfaceFactory for it. The factory can be used if
- you link statically or do not want the added complexity of
- plugins. This can be an advantage if you, for instance, are
- delivering a 3-rd party library.
-
- All widgets and other user interface elements should have
- interfaces and plugins. If you want your application to support
- accessibility, you will need to consider the following:
-
- \list
- \o Qt already implements accessibility for its own widgets.
- We therefore recommend that you use Qt widgets where possible.
- \o A QAccessibleInterface needs to be implemented for each element
- that you want to make available to accessibility clients.
- \o You need to send accessibility events from the custom
- user interface elements that you implement.
- \endlist
-
- In general, it is recommended that you are somewhat familiar with
- MSAA, which Qt originally was built for. You should also study
- the enum values of QAccessible, which describe the roles, actions,
- relationships, and events that you need to consider.
-
- Note that you can examine how Qt's widgets implement their
- accessibility. One major problem with the MSAA standard is that
- interfaces are often implemented in an inconsistent way. This
- makes life difficult for clients and often leads to guesswork on
- object functionality.
-
- It is possible to implement interfaces by inheriting
- QAccessibleInterface and implementing its pure virtual functions.
- In practice, however, it is usually preferable to inherit
- QAccessibleObject or QAccessibleWidget, which implement part of
- the functionality for you. In the next section, we will see an
- example of implementing accessibility for a widget by inheriting
- the QAccessibleWidget class.
-
- \section2 The QAccessibleObject and QAccessibleWidget Convenience Classes
-
- When implementing an accessibility interface for widgets, one would
- as a rule inherit QAccessibleWidget, which is a convenience class
- for widgets. Another available convenience class, which is
- inherited by QAccessibleWidget, is the QAccessibleObject, which
- implements part of the interface for QObjects.
-
- The QAccessibleWidget provides the following functionality:
-
- \list
- \o It handles the navigation of the tree and
- hit testing of the objects.
- \o It handles events, roles, and actions that are common for all
- \l{QWidget}s.
- \o It handles action and methods that can be performed on
- all widgets.
- \o It calculates bounding rectangles with
- \l{QAccessibleInterface::}{rect()}.
- \o It gives \l{QAccessibleInterface::}{text()} strings that are
- appropriate for a generic widget.
- \o It sets the \l{QAccessible::State}{states} that
- are common for all widgets.
- \endlist
-
- \section2 QAccessibleWidget Example
-
- Instead of creating a custom widget and implementing an interface
- for it, we will show how accessibility can be implemented for one of
- Qt's standard widgets: QSlider. Making this widget accessible
- demonstrates many of the issues that need to be faced when making
- a custom widget accessible.
-
- The slider is a complex control that functions as a
- \l{QAccessible::}{Controller} for its accessible children.
- This relationship must be known by the interface (for
- \l{QAccessibleInterface::}{relationTo()} and
- \l{QAccessibleInterface::}{navigate()}). This can be done
- using a controlling signal, which is a mechanism provided by
- QAccessibleWidget. We do this in the constructor:
-
- \snippet doc/src/snippets/accessibilityslidersnippet.cpp 0
-
- The choice of signal shown is not important; the same principles
- apply to all signals that are declared in this way. Note that we
- use QLatin1String to ensure that the signal name is correctly
- specified.
-
- When an accessible object is changed in a way that users need
- to know about, it notifies clients of the change by sending them
- an event via the accessible interface. This is how QSlider calls
- \l{QAccessibleInterface::}{updateAccessibility()} to indicate that
- its value has changed:
-
- \snippet doc/src/snippets/qabstractsliderisnippet.cpp 0
- \dots
- \snippet doc/src/snippets/qabstractsliderisnippet.cpp 1
- \dots
- \snippet doc/src/snippets/qabstractsliderisnippet.cpp 2
-
- Note that the call is made after the value of the slider has
- changed because clients may query the new value immediately after
- receiving the event.
-
- The interface must be able to calculate bounding rectangles of
- itself and any children that do not provide an interface of their
- own. The \c QAccessibleSlider has three such children identified by
- the private enum, \c SliderElements, which has the following values:
- \c PageLeft (the rectangle on the left hand side of the slider
- handle), \c PageRight (the rectangle on the right hand side of the
- handle), and \c Position (the slider handle). Here is the
- implementation of \l{QAccessibleInterface::}{rect()}:
-
- \snippet doc/src/snippets/accessibilityslidersnippet.cpp 1
- \dots
- \snippet doc/src/snippets/accessibilityslidersnippet.cpp 2
- \dots
-
- The first part of the function, which we have omitted, uses the
- current \l{QStyle}{style} to calculate the slider handle's
- bounding rectangle; it is stored in \c srect. Notice that child 0,
- covered in the default case in the above code, is the slider itself,
- so we can simply return the QSlider bounding rectangle obtained
- from the superclass, which is effectively the value obtained from
- QAccessibleWidget::rect().
-
- \snippet doc/src/snippets/accessibilityslidersnippet.cpp 3
-
- Before the rectangle is returned it must be mapped to screen
- coordinates.
-
- The QAccessibleSlider must reimplement
- QAccessibleInterface::childCount() since it manages children
- without interfaces.
-
- The \l{QAccessibleInterface::}{text()} function returns the
- QAccessible::Text strings for the slider:
-
- \snippet doc/src/snippets/accessibilityslidersnippet.cpp 4
-
- The \c slider() function returns a pointer to the interface's
- QSlider. Some values are left for the superclass's implementation.
- Not all values are appropriate for all accessible objects, as you
- can see for QAccessible::Value case. You should just return an
- empty string for those values where no relevant text can be
- provided.
-
- The implementation of the \l{QAccessibleInterface::}{role()}
- function is straightforward:
-
- \snippet doc/src/snippets/accessibilityslidersnippet.cpp 5
-
- The role function should be reimplemented by all objects and
- describes the role of themselves and the children that do not
- provide accessible interfaces of their own.
-
- Next, the accessible interface needs to return the
- \l{QAccessible::State}{states} that the slider can be in. We look
- at parts of the \c state() implementation to show how just a few
- of the states are handled:
-
- \snippet doc/src/snippets/accessibilityslidersnippet.cpp 6
- \dots
- \snippet doc/src/snippets/accessibilityslidersnippet.cpp 7
-
- The superclass implementation of
- \l{QAccessibleInterface::}{state()}, uses the
- QAccessibleInterface::state() implementation. We simply need to
- disable the buttons if the slider is at its minimum or maximum.
-
- We have now exposed the information we have about the slider to
- the clients. For the clients to be able to alter the slider - for
- example, to change its value - we must provide information about
- the actions that can be performed and perform them upon request.
- We discuss this in the next section.
-
- \section2 Handling Action Requests from Clients
-
- QAccessible provides a number of \l{QAccessible::}{Action}s
- that can be performed on request from clients. If an
- accessible object supports actions, it should reimplement the
- following functions from QAccessibleInterface:
-
- \list
- \o \l{QAccessibleInterface::}{actionText()} returns
- strings that describe each action. The descriptions
- to be made available are one for each
- \l{QAccessible::}{Text} enum value.
- \o \l{QAccessibleInterface::}{doAction()} executes requests
- from clients to perform actions.
- \endlist
-
- Note that a client can request any action from an object. If
- the object does not support the action, it returns false from
- \l{QAccessibleInterface::}{doAction()}.
-
- None of the standard actions take any parameters. It is possible
- to provide user-defined actions that can take parameters.
- The interface must then also reimplement
- \l{QAccessibleInterface::}{userActionCount()}. Since this is not
- defined in the MSAA specification, it is probably only useful to
- use this if you know which specific AT-Clients will use the
- application.
-
- QAccessibleInterface gives another technique for clients to handle
- accessible objects. It works basically the same way, but uses the
- concept of methods in place of actions. The available methods are
- defined by the QAccessible::Method enum. The following functions
- need to be reimplemented from QAccessibleInterface if the
- accessible object is to support methods:
-
- \list
- \o \l{QAccessibleInterface::}{supportedMethods()} returns
- a QSet of \l{QAccessible::}{Method} values that are
- supported by the object.
- \o \l{QAccessibleInterface::}{invokeMethod()} executes
- methods requested by clients.
- \endlist
-
- The action mechanism will probably be substituted by providing
- methods in place of the standard actions.
-
- To see examples on how to implement actions and methods, you
- could examine the QAccessibleObject and QAccessibleWidget
- implementations. You might also want to take a look at the
- MSAA documentation.
-
- \section2 Implementing Accessible Plugins
-
- In this section we will explain the procedure of implementing
- accessible plugins for your interfaces. A plugin is a class stored
- in a shared library that can be loaded at run-time. It is
- convenient to distribute interfaces as plugins since they will only
- be loaded when required.
-
- Creating an accessible plugin is achieved by inheriting
- QAccessiblePlugin, reimplementing \l{QAccessiblePlugin::}{keys()}
- and \l{QAccessiblePlugin::}{create()} from that class, and adding
- one or two macros. The \c .pro file must be altered to use the
- plugin template, and the library containing the plugin must be
- placed on a path where Qt searches for accessible plugins.
-
- We will go through the implementation of \c SliderPlugin, which is an
- accessible plugin that produces interfaces for the
- QAccessibleSlider we implemented in the \l{QAccessibleWidget Example}.
- We start with the \c key() function:
-
- \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 0
-
- We simply need to return the class name of the single interface
- our plugin can create an accessible interface for. A plugin
- can support any number of classes; just add more class names
- to the string list. We move on to the \c create() function:
-
- \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 1
-
- We check whether the interface requested is for the QSlider; if it
- is, we create and return an interface for it. Note that \c object
- will always be an instance of \c classname. You must return 0 if
- you do not support the class.
- \l{QAccessible::}{updateAccessibility()} checks with the
- available accessibility plugins until it finds one that does not
- return 0.
-
- Finally, you need to include macros in the cpp file:
-
- \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 2
-
- The Q_EXPORT_PLUGIN2 macro exports the plugin in the \c
- SliderPlugin class into the \c acc_sliderplugin library. The first
- argument is the name of the plugin library file, excluding the
- file suffix, and the second is the class name. For more information
- on plugins, consult the plugins \l{How to Create Qt
- Plugins}{overview document}.
-
- You can omit the first macro unless you want the plugin
- to be statically linked with the application.
-
- \section2 Implementing Interface Factories
-
- If you do not want to provide plugins for your accessibility
- interfaces, you can use an interface factory
- (QAccessible::InterfaceFactory), which is the recommended way to
- provide accessible interfaces in a statically-linked application.
-
- A factory is a function pointer for a function that takes the same
- parameters as \l{QAccessiblePlugin}'s
- \l{QAccessiblePlugin::}{create()} - a QString and a QObject. It
- also works the same way. You install the factory with the
- \l{QAccessible::}{installFactory()} function. We give an example
- of how to create a factory for the \c SliderPlugin class:
-
- \snippet doc/src/snippets/accessibilityfactorysnippet.cpp 0
- \dots
- \snippet doc/src/snippets/accessibilityfactorysnippet.cpp 1
-
- \omit
-
- \section1 Implementing Bridges for Other Assistive Technologies
-
- An accessibility bridge provides the means for an assistive
- technology to talk to Qt. On Windows and Mac, the built-in bridges
- will be used. On UNIX, however, there are no built-in standard
- assistive technology, and it might therefore be necessary to
- implement an accessible bridge.
-
- A bridge is implemented by inheriting QAccessibleBridge for the
- technology to support. The class defines the interface that Qt
- needs an assistive technology to support:
-
- \list
- \o A root object. This is the root in the accessible
- object tree and is of type QAccessibleInterface.
- \o Receive events from from accessible objects.
- \endlist
-
- The root object is set with the
- \l{QAccessibleBridge::}{setRootObject()}. In the case of Qt, this
- will always be an interface for the QApplication instance of the
- application.
-
- Event notification is sent through
- \l{QAccessibleBridge::}{notifyAccessibilityUpdate()}. This
- function is called by \l{QAccessible::}{updateAccessibility()}. Even
- though the bridge needs only to implement these two functions, it
- must be able to communicate the entire QAccessibleInterface to the
- underlying technology. How this is achieved is, naturally, up to
- the individual bridge and none of Qt's concern.
-
- As with accessible interfaces, you distribute accessible bridges
- in plugins. Accessible bridge plugins are subclasses of the
- QAccessibleBridgePlugin class; the class defines the functions
- \l{QAccessibleBridgePlugin::}{create()} and
- \l{QAccessibleBridgePlugin::}{keys()}, which must me
- reimplemented. If Qt finds a built-in bridge to use, it will
- ignore any available plugins.
-
- \endomit
-
- \section1 Further Reading
-
- The \l{Cross-Platform Accessibility Support in Qt 4} document contains a more
- general overview of Qt's accessibility features and discusses how it is
- used on each platform.
- issues
-*/
diff --git a/doc/src/activeqt-dumpcpp.qdoc b/doc/src/activeqt-dumpcpp.qdoc
deleted file mode 100644
index cae9b9e..0000000
--- a/doc/src/activeqt-dumpcpp.qdoc
+++ /dev/null
@@ -1,143 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page activeqt-dumpcpp.html
- \title The dumpcpp Tool (ActiveQt)
-
- \ingroup activeqt-tools
-
- \keyword dumpcpp
-
- The \c dumpcpp tool generates a C++ namespace for a type library.
-
- To generate a C++ namespace for a type library, call \c dumpcpp with the following
- command line parameters:
-
- \table
- \header
- \i Option
- \i Result
- \row
- \i input
- \i Generate documentation for \e input. \e input can specify a type library file or a type
- library ID, or a CLSID or ProgID for an object
- \row
- \i -o file
- \i Writes the class declaration to \e {file}.h and meta object infomation to \e {file}.cpp
- \row
- \i -n namespace
- \i Generate a C++ namespace \e namespace
- \row
- \i -nometaobject
- \i Do not generate a .cpp file with the meta object information.
- The meta object is then generated in runtime.
- \row
- \i -getfile libid
- \i Print the filename for the typelibrary \e libid to stdout
- \row
- \i -compat
- \i Generate namespace with dynamicCall-compatible API
- \row
- \i -v
- \i Print version information
- \row
- \i -h
- \i Print help
- \endtable
-
- \c dumpcpp can be integrated into the \c qmake build system. In your .pro file, list the type
- libraries you want to use in the TYPELIBS variable:
-
- \snippet examples/activeqt/qutlook/qutlook.pro 0
-
- The generated namespace will declare all enumerations, as well as one QAxObject subclass
- for each \c coclass and \c interface declared in the type library. coclasses marked with
- the \c control attribute will be wrapped by a QAxWidget subclass.
-
- Those classes that wrap creatable coclasses (i.e. coclasses that are not marked
- as \c noncreatable) have a default constructor; this is typically a single class
- of type \c Application.
-
- \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 0
-
- All other classes can only be created by passing an IDispatch interface pointer
- to the constructor; those classes should however not be created explicitly.
- Instead, use the appropriate API of already created objects.
-
- \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 1
-
- All coclass wrappers also have one constructors taking an interface wrapper class
- for each interface implemented.
-
- \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 2
-
- You have to create coclasses to be able to connect to signals of the subobject.
- Note that the constructor deletes the interface object, so the following will
- cause a segmentation fault:
-
- \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 3
-
- If the return type is of a coclass or interface type declared in another type
- library you have to include the namespace header for that other type library
- before including the header for the namespace you want to use (both header have
- to be generated with this tool).
-
- By default, methods and property returning subobjects will use the type as in
- the type library. The caller of the function is responsible for deleting or
- reparenting the object returned. If the \c -compat switch is set, properties
- and method returning a COM object have the return type \c IDispatch*, and
- the namespace will not declare wrapper classes for interfaces.
-
- In this case, create the correct wrapper class explicitly:
-
- \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 4
-
- You can of course use the IDispatch* returned directly, in which case you have to
- call \c Release() when finished with the interface.
-
- All classes in the namespace are tagged with a macro that allows you to export
- or import them from a DLL. To do that, declare the macro to expand to
- \c __declspec(dllimport/export) before including the header file.
-
- To build the tool you must first build the QAxContainer library.
- Then run your make tool in \c tools/dumpcpp.
-*/
diff --git a/doc/src/activeqt.qdoc b/doc/src/activeqt.qdoc
deleted file mode 100644
index 2ee3498..0000000
--- a/doc/src/activeqt.qdoc
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page activeqt.html
- \title ActiveQt Framework
- \brief An overview of Qt's ActiveX and COM integration on Windows.
-
- \ingroup platform-notes
- \keyword ActiveQt
-
- Qt's ActiveX and COM support allows Qt for Windows developers to:
-
- \list 1
- \o Access and use ActiveX controls and COM objects provided by any
- ActiveX server in their Qt applications.
- \o Make their Qt applications available as COM servers, with
- any number of Qt objects and widgets as COM objects and ActiveX
- controls.
- \endlist
-
- The ActiveQt framework consists of two modules:
-
- \list
- \o The \l QAxContainer module is a static
- library implementing QObject and QWidget subclasses, QAxObject and
- QAxWidget, that act as containers for COM objects and ActiveX
- controls.
- \o The \l QAxServer module is a static library that implements
- functionality for in-process and executable COM servers. This
- module provides the QAxAggregated, QAxBindable and QAxFactory
- classes.
- \endlist
-
- To build the static libraries, change into the \c activeqt directory
- (usually \c QTDIR/src/activeqt), and run \c qmake and your make
- tool in both the \c container and the \c control subdirectory.
- The libraries \c qaxcontainer.lib and \c qaxserver.lib will be linked
- into \c QTDIR/lib.
-
- If you are using a shared configuration of Qt enter the \c plugin
- subdirectory and run \c qmake and your make tool to build a
- plugin that integrates the QAxContainer module into \l{Qt
- Designer}.
-
- The ActiveQt modules are part of the \l{Qt Full Framework Edition} and
- the \l{Open Source Versions of Qt}.
-
- \sa {QAxContainer Module}, {QAxServer Module}
-*/
diff --git a/doc/src/annotated.qdoc b/doc/src/annotated.qdoc
deleted file mode 100644
index 0c62ee9..0000000
--- a/doc/src/annotated.qdoc
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Documentation for class overview.
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \page annotated.html
- \title Annotated Class Index
- \ingroup classlists
-
- Qt's classes with brief descriptions:
-
- \generatelist annotatedclasses
-*/
diff --git a/doc/src/appicon.qdoc b/doc/src/appicon.qdoc
deleted file mode 100644
index 24e4e22..0000000
--- a/doc/src/appicon.qdoc
+++ /dev/null
@@ -1,226 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Qt Application Icon Usage Documentation.
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \page appicon.html
- \title Setting the Application Icon
- \ingroup gui-programming
-
- The application icon, typically displayed in the top-left corner of an
- application's top-level windows, is set by calling the
- QWidget::setWindowIcon() method on top-level widgets.
-
- In order to change the icon of the executable application file
- itself, as it is presented on the desktop (i.e., prior to
- application execution), it is necessary to employ another,
- platform-dependent technique.
-
- \tableofcontents
-
- \section1 Setting the Application Icon on Windows
-
- First, create an ICO format bitmap file that contains the icon
- image. This can be done with e.g. Microsoft Visual C++: Select
- \menu{File|New}, then select the \menu{File} tab in the dialog
- that appears, and choose \menu{Icon}. (Note that you do not need
- to load your application into Visual C++; here we are only using
- the icon editor.)
-
- Store the ICO file in your application's source code directory,
- for example, with the name \c myappico.ico. Then, create a text
- file called, say, \c myapp.rc in which you put a single line of
- text:
-
- \snippet doc/src/snippets/code/doc_src_appicon.qdoc 0
-
- Finally, assuming you are using \c qmake to generate your
- makefiles, add this line to your \c myapp.pro file:
-
- \snippet doc/src/snippets/code/doc_src_appicon.qdoc 1
-
- Regenerate your makefile and your application. The \c .exe file
- will now be represented with your icon in Explorer.
-
- If you do not use \c qmake, the necessary steps are: first, run
- the \c rc program on the \c .rc file, then link your application
- with the resulting \c .res file.
-
- \section1 Setting the Application Icon on Mac OS X
-
- The application icon, typically displayed in the application dock
- area, is set by calling QWidget::setWindowIcon() on a top-level
- widget. It is possible that the program could appear in the
- application dock area before the function call, in which case a
- default icon will appear during the bouncing animation.
-
- To ensure that the correct icon appears, both when the application is
- being launched, and in the Finder, it is necessary to employ a
- platform-dependent technique.
-
- Although many programs can create icon files (\c .icns), the
- recommended approach is to use the \e{Icon Composer} program
- supplied by Apple (in the \c Developer/Application folder).
- \e{Icon Composer} allows you to import several different sized
- icons (for use in different contexts) as well as the masks that
- go with them. Save the set of icons to a file in your project
- directory.
-
- If you are using qmake to generate your makefiles, you only need
- to add a single line to your \c .pro project file. For example,
- if the name of your icon file is \c{myapp.icns}, and your project
- file is \c{myapp.pro}, add this line to \c{myapp.pro}:
-
- \snippet doc/src/snippets/code/doc_src_appicon.qdoc 2
-
- This will ensure that \c qmake puts your icons in the proper
- place and creates an \c{Info.plist} entry for the icon.
-
- If you do not use \c qmake, you must do the following manually:
- \list 1
- \i Create an \c Info.plist file for your application (using the
- \c PropertyListEditor, found in \c Developer/Applications).
- \i Associate your \c .icns record with the \c CFBundleIconFile record in the
- \c Info.plist file (again, using the \c PropertyListEditor).
- \i Copy the \c Info.plist file into your application bundle's \c Contents
- directory.
- \i Copy the \c .icns file into your application bundle's \c Contents/Resources
- directory.
- \endlist
-
- \section1 Setting the Application Icon on Common Linux Desktops
-
- In this section we briefly describe the issues involved in providing
- icons for applications for two common Linux desktop environments:
- \l{http://www.kde.org/}{KDE} and \l{http://www.gnome.org/}{GNOME}.
- The core technology used to describe application icons
- is the same for both desktops, and may also apply to others, but there
- are details which are specific to each. The main source of information
- on the standards used by these Linux desktops is
- \l{http://www.freedesktop.org/}{freedesktop.org}. For information
- on other Linux desktops please refer to the documentation for the
- desktops you are interested in.
-
- Often, users do not use executable files directly, but instead launch
- applications by clicking icons on the desktop. These icons are
- representations of "desktop entry files" that contain a description of
- the application that includes information about its icon. Both desktop
- environments are able to retrieve the information in these files, and
- they use it to generate shortcuts to applications on the desktop, in
- the start menu, and on the panel.
-
- More information about desktop entry files can be found in the
- \l{http://www.freedesktop.org/Standards/desktop-entry-spec}{Desktop Entry
- Specification}.
-
- Although desktop entry files can usefully encapsulate the application's details,
- we still need to store the icons in the conventional location for each desktop
- environment. A number of locations for icons are given in the
- \l{http://www.freedesktop.org/Standards/icon-theme-spec}{Icon Theme
- Specification}.
-
- Although the path used to locate icons depends on the desktop in use,
- and on its configuration, the directory structure beneath each of
- these should follow the same pattern: subdirectories are arranged by
- theme, icon size, and application type. Generally, application icons
- are added to the hicolor theme, so a square application icon 32 pixels
- in size would be stored in the \c hicolor/32x32/apps directory beneath
- the icon path.
-
- \section2 K Desktop Environment (KDE)
-
- Application icons can be installed for use by all users, or on a per-user basis.
- A user currently logged into their KDE desktop can discover these locations
- by using \l{http://developer.kde.org/documentation/other/kde-config.html}{kde-config},
- for example, by typing the following in a terminal window:
-
- \snippet doc/src/snippets/code/doc_src_appicon.qdoc 3
-
- Typically, the list of colon-separated paths printed to stdout includes the
- user-specific icon path and the system-wide path. Beneath these
- directories, it should be possible to locate and install icons according
- to the conventions described in the
- \l{http://www.freedesktop.org/Standards/icon-theme-spec}{Icon Theme Specification}.
-
- If you are developing exclusively for KDE, you may wish to take
- advantage of the \link
- http://developer.kde.org/documentation/other/makefile_am_howto.html
- KDE build system\endlink to configure your application. This ensures
- that your icons are installed in the appropriate locations for KDE.
-
- The KDE developer website is at \l{http://developer.kde.org/}.
-
- \section2 GNOME
-
- Application icons are stored within a standard system-wide
- directory containing architecture-independent files. This
- location can be determined by using \c gnome-config, for example
- by typing the following in a terminal window:
-
- \snippet doc/src/snippets/code/doc_src_appicon.qdoc 4
-
- The path printed on stdout refers to a location that should contain a directory
- called \c{pixmaps}; the directory structure within the \c pixmaps
- directory is described in the \link
- http://www.freedesktop.org/Standards/icon-theme-spec Icon Theme
- Specification \endlink.
-
- If you are developing exclusively for GNOME, you may wish to use
- the standard set of \link
- http://developer.gnome.org/tools/build.html GNU Build Tools\endlink,
- also described in the relevant section of
- the \link http://developer.gnome.org/doc/GGAD/ggad.html GTK+/Gnome
- Application Development book\endlink. This ensures that your icons are
- installed in the appropriate locations for GNOME.
-
- The GNOME developer website is at \l{http://developer.gnome.org/}.
-*/
diff --git a/doc/src/assistant-manual.qdoc b/doc/src/assistant-manual.qdoc
deleted file mode 100644
index 1b6746c..0000000
--- a/doc/src/assistant-manual.qdoc
+++ /dev/null
@@ -1,810 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page assistant-manual.html
- \title Qt Assistant Manual
- \ingroup qttools
-
- \startpage {index.html}{Qt Reference Documentation}
- \nextpage Qt Assistant in More Detail
-
- \keyword Qt Assistant
-
- This document introduces \QA, a tool for presenting on-line
- documentation. The document is divided into the following sections:
-
- Table of contents:
-
- \list
- \o \l{The One-Minute Guide to Using Qt Assistant}
- \o \l{Qt Assistant in More Detail}
- \o \l{Using Qt Assistant as a Custom Help Viewer}
- \endlist
-
- \chapter The One-Minute Guide to Using Qt Assistant
-
- Once you have installed Qt, \QA should be ready to run:
-
- \list
- \o On Windows, \QA is available as a menu option on the Qt menu.
- \o On Mac OS X, \QA is installed in the /Developer/Applications/Qt directory.
- \o On Unix/Linux, open a terminal, type \c{assistant} and press \key{Enter}.
- \endlist
-
- When you start up \QA, you will be presented with a standard main window
- application, with a menu bar and toolbar. Below these, on the left hand
- side are navigation windows called \e{Contents}, \e{Index} and \e{Bookmarks}.
- On the right, taking up most of the space, is the \e{Documentation} window.
- By default, \QA loads the Qt reference documentation along with the manuals
- of other Qt tools, like \QD or \QL.
-
- \QA works in a similar way to a Web browser. If you click hyperlinks
- (cross-references), the \e{Documentation} window will present the relevant
- page. You can bookmark pages of particular interest and you can click the
- \gui{Previous} and \gui{Next} toolbar buttons to navigate within the pages
- you have visited.
-
- Although \QA can be used just like a Web browser to navigate through
- the documentation, \QA offers a powerful means of navigation that Web
- browsers do not provide. \QA uses an advanced full text search engine
- to index all the pages in each compressed help file so that you can
- search for particular words and phrases.
-
- To perform an index search, click the \gui{Index} tab on the Sidebar
- (or press \key{Alt+I}). In the \gui{'Look For'} line edit enter a word;
- e.g., 'homedirpath'. As you type, words are found and highlighted in a list
- beneath the line edit. If the highlighted text matches what you're
- looking for, double click it, (or press \key{Enter}) and the
- \e{Documentation} window will display the relevant page. You rarely have
- to type in the whole word before \QA finds a match. Note that for some
- words there may be more than one possible page that is relevant.
-
- \QA also provides full text searching for finding specific words in
- the documentation. To activate the full text search, either press \key(Alt+S)
- or click on the \gui{Search} tab in the \e{Documentation} window. Then
- enter the term you're looking for and hit the \gui{Search} button. All
- documents containing the specified term will then be listed in the list box
- below.
-*/
-
-/*!
- \page assistant-details.html
- \title Qt Assistant in More Detail
-
- \contentspage {Qt Assistant Manual}{Contents}
- \previouspage Qt Assistant Manual
- \nextpage Using Qt Assistant as a Custom Help Viewer
-
- \tableofcontents
-
- \img assistant-assistant.png
-
- \section1 Command Line Options
-
- \QA handles the following command line options:
-
- \table
- \header
- \o Command Line Option
- \o Brief Description
- \row
- \o -collectionFile <file.qhc>
- \o Uses the specified collection file instead of the default one.
- \row
- \o -showUrl URL
- \o Shows the document referenced by URL.
- \row
- \o -enableRemoteControl
- \o Enables \QA to be remotly controlled.
- \row
- \o -show <widget>
- \o Shows the specified dockwidget which can be "contents", "index",
- "bookmarks" or "search".
- \row
- \o -hide <widget>
- \o Hides the specified dockwidget which can be "contents", "index",
- "bookmarks" or "search.
- \row
- \o -activate <widget>
- \o Activates the specified dockwidget which can be "contents",
- "index", "bookmarks" or "search.
- \row
- \o -register <doc.qch>
- \o Registers the specified compressed help file in the given help
- collection.
- \row
- \o -unregister <doc.qch>
- \o Unregisters the specified compressed help file from the given
- collection file.
- \row
- \o -setCurrentFilter filter
- \o Sets the given filter as the active filter.
- \row
- \o -quiet
- \o Doesn't show any error, warning or success messages.
- \endtable
-
- \section1 Tool Windows
-
- \img assistant-dockwidgets.png
-
- The tool windows provide four ways to navigate the documentation:
-
- \list
- \o The \gui{Contents} window presents a table of contents implemented as a
- tree view for the documentation that is available. If you click an item,
- its documentation will appear in the \e{Documentation} window. If you double
- click an item or click on the control to the left of it, the item's sub-items
- will appear. Click a sub-item to make its page appear in the \e{Documentation}
- window. Click on the control next to an open item to hide its sub-items.
- \o The \gui{Index} window is used to look up key words or phrases.
- See \l{The One-Minute Guide to Using Qt Assistant} for how to use this
- window.
- \o The \gui{Bookmarks} window lists any bookmarks you have made. Double
- click a bookmark to make its page appear in the \e{Documentation} window.
- The \gui{Bookmarks} window provides a context menu with \gui{Show Item},
- \gui{Delete Item} as well as \gui{Rename Item}. Click in the main menu
- \menu{Bookmark|Add Bookmark...} (or press \key{Ctrl+B}) to bookmark the
- page that is currently showing in the \e{Documentation} window. Right click
- a bookmark in the list to rename or delete the highlighted bookmark.
- \endlist
-
- If you want the \gui{Documentation} window to use as much space as possible,
- you can easily group, move or hide the tool windows. To group the windows,
- drag one on top of the other and release the mouse. If one or all tool
- windows are not shown, press \key{Alt+C}, \key{Alt+I} or \key{Alt+O} to show
- the required window.
-
- The tool windows can be docked into the main window, so you can drag them
- to the top, left, right or bottom of \e{Qt Assistant's} window, or you can
- drag them outside \QA to float them as independent windows.
-
- \section1 Documentation Window
-
- \img assistant-docwindow.png
-
- The \gui{Documentation} window lets you create a tab for each
- documentation page that you view. Click the \gui{Add Tab} button and a new
- tab will appear with the page name as the tab's caption. This makes it
- convenient to switch between pages when you are working with different
- documentation. You can delete a tab by clicking the \gui{Close Tab} button
- located on the right side of the \gui{Documentation} window.
-
- \section1 Toolbars
-
- \img assistant-toolbar.png
-
- The main toolbar provides fast access to the most common actions.
-
- \table
- \header \o Action \o Description \o Menu Item \o Shortcut
- \row \o \gui{Previous} \o Takes you to the previous page in the history.
- \o \menu{Go|Previous} \o \key{Alt+Left Arrow}
- \row \o \gui{Next} \o Takes you to the next page in the history.
- \o \menu{Go|Next} \o \key{Alt+Right Arrow}
- \row \o \gui{Home}
- \o Takes you to the home page as specified in the Preferences Dialog.
- \o \menu{Go|Home} \o \key{Ctrl+Home}.
- \row \o \gui{Sync with Table of Contents}
- \o Synchronizes the \gui{Contents} tool window with the page currently
- shown in the \gui{Documentation} window.
- \o \menu{Go|Sync with Table of Contents} \o
- \row \o \gui{Copy} \o Copies any selected text to the clipboard.
- \o \menu{Edit|Copy} \o \key{Ctrl+C}
- \row \o \gui{Print} \o Opens the \gui{Print} dialog.
- \o \menu{File|Print} \o \key{Ctrl+P}
- \row \o \gui{Find in Text} \o Opens the \gui{Find Text} dialog.
- \o \menu{Edit|Find in Text} \o \key{Ctrl+F}
- \row \o \gui{Zoom in}
- \o Increases the font size used to display text in the current tab.
- \o \menu{View|Zoom in} \o \key{Ctrl++}
- \row \o \gui{Zoom out}
- \o Decreases the font size used to display text in the current tab.
- \o \menu{View|Zoom out} \o \key{Ctrl+-}
- \row \o \gui{Normal Size}
- \o Resets the font size to its normal size in the current tab.
- \o \menu{View|Normal Size} \o \key{Ctrl+0}
- \endtable
-
- \img assistant-address-toolbar.png
-
- The address toolbar provides a fast way to enter a specific URL for a
- documentation file. By default, the address toolbar is not shown, so it
- has to be activated via \menu{View|Toolbars|Address Toolbar}.
-
- \img assistant-filter-toolbar.png
-
- The filter toolbar allows you to apply a filter to the currently installed
- documentation. As with the address toolbar, the filter toolbar is not visible
- by default and has to be activated via \menu{View|Toolbars|Filter Toolbar}.
-
- \section1 Menus
-
- \section2 File Menu
-
- \list
- \o \menu{File|Page Setup...} invokes a dialog allowing you to define
- page layout properties, such as margin sizes, page orientation and paper size.
- \o \menu{File|Print Preview...} provides a preview of the printed pages.
- \o \menu{File|Print...} opens the \l{#Print Dialog}{\gui{Print} dialog}.
- \o \menu{File|New Tab} opens a new empty tab in the \gui{Documentation}
- window.
- \o \menu{File|Close Tab} closes the current tab of the
- \gui{Documentation} window.
- \o \menu{File|Exit} closes the \QA application.
- \endlist
-
- \section2 Edit Menu
-
- \list
- \o \menu{Edit|Copy} copies any selected text to the clipboard.
- \o \menu{Edit|Find in Text} invokes the \l{#Find Text Control}{\gui{Find Text}
- control} at the lower end of the \gui{Documentation} window.
- \o \menu{Edit|Find Next} looks for the next occurance of the specified
- text in the \gui{Find Text} control.
- \o \menu{Edit|Find Previous} looks for the previous occurance of
- the specified text in the \l{#Find Text Control}{\gui{Find Text} control}.
- \o \menu{Edit|Preferences} invokes the \l{#Preferences Dialog}{\gui{Preferences} dialog}.
- \endlist
-
- \section2 View Menu
-
- \list
- \o \menu{View|Zoom in} increases the font size in the current tab.
- \o \menu{View|Zoom out} decreases the font size in the current tab.
- \o \menu{View|Normal Size} resets the font size in the current tab.
- \o \menu{View|Contents} toggles the display of the \gui{Contents} tool window.
- \o \menu{View|Index} toggles the display of the \gui{Index} tool window.
- \o \menu{View|Bookmarks} toggles the display of the \gui{Bookmarks} tool window.
- \o \menu{View|Search} toggles the display of the Search in the \gui{Documentation} window.
- \endlist
-
- \section2 Go Menu
-
- \list
- \o \menu{Go|Home} goes to the home page.
- \o \menu{Go|Back} displays the previous page in the history.
- \o \menu{Go|Forward} displays the next page in the history.
- \o \menu{Go|Sync with Table of Contents} syncs the \gui{Contents} tool window to the currently shown page.
- \o \menu{Go|Next Page} selects the next tab in the \gui{Documentation} window.
- \o \menu{Go|Previous Page} selects the previous tab in the \gui{Documentation} window.
- \endlist
-
- \section2 Bookmarks Menu
-
- \list
- \o \menu{Bookmarks|Add} adds the current page to the list of bookmarks.
- \endlist
-
- \section1 Dialogs
-
- \section2 Print Dialog
-
- This dialog is platform-specific. It gives access to various printer
- options and can be used to print the document shown in the current tab.
-
- \section2 Preferences Dialog
-
- \img assistant-preferences-fonts.png
-
- The \menu{Fonts} page allows you to change the font family and font sizes of the
- browser window displaying the documentation or the application itself.
-
- \img assistant-preferences-filters.png
-
- The \menu{Filters} page lets you create and remove documentation
- filters. To add a new filter, click the \gui{Add} button, specify a
- filter name in the pop-up dialog and click \gui{OK}, then select
- the filter attributes in the list box on the right hand side.
- You can delete a filter by selecting it and clicking the \gui{Remove}
- button.
-
- \img assistant-preferences-documentation.png
-
- The \menu{Documentation} page lets you install and remove compressed help
- files. Click the \gui{Install} button and choose the path of the compressed
- help file (*.qch) you would like to install.
- To delete a help file, select a documentation set in the list and click
- \gui{Remove}.
-
- \img assistant-preferences-options.png
-
- The \menu{Options} page lets you specify the homepage \QA will display when
- you click the \gui{Home} button in \QA's main user interface. You can specify
- the hompage by typing it here or clicking on one of the buttons below the
- textbox. \gui{Current Page} sets the currently displayed page as your home
- page while \gui{Restore to default} will reset your home page to the default
- home page.
-
- \section1 Find Text Control
-
- This control is used to find text in the current page. Enter the text you want
- to find in the line edit. The search is incremental, meaning that the most
- relevant result is shown as you enter characters into the line edit.
-
- If you check the \gui{Whole words only} checkbox, the search will only consider
- whole words; for example, if you search for "spin" with this checkbox checked it will
- not match "spinbox", but will match "spin". If you check the \gui{Case sensitive}
- checkbox then, for example, "spin" will match "spin" but not "Spin". You can
- search forwards or backwards from your current position in the page by clicking
- the \gui{Previous} or \gui{Next} buttons. To hide the find control, either click the
- \gui{Close} button or hit the \key{Esc} key.
-
- \section1 Filtering Help Contents
-
- \QA allows you to install any kind of documentation as long as it is organized
- in Qt compressed help files (*.qch). For example, it is possible to install the
- Qt reference documentation for Qt 4.4.0 and Qt 4.4.1 at the same time. In many
- respects, this is very convenient since only one version of \QA is needed.
- However, at the same time it becomes more complicated when performing tasks like
- searching the index because nearly every keyword is defined in Qt 4.4.0 as well
- as in Qt 4.4.1. This means that \QA will always ask the user to choose which one
- should be displayed.
-
- We use documentation filters to solve this issue. A filter is identified by its
- name, and contains a list of filter attributes. An attribute is just a string and
- can be freely chosen. Attributes are defined by the documentation itself, this
- means that every documentation set usually has one or more attributes.
-
- For example, the Qt 4.4.0 \QA documentation defines the attributes \c {assistant},
- \c{tools} and \c{4.4.0}, \QD defines \c{designer}, \c{tools} and \c{4.4.0}.
- The filter to display all tools would then define only the attribute
- \c{tools} since this attribute is part of both documentation sets.
- Adding the attribute \c{assistant} to the filter would then only show \QA
- documentation since the \QD documentation does not contain this
- attribute. Having an empty list of attributes in a filter will match all
- documentation; i.e., it is equivalent to requesting unfiltered documentation.
-
- \section1 Full Text Searching
-
- \img assistant-search.png
-
- \QA provides a powerful full text search engine. To search
- for certain words or text, click the \gui{Search} tab in the \gui{Documentation}
- window. Then enter the text you want to look for and press \key{Enter}
- or click the \gui{Search} button. The search is not case sensitive, so,
- for example, Foo, fOo and FOO are all treated as the same. The following are
- examples of common search patterns:
-
- \list
- \o \c deep -- lists all the documents that contain the word 'deep'
- \o \c{deep*} -- lists all the documents that contain a word beginning
- with 'deep'
- \o \c{deep copy} -- lists all documents that contain both 'deep' \e
- and 'copy'
- \o \c{"deep copy"} -- list all documents that contain the phrase 'deep copy'
- \endlist
-
- It is also possible to use the \gui{Advanced search} to get more flexibility.
- You can specify some words so that hits containing these are excluded from the
- result, or you can search for an exact phrase. Searching for similar words will
- give results like these:
-
- \list
- \o \c{QStin} -- lists all the documents with titles that are similar, such as \c{QString}
- \o \c{QSting} -- lists all the documents with titles that are similar, such as \c{QString}
- \o \c{QStrin} -- lists all the documents with titles that are similar, such as \c{QString}
- \endlist
-
- Options can be combined to improve the search results.
-
- The list of documents found is ordered according to the number of
- occurrences of the search text which they contain, with those containing
- the highest number of occurrences appearing first. Simply click any
- document in the list to display it in the \gui{Documentation} window.
-
- If the documentation has changed \mdash for example, if documents have been added
- or removed \mdash \QA will index them again.
-
-*/
-
-/*!
- \page assistant-custom-help-viewer.html
- \title Using Qt Assistant as a Custom Help Viewer
-
- \contentspage {Qt Assistant Manual}{Contents}
- \previouspage Qt Assistant in More Detail
-
- Using \QA as custom help viewer requires more than just being able to
- display custom documentation. It is equally important that the
- appearance of \QA can be customized so that it is seen as a
- application-specific help viewer rather than \QA. This is achieved by
- changing the window title or icon, as well as some application-specific
- menu texts and actions. The complete list of possible customizations
- can be found in the \l{Creating a Custom Help Collection File} section.
-
- Another requirement of a custom help viewer is the ability to receive
- actions or commands from the application it provides help for. This is
- especially important when the application offers context sensitive help.
- When used in this way, the help viewer may need to change its contents
- depending on the state the application is currently in. This means that
- the application has to communicate the current state to the help viewer.
- The section about \l{Using Qt Assistant Remotely} explains how this can
- be done.
-
- \tableofcontents
-
- The \l{Simple Text Viewer Example}{Simple Text Viewer} example uses the
- techniques described in this document to show how to use \QA as a custom
- help viewer for an application.
-
- \warning In order to ship Qt Assistant in your application, it is crucial
- that you include the sqlite plugin. For more information on how to include
- plugins in your application, refer to the \l{Deploying Qt Applications}
- {deployment documentation}.
-
- \section1 Qt Help Collection Files
-
- The first important point to know about \QA is that it stores all
- settings related to its appearance \e and a list of installed
- documentation in a help collection file. This means, when starting \QA
- with different collection files, \QA may look totally different. This
- complete separation of settings makes it possible to deploy \QA as a
- custom help viewer for more than one application on one machine
- without risk of interference between different instances of \QA.
-
- To apply a certain help collection to \QA, specify the respective
- collection file on the command line when starting it. For example:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
-
- However, storing all settings in one collection file raises some problems.
- The collection file is usually installed in the same directory as the
- application itself, or one of its subdirectories. Depending on the
- directory and the operating system, the user may not have any permissions
- to modify this file which would happen when the user settings are stored.
- Also, it may not even be possible to give the user write permissions;
- e.g., when the file is located on a read-only medium like a CD-ROM.
-
- Even if it is possible to give everybody the right to store their settings
- in a globally available collection file, the settings from one user would
- be overwritten by another user when exiting \QA.
-
- To solve this dilemma, \QA creates user specific collection files which
- are more or less copied from the original collection file. The user-specific
- collection file will be saved in a subdirectory of the path returned by
- QDesktopServices::DataLocation. The subdirectory, or \e{cache directory}
- within this user-specific location, can be defined in the help collection
- project file. For example:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 7
-
- So, when calling
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
-
- \QA actually uses the collection file:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 9
-
- There is no need ever to start \QA with the user specific collection
- file. Instead, the collection file shipped with the application should
- always be used. Also, when adding or removing documentation from the
- collection file (see next section) always use the normal collection file.
- \QA will take care of synchronizing the user collection files when the
- list of installed documentation has changed.
-
- \section1 Displaying Custom Documentation
-
- Before \QA is able to show documentation, it has to know where it can
- find the actual documentation files, meaning that it has to know the
- location of the Qt compressed help file (*.qch). As already mentioned,
- \QA stores references to the compressed help files in the currently used
- collection file. So, when creating a new collection file you can list
- all compressed help files \QA should display.
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 5
-
- Sometimes, depending on the application for which \QA acts as a
- help viewer, more documentation needs to be added over time; for
- example, when installing more application components or plugins.
- This can be done manually by starting \QA, opening the \gui{Edit|Preferences}
- dialog and navigating to the \gui{Documentation} tab page. Then click
- the \gui{Add...} button, select a Qt compressed help file (*.qch)
- and press \gui{Open}. However, this approach has the disadvantage
- that every user has to do it manually to get access to the new
- documentation.
-
- The prefered way of adding documentation to an already existing collection
- file is to use the \c{-register} command line flag of \QA. When starting
- \QA with this flag, the documentation will be added and \QA will
- exit right away displaying a message if the registration was successful
- or not.
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 6
-
- The \c{-quiet} flag can be passed on to \QA to prevent it from writing
- out the status message.
-
- \bold{Note:} \QA will show the documentation in the contents view in the same
- order as it was registered.
-
-
- \section1 Changing the Appearance of Qt Assistant
-
- The appearance of \QA can be changed by passing different command line options
- on startup. However, these command line options only allow to show or hide
- specific widgets, like the contents or index view. Other customizations, such
- as changing the application title or icon, or disabling the filter functionality,
- can be done by creating a custom help collection file.
-
- \section2 Creating a Custom Help Collection File
-
- The help collection file (*.qhc) used by \QA is created when running the
- \c qcollectiongenerator tool on a help collection project file (*.qhcp).
- The project file format is XML and supports the following tags:
-
- \table
- \header
- \o Tag
- \o Brief Description
- \row
- \o \c{<title>}
- \o This property is used to specify a window title for \QA.
- \row
- \o \c{<homePage>}
- \o This tag specifies which page should be display when
- pressing the home button in \QA's main user interface.
- \row
- \o \c{<startPage>}
- \o This tag specifies which page \QA should initially
- display when the help collection is used.
- \row
- \o \c{<currentFilter>}
- \o This tag specifies the \l{Qt Assistant in More Detail#Preferences Dialog}{filter}
- that is initially used.
- If this filter is not specified, the documentation will not be filtered. This has
- no impact if only one documentation set is installed.
- \row
- \o \c{<applicationIcon>}
- \o This tag describes an icon that will be used instead of the normal \QA
- application icon. This is specified as a relative path from the directory
- containing the collection file.
- \row
- \o \c{<enableFilterFunctionality>}
- \o This tag is used to enable or disable user accessible filter functionality,
- making it possible to prevent the user from changing any filter when running \QA.
- It does not mean that the internal filter functionality is completely disabled.
- Set the value to \c{false} if you want to disable the filtering. If the filter
- toolbar should be shown by default, set the attribute \c{visible} to \c{true}.
- \row
- \o \c{<enableDocumentationManager>}
- \o This tag is used to specify whether the documentation manager should be shown
- in the preferences dialog. Disabling the Documentation Manager allows you to limit
- \QA to display a specific documentation set or make it impossible for the end user
- to accidentally remove or install documentation. To hide the documentation manager,
- set the tag value to \c{false}.
- \row
- \o \c{<enableAddressBar>}
- \o This tag describes if the address bar can be shown. By default it is
- enabled; if you want to disable it set the tag value to \c{false}. If the
- address bar functionality is enabled, the address bar can be shown by setting the
- tag attribute \c{visible} to \c{true}.
- \row
- \o \c{<aboutMenuText>, <text>}
- \o The \c{aboutMenuText} tag lists texts for different languages which will
- later appear in the \menu{Help} menu; e.g., "About Application". A text is
- specified within the \c{text} tags; the \c{language} attribute takes the two
- letter language name. The text is used as the default text if no language
- attribute is specified.
- \row
- \o \c{<aboutDialog>, <file>, <icon>}
- \o The \c{aboutDialog} tag can be used to specify the text for the \gui{About}
- dialog that can be opened from the \menu{Help} menu. The text is taken from the
- file in the \c{file} tags. It is possible to specify a different file or any
- language. The icon defined by the \c{icon} tags is applied to any language.
- \row
- \o \c{<cacheDirectory>}
- \o Specified as a path relative to the directory given by
- QDesktopServices::DataLocation, the cache path is used to store index files
- needed for the full text search and a copy of the collection file.
- The copy is needed because \QA stores all its settings in the collection file;
- i.e., it must be writable for the user.
- \endtable
-
- In addition to those \QA specific tags, the tags for generating and registering
- documentation can be used. See \l{QtHelp Module#Creating a Qt Help Collection}{Qt Help Collection}
- documentation for more information.
-
- An example of a help collection file that uses all the available tags is shown below:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 1
-
- To create the binary collection file, run the \c qcollectiongenerator tool:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 10
-
- To test the generated collection file, start \QA in the following way:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
-
- \section1 Using Qt Assistant Remotely
-
- Even though the help viewer is a standalone application, it will mostly
- be launched by the application it provides help for. This approach
- gives the application the possibility to ask for specific help contents
- to be displayed as soon as the help viewer is started. Another advantage
- with this approach is that the application can communicate with the
- help viewer process and can therefore request other help contents to be
- shown depending on the current state of the application.
-
- So, to use \QA as the custom help viewer of your application, simply
- create a QProcess and specify the path to the Assistant executable. In order
- to make Assistant listen to your application, turn on its remote control
- functionality by passing the \c{-enableRemoteControl} command line option.
-
- \warning The trailing '\0' must be appended separately to the QByteArray,
- e.g., \c{QByteArray("command" + '\0')}.
-
- The following example shows how this can be done:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 2
-
- Once \QA is running, you can send commands by using the stdin channel of
- the process. The code snippet below shows how to tell \QA to show a certain
- page in the documentation.
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 3
-
- The following commands can be used to control \QA:
-
- \table
- \header
- \o Command
- \o Brief Description
- \row
- \o \c{show <Widget>}
- \o Shows the dock widget specified by <Widget>. If the widget
- is already shown and this command is sent again, the widget will be
- activated, meaning that it will be raised and given the input focus.
- Possible values for <Widget> are "contents", "index", "bookmarks" or "search".
- \row
- \o \c{hide <Widget>}
- \o Hides the dock widget specified by <Widget>. Possible values for
- <Widget> are "contents", "index", "bookmarks" and "search".
- \row
- \o \c{setSource <Url>}
- \o Displays the given <Url>. The URL can be absolute or relative
- to the currently displayed page. If the URL is absolute, it has to
- be a valid Qt help system URL; i.e., starting with "qthelp://".
- \row
- \o \c{activateKeyword <Keyword>}
- \o Inserts the specified <Keyword> into the line edit of the
- index dock widget and activates the corresponding item in the
- index list. If such an item has more than one link associated
- with it, a topic chooser will be shown.
- \row
- \o \c{activateIdentifier <Id>}
- \o Displays the help contents for the given <Id>. An ID is unique
- in each namespace and has only one link associated to it, so the
- topic chooser will never pop up.
- \row
- \o \c{syncContents}
- \o Selects the item in the contents widget which corresponds to
- the currently displayed page.
- \row
- \o \c{setCurrentFilter}
- \o Selects the specified filter and updates the visual representation
- accordingly.
- \row
- \o \c{expandToc <Depth>}
- \o Expands the table of contents tree to the given depth. If depth
- is less than 1, the tree will be collapsed completely.
- \endtable
-
- If you want to send several commands within a short period of time, it is
- recommended that you write only a single line to the stdin of the process
- instead of one line for every command. The commands have to be separated by
- a semicolon, as shown in the following example:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 4
-
- \section1 Compatibility with Old Formats
-
- In older versions of Qt, the help system was based on Document Content File
- (DCF) and Qt Assistant Documentation Profile (ADP) formats. In contrast,
- Qt Assistant and the help system used in Qt 4.4 use the formats described
- earlier in this manual.
-
- Unfortunately, the old file formats are not compatible with the new ones.
- In general, the differences are not that big \mdash in most cases is the old
- format is just a subset of the new one. One example is the \c namespace tag in
- the Qt Help Project format, which was not part of the old format, but plays a vital
- role in the new one. To help you to move to the new file format, we have created
- a conversion wizard.
-
- The wizard is started by executing \c qhelpconverter. It guides you through the
- conversion of different parts of the file and generates a new \c qch or \c qhcp
- file.
-
- Once the wizard is finished and the files created, run the \c qhelpgenerator
- or the \c qcollectiongenerator tool to generate the binary help files used by \QA.
-*/
-
-/*
-\section2 Modifying \QA with Command Line Options
-
- Different help collections can be shown by simply passing the help collection
- path to \QA. For example:
-
- \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 0
-
- Other available options the can be passed on the command line.
-
- \table
- \header
- \o Command Line Option
- \o Brief Description
- \row
- \o -collectionFile <file.qhc>
- \o Uses the specified collection file instead of the default one.
- \row
- \o -showUrl URL
- \o Shows the document referenced by URL.
- \row
- \o -enableRemoteControl
- \o Enables \QA to be remotly controlled.
- \row
- \o -show <widget>
- \o Shows the specified dockwidget which can be "contents", "index",
- "bookmarks" or "search".
- \row
- \o -hide <widget>
- \o Hides the specified dockwidget which can be "contents", "index",
- "bookmarks" or "search.
- \row
- \o -activate <widget>
- \o Activates the specified dockwidget which can be "contents",
- "index", "bookmarks" or "search.
- \row
- \o -register <doc.qch>
- \o Registers the specified compressed help file in the given help
- collection.
- \row
- \o -unregister <doc.qch>
- \o Unregisters the specified compressed help file from the given
- collection file.
- \row
- \o -quiet
- \o Doesn't show any error, warning or success messages.
- \endtable
- */
diff --git a/doc/src/atomic-operations.qdoc b/doc/src/atomic-operations.qdoc
deleted file mode 100644
index b2f619f..0000000
--- a/doc/src/atomic-operations.qdoc
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page atomic-operations.html
- \title Implementing Atomic Operations
- \ingroup architecture
- \ingroup qt-embedded-linux
- \brief A guide to implementing atomic operations on new architectures.
-
- Qt uses an optimization called \l {Implicitly Shared
- Classes}{implicit sharing} for many of its value classes.
-
- Starting with Qt 4, all of Qt's implicitly shared classes can
- safely be copied across threads like any other value classes,
- i.e., they are fully \l {Thread Support in Qt#Reentrancy and
- Thread-Safety}{reentrant}. This is accomplished by implementing
- reference counting operations using atomic hardware instructions
- on all the different platforms supported by Qt.
-
- To support a new architecture, it is important to ensure that
- these platform-specific atomic operations are implemented in a
- corresponding header file (\c qatomic_ARCH.h), and that this file
- is located in Qt's \c src/corelib/arch directory. For example, the
- Intel 80386 implementation is located in \c
- src/corelib/arch/qatomic_i386.h.
-
- Currently, Qt provides two classes providing several atomic
- operations, QAtomicInt and QAtomicPointer. These classes inherit
- from QBasicAtomicInt and QBasicAtomicPointer, respectively.
-
- When porting Qt to a new architecture, the QBasicAtomicInt and
- QBasicAtomicPointer classes must be implemented, \e not QAtomicInt
- and QAtomicPointer. The former classes do not have constructors,
- which makes them POD (plain-old-data). Both classes only have a
- single member variable called \c _q_value, which stores the
- value. This is the value that all of the atomic operations read
- and modify.
-
- All of the member functions mentioned in the QAtomicInt and
- QAtomicPointer API documentation must be implemented. Note that
- these the implementations of the atomic operations in these
- classes must be atomic with respect to both interrupts and
- multiple processors.
-
- \warning The QBasicAtomicInt and QBasicAtomicPointer classes
- mentioned in this document are used internally by Qt and are not
- part of the public API. They may change in future versions of
- Qt. The purpose of this document is to aid people interested in
- porting Qt to a new architecture.
-*/
diff --git a/doc/src/bughowto.qdoc b/doc/src/bughowto.qdoc
index fc97be9..09f9bf8 100644
--- a/doc/src/bughowto.qdoc
+++ b/doc/src/bughowto.qdoc
@@ -43,7 +43,6 @@
\page bughowto.html
\title How to Report a Bug
\brief Information about ways to report bugs in Qt.
- \ingroup howto
If you think you have found a bug in Qt, we would like to hear
about it so that we can fix it.
@@ -52,7 +51,9 @@
Notes}, and the \l{Task Tracker} on the Qt website to see
if the issue is already known.
- Always include the following information in your bug report:
+ If you have found a new bug, please submit a bug report using
+ the \l{Bug Report Form}. Always include the following information
+ in your bug report:
\list 1
\o The name and version number of your compiler
@@ -66,6 +67,6 @@
such a program can be created with some minor changes to one
of the many example programs in Qt's \c examples directory.
- Please submit the bug report using the \l{Task Tracker} on the Qt
- website.
+ If you have implemented a bug fix and want to contribute your fix
+ directly, then you can do so through the \l{Public Qt Repository}.
*/
diff --git a/doc/src/classes.qdoc b/doc/src/classes.qdoc
index fdf1807..f6aa468 100644
--- a/doc/src/classes.qdoc
+++ b/doc/src/classes.qdoc
@@ -40,26 +40,134 @@
****************************************************************************/
/*!
+ \group classlists
+ \title Class and Function Documentation
+ \brief Lists and Indexes of classes, functions, and types.
+
+ Links to indexes and lists for finding class and function
+ reference documentation.
+
+ \section2 Class Lists
+
+ \annotatedlist classlists
+
+ \section2 Function Lists
+
+ \annotatedlist funclists
+
+*/
+
+/*!
\page classes.html
- \title Qt's Classes
+ \title All Qt Classes (main index)
\ingroup classlists
- This is a list of all Qt classes excluding the \l{Qt 3
- compatibility classes}. For a shorter list that only includes the
- most frequently used classes, see \l{Qt's Main Classes}.
+ \brief If you know the name of the class you want, find it here.
+
+ This is a list of all Qt classes. For a list of the classes
+ provided for compatibility with Qt3, see \l{Qt3 Support
+ Classes}. For classes that have been deprecated, see the
+ \l{Obsolete Classes} list.
\generatelist classes
- \sa {Qt 3 Compatibility Classes}, {Qt's Modules}
+ \sa {Qt3 Support Classes}, {All Qt Modules}, {Obsolete Classes}
+*/
+
+/*!
+ \page annotated.html
+ \title Annotated Class List
+ \ingroup classlists
+
+ \brief If you don't know the name of the class you want, but you
+ know what the class should do, you might try looking here.
+
+ Qt classes with brief descriptions:
+
+ \generatelist annotatedclasses
+*/
+
+/*!
+ \group groups
+ \title Groups Of Related Classes
+ \ingroup classlists
+
+ \brief If you know what kind of class you want (GUI, painting,
+ I.O, etc), look here.
+
+ This is a list of functional groups of Qt classes. A class can
+ appear in more than one functional group.
+
+ \generatelist{related}
+
*/
/*!
+ \page hierarchy.html
+
+ \title Inheritance Hierarchy
+ \ingroup classlists
+
+ \brief The C++ class inheritance hierarchy for all classes in the
+ Qt API.
+
+ \generatelist classhierarchy
+*/
+
+/*!
+ \page obsoleteclasses.html
+ \title Obsolete Classes
+ \ingroup classlists
+
+ \brief These classes are obsolete and should not be used in new code.
+
+ This is a list of Qt classes that are obsolete (deprecated). These
+ classes are provided to keep old source code working but they are
+ no longer maintained. We strongly advise against using these
+ classes in new code.
+
+ \generatelist obsoleteclasses
+
+*/
+
+/*!
+ \page compatclasses.html
+ \title Qt3 Support Classes
+ \ingroup classlists
+
+ \brief These classes ease the porting of code from Qt 3 to Qt 4.
+
+ These are the classes that Qt provides for compatibility with Qt
+ 3. Most of these are provided by the Qt3Support module.
+
+ \generatelist compatclasses
+
+*/
+
+/*!
+ \page functions.html
+ \title All Functions (main index)
+ \ingroup funclists
+
+ \brief All documented Qt functions listed alphabetically with a
+ link to where each one is declared.
+
+ This is the list of all documented member functions and global
+ functions in the Qt API. Each function has a link to the class or
+ header file where it is declared and documented.
+
+ \generatelist functionindex
+*/
+
+
+/*!
\page namespaces.html
- \title Qt's Namespaces
+ \title All Qt Namespaces
\ingroup classlists
- This is a list of the main namespaces in Qt. For a list of classes in
- Qt, see \l{Qt's Classes}.
+ \brief A Qt namespace contains enum types, functions, and sometimes classes.
+
+ This is a list of the main namespaces in Qt.
\generatelist{namespaces}
*/
diff --git a/doc/src/classes/exportedfunctions.qdoc b/doc/src/classes/exportedfunctions.qdoc
new file mode 100644
index 0000000..40fc9e3
--- /dev/null
+++ b/doc/src/classes/exportedfunctions.qdoc
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page exportedfunctions.html
+ \title Platform-Specific Functions
+ \ingroup funclists
+
+ \brief Exported functions for fine tuning Qt applications.
+
+ Qt provides a few low-level global functions for fine-tuning
+ applications. Most of these perform very specific tasks and are
+ platform-specific. In general, we recommend that you try using
+ Qt's public API before resorting to using any functions mentioned
+ here.
+
+ These functions are exported by \l QtCore and \l QtGui, but most
+ of them aren't declared in Qt's header files. To use them in your
+ application, you must declare them before calling them. For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_exportedfunctions.qdoc 0
+
+ These functions will remain as part of Qt for the lifetime of Qt
+ 4.
+
+ Functions:
+
+ \tableofcontents
+
+ \section1 void qt_set_library_config_file(const QString &\e{fileName})
+
+ Specifies the location of the Qt configuration file. You must
+ call this function before constructing a QApplication or
+ QCoreApplication object. If no location is specified, Qt
+ automatically finds an appropriate location.
+
+ \section1 void qt_set_sequence_auto_mnemonic(bool \e{enable})
+
+ Specifies whether mnemonics for menu items, labels, etc., should
+ be honored or not. On Windows and X11, this feature is
+ on by default; on Mac OS X, it is off. When this feature is off,
+ the QKeySequence::mnemonic() function always returns an empty
+ string. This feature is also enabled on embedded Linux.
+
+ \section1 void qt_x11_wait_for_window_manager(QWidget *\e{widget})
+
+ Blocks until the X11 window manager has shown the widget after a
+ call to QWidget::show().
+
+ \section1 void qt_mac_secure_keyboard(bool \e{enable})
+
+ Turns the Mac OS X secure keyboard feature on or off. QLineEdit
+ uses this when the echo mode is QLineEdit::Password or
+ QLineEdit::NoEcho to guard the editor against keyboard sniffing.
+ If you implement your own password editor, you might want to turn
+ on this feature in your editor's
+ \l{QWidget::focusInEvent()}{focusInEvent()} and turn it off in
+ \l{QWidget::focusOutEvent()}{focusOutEvent()}.
+
+ \section1 void qt_mac_set_dock_menu(QMenu *\e{menu})
+
+ Sets the menu to display in the Mac OS X Dock for the
+ application. This menu is shown when the user attempts a
+ press-and-hold operation on the application's dock icon or
+ \key{Ctrl}-clicks on it while the application is running.
+
+ The menu will be turned into a Mac menu and the items added to the default
+ Dock menu. There is no merging of the Qt menu items with the items that are
+ in the Dock menu (i.e., it is not recommended to include actions that
+ duplicate functionality of items already in the Dock menu).
+
+ \section1 void qt_mac_set_menubar_icons(bool \e{enable})
+
+ Specifies whether icons associated to menu items for the
+ application's menu bar should be shown on Mac OS X. By default,
+ icons are shown on Mac OS X just like on the other platforms.
+
+ In Qt 4.4, this is equivalent to
+ \c { QApplication::instance()->setAttribute(Qt::AA_DontShowIconsInMenus); }.
+
+ \section1 void qt_mac_set_menubar_merge(bool \e{enable})
+
+ Specifies whether Qt should attempt to relocate standard menu
+ items (such as \gui Quit, \gui Preferences, and \gui About) to
+ the application menu on Mac OS X. This feature is on by default.
+ See \l{Qt for Mac OS X - Specific Issues} for the list of menu items for
+ which this applies.
+
+ \section1 void qt_mac_set_native_menubar(bool \e{enable})
+
+ Specifies whether the application should use the native menu bar
+ on Mac OS X or be part of the main window. This feature is on by
+ default.
+
+ In Qt 4.6, this is equivalent to
+ \c { QApplication::instance()->setAttribute(Qt::AA_DontUseNativeMenuBar); }.
+
+ \section1 void qt_mac_set_press_and_hold_context(bool \e{enable})
+
+ Turns emulation of the right mouse button by clicking and holding
+ the left mouse button on or off. This feature is off by default.
+*/
diff --git a/doc/src/classes/phonon-api.qdoc b/doc/src/classes/phonon-api.qdoc
new file mode 100644
index 0000000..09274bf
--- /dev/null
+++ b/doc/src/classes/phonon-api.qdoc
@@ -0,0 +1,5023 @@
+/*
+ This file is part of the KDE project
+ Copyright (C) 2005-2007 Matthias Kretz <kretz@kde.org>
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ Contact: Nokia Corporation (qt-info@nokia.com)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+
+/*!
+ \enum Phonon::DiscType
+ Enum to identify the media discs supported by MediaObject.
+
+ \value NoDisc
+ No disc was selected. This is only useful as a return value from
+ MediaSource::diskType().
+ \value Cd Identifies Audio CDs.
+ \value Dvd Identifies DVDs (not arbitrary data DVDs, only movie DVDs).
+ \value Vcd Identifies Video CDs.
+
+ \sa MediaSource, MediaObject
+*/
+
+/*!
+ \enum Phonon::MetaData
+
+ Provided as keys for Phonon::MediaObject::metaData(). The enum
+ values matches strings defined in the Ogg Vorbis specification
+
+ \value ArtistMetaData
+ \value AlbumMetaData
+ \value TitleMetaData
+ \value DateMetaData
+ \value GenreMetaData
+ \value TracknumberMetaData
+ \value DescriptionMetaData
+ \value MusicBrainzDiscIdMetaData
+*/
+
+/*!
+ \enum Phonon::State
+ \since 4.4
+
+ The state enum describes the different states a media object can
+ take. Several functions of \l{Phonon::}{MediaObject} are
+ asynchronous, so even if a you have requested a state change
+ through a function call, e.g., through
+ \l{Phonon::MediaObject::}{play()}, you cannot be sure that the
+ change has taken place before you receive the
+ \l{Phonon::MediaObject::}{stateChanged()} signal.
+
+ A media object can at any time change into any state, regardless
+ of the state it previously had. \omit In the
+ \l{Phonon::}{MediaObject} class description explains the typical
+ state changes in the life of a media object. \endomit
+
+ \value LoadingState
+ After construction it might take a while before the media object
+ is ready to \l{Phonon::MediaObject::}{play()}. This state is
+ commonly used by backends to initialize the \l{Phonon
+ Overview}{media graph} and loading the source. When
+ the object leaves the loading state, it will enter the
+ StoppedState unless an error occurred or another state is
+ requested through a function call, e.g.,
+ \l{Phonon::}{MediaObject::play()}.
+
+ \value StoppedState
+ In the stopped state, the media object is ready to play its
+ current media source. The current
+ \l{MediaObject::seek()}{position} in the media stream is then 0.
+
+ \value PlayingState
+ The media object is playing back its media source.
+
+ \value BufferingState
+ The Player is waiting for data to be able to start or continue
+ playing. This state is commonly used to wait for media data over a
+ network connection.
+
+ \value PausedState
+ The media player has currently paused its playback, i.e., it
+ stops playing but keeps the current playback position in the
+ stream.
+
+ \value ErrorState
+ When a media object enters the error state a problem with the
+ playback has occurred. The possible errors are grouped into
+ two categories by Phonon::ErrorType, and the type can be
+ queried through \l{Phonon::MediaObject::}{errorType()}. A
+ \l{Phonon::}{FatalError} implies that the playback
+ cannot continue, but one can still try with a new media
+ source. With a \l{Phonon::}{NormalError} it might
+ be possible to continue playback, and a media object may
+ therefore change state from the ErrorState.
+
+ \sa MediaObject
+*/
+
+/*!
+ \enum Phonon::Category
+
+ Sets the category your program should be listed in in the mixer.
+
+ \value NoCategory
+ Will make use of the default device.
+ \value NotificationCategory
+ If the sounds produced are notifications (ping, beep and such) you
+ should use this category.
+ \value MusicCategory
+ If your application is a music player (like a jukebox or media player
+ playing an audio file).
+ \value VideoCategory
+ If the sound is the audio channel of a video.
+ \value CommunicationCategory
+ If your applications produces sounds from communication with somebody
+ else (VoIP, voice chat).
+ \value GameCategory
+ Sound produced by a computer game should go into this category.
+ \value AccessibilityCategory
+ Sounds produced for accessibility (e.g., Text-To-Speech)
+ \omitvalue LastCategory
+ Holds the largest value of categories.
+ \omitvalue AccessibilityCategory
+
+ A Jukebox will set this to Music, a VoIP program to Communication, a
+ DVD player to video, and so on.
+
+ \note These categories can also become useful for an application that
+ controls the volumes automatically, like turning down the music when a call
+ comes in, or turning down the notifications when the media player knows
+ it's playing classical music.
+*/
+
+/*!
+ \enum Phonon::ErrorType
+
+ This enum describes the severity when an error has occurred during
+ playback.
+
+ After a media object has entered the \l{Phonon::}{ErrorState}, one
+ can query the type of error from
+ \l{Phonon::}{MediaObject::errorType()}. Note that you should query
+ the error when receiving the
+ \l{Phonon::}{MediaObject::stateChanged()} signal, because the
+ error type will be lost if the media object leaves the error
+ state.
+
+ \value NoError No error. MediaObject::errorType() returns this if
+ MediaObject::state() != Phonon::ErrorState.
+
+ \value NormalError An error has occurred with the playback of the current
+ source. It might be possible to continue playback, for instance, if only the
+ audio stream in a video cannot be played back. The media object will then
+ leave the error state again.
+
+ \value FatalError. Something important does not work. Your program cannot continue
+ the playback of the current source, but it might be possible to try another.
+
+ \sa MediaObject::errorType()
+*/
+
+/*!
+ \fn QString Phonon::categoryToString(Category c)
+
+ Returns a (translated) string to show to the user identifying the given
+ Category (\a c).
+*/
+
+/*!
+ \enum Phonon::ObjectDescriptionType
+ \relates Phonon::ObjectDescription
+
+ This enum defines the type of information that is contained in a
+ \l{Phonon::}{ObjectDescription} object.
+
+ \value AudioOutputDeviceType An audio output device (\l{Phonon::}{AudioOutputDevice}).
+ This can be soundcards (with different drivers),
+ sound servers, or other virtual outputs like playback on a different
+ computer on the network.
+
+ \value EffectType An audio effect (\l{Phonon::}{EffectDescription}).
+ \omitvalue SubtitleType
+ \omitvalue AudioCaptureDeviceType
+ \omitvalue AudioChannelType
+*/
+
+/*!
+ \typedef Phonon::AudioOutputDevice
+ \relates Phonon::ObjectDescription
+
+ This typedef of \l{Phonon::}{ObjectDescription} describes an audio output
+ device, such as soundcards (with different drivers), sound servers, or other
+ virtual outputs like playback on a different computer on the network.
+
+ \omit
+ For Hardware devices the backend should use libkaudiodevicelist
+ (AudioDevice and AudioDeviceEnumerator) which will list removable
+ devices even when they are unplugged and provide a unique identifier
+ that can make backends use the same identifiers.
+ \endomit
+
+ A list of available devices is given by the backend with
+ Backendcapabilities::availableAudioOutputDevices()
+
+ \snippet doc/src/snippets/phononobjectdescription.cpp 1
+
+*/
+
+/*!
+ \fn Phonon::phononVersion()
+ \inmodule Phonon
+ \since 4.5
+
+ Returns the Phonon version.
+*/
+
+/*!
+ \class Phonon::ObjectDescription
+ \inmodule Phonon
+ \inheaderfile Phonon/ObjectDescription
+ \since 4.4
+ \brief The ObjectDescription class provides information about Phonon objects.
+
+ Phonon currently uses this class to describe audio effects and
+ audio output devices - using the typedefs AudioOutputDevice and
+ EffectDescription. The type of an ObjectDescription is also
+ described through the \l{Phonon::}{ObjectDescriptionType} enum.
+ Objects of the same \l{Phonon::ObjectDescriptionType}{type} are
+ uniquely identified by an index().
+
+ The class gives a description() and a name() of the object, both
+ of which are strings appropriate for end users of a Phonon
+ application. You can also check whether the device or effect
+ described is \l{isValid()}{valid}. This does not guarantee that
+ the device or effect functions as expected, but that the
+ ObjectDescription describes an existing device or effect.
+
+ Audio output devices and effect descriptions are used to select
+ the audio output device to be used for playback and to create
+ effects; we show examples of this in the snippet below. The
+ available descriptions can be fetched with
+ \l{Phonon::BackendCapabilities::}{availableAudioOutputDevices()}
+ and \l{Phonon::BackendCapabilities::}{availableAudioEffects()}
+ static functions in the Phonon::BackendCapabilities namespace
+
+ \snippet doc/src/snippets/phononobjectdescription.cpp 0
+
+ Other types of ObjectDescriptions might be possible in the future,
+ e.g., descriptions of audio capture devices, such as microphones.
+
+ \omit Not implemented yet.
+ Need a new paragraph on that some descriptions 'belong
+ together', such as chained audio effects.
+
+ Some parts give the end user choices, e.g. what source to capture
+ audio from. These choices are described by the name and
+ description methods of this class and identified with the id
+ method. Subclasses then define additional information like which
+ audio and video choices belong together. \endomit
+
+ \sa Phonon::AudioOutputDevice, Phonon::EffectDescription, {Capabilities Example}, {Phonon Module}
+*/
+
+/*!
+ \fn Phonon::ObjectDescription::ObjectDescription()
+ \brief constructs a new object description.
+ \internal
+*/
+
+/*!
+ \fn Phonon::ObjectDescription::ObjectDescription (int index, const QHash<QByteArray, QVariant> & properties)
+ \internal
+*/
+
+/*!
+ \fn Phonon::ObjectDescription::ObjectDescription(const QExplicitlySharedDataPointer<ObjectDescriptionData> &dd)
+ \internal
+*/
+
+/*!
+ \fn static inline ObjectDescription<T> Phonon::ObjectDescription::fromIndex(int index)
+ \internal
+
+ \omit Currently indices are not unique for all ObjectDescription types, making
+ the behavior of this function undefined. \endomit
+
+ Returns a new description object that describes the
+ device/effect/codec/... with the given \a index.
+*/
+
+/*!
+ \fn inline bool Phonon::ObjectDescription::operator==(const ObjectDescription &otherDescription) const
+
+ Returns \c true if this ObjectDescription describes the same
+ object as \a otherDescription; otherwise, returns \c false.
+*/
+
+/*!
+ \fn inline bool Phonon::ObjectDescription::operator!=(const ObjectDescription &otherDescription) const
+ Returns \c false if this ObjectDescription describes the same
+ as \a otherDescription; otherwise, returns \c true.
+*/
+
+/*!
+ \fn inline QString Phonon::ObjectDescription::name() const
+
+ Returns a string appropriate for a user to select between
+ object descriptions, e.g., from a QComboBox.
+
+ \sa description()
+*/
+
+/*!
+ \fn inline QString Phonon::ObjectDescription::description() const
+
+ Returns a more extensive description than the name() function.
+
+ For example, in the case of \l{Phonon::}{AudioOutputDevice}s, this
+ text should make clear which sound source is described; this is
+ sometimes hard to describe or understand from just the name.
+
+ The text is appropriate to present to an end user in for example
+ tool tips of items, with the name()'s as text, in a QComboBox.
+
+*/
+
+/*!
+ \fn inline QVariant Phonon::ObjectDescription::property(const char *name) const
+
+ Returns the property named \a name. A property can be used for
+ extended information, such as the manufacturer of a sound card. The
+ information will usually be given as text.
+
+ If the property is not set an invalid QVariant is returned.
+
+ Qt's backends do not use properties at the time of this writing.
+
+ \sa propertyNames()
+*/
+
+/*!
+ \fn inline QList<QByteArray> Phonon::ObjectDescription::propertyNames() const
+
+ Properties can be used for extended information about a
+ ObjectDescription, e.g., a manufacturer of a sound card. The
+ information will usually be given text.
+
+ This function returns all names that return valid data when
+ property() is called.
+
+ Currently, Qt backends do not use properties for their object
+ descriptions.
+
+ \sa property()
+*/
+
+/*!
+ \fn inline bool Phonon::ObjectDescription::isValid() const
+
+ Returns true if the device or effect described exists.
+
+ An ObjectDescription that is invalid, will also have an
+ index() of -1.
+
+ \sa index()
+*/
+
+/*!
+ \fn inline int Phonon::ObjectDescription::index() const
+
+ Returns a unique identifier for this ObjectDescription. Used
+ internally to distinguish between the descriptions.
+
+ Notice that the identifiers are only unique to the type of
+ description, e.g., \l{Phonon::}{AudioOutputDevice} or
+ \l{Phonon::}{EffectDescription}.
+*/
+
+/*!
+ \class Phonon::ObjectDescriptionPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+
+*/
+
+/*!
+ \class Phonon::StreamInterface
+ \inmodule Phonon
+ \since 4.4
+ \brief Backend interface to handle media streams (AbstractMediaStream).
+ \internal
+*/
+
+/*!
+ \fn virtual Phonon::StreamInterface::~StreamInterface()
+*/
+
+/*!
+ \fn virtual void Phonon::StreamInterface::writeData(const QByteArray &data) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::StreamInterface::endOfData() = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::StreamInterface::setStreamSize(qint64 newSize) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::StreamInterface::setStreamSeekable(bool s) = 0
+ \internal
+*/
+
+/*!
+ \fn void Phonon::StreamInterface::connectToSource(const MediaSource &mediaSource)
+ \internal
+*/
+
+/*!
+ \fn void Phonon::StreamInterface::needData()
+ \internal
+*/
+
+/*!
+ \fn void Phonon::StreamInterface::enoughData()
+ \internal
+*/
+
+/*!
+ \fn void Phonon::StreamInterface::seekStream(qint64)
+ \internal
+*/
+
+/*!
+ \fn void Phonon::StreamInterface::reset()
+ \internal
+*/
+
+/*!
+ \fn Phonon::StreamInterface::StreamInterface()
+ \internal
+ \omit
+ For subclasses.
+ \endomit
+*/
+
+/*!
+ \class StreamInterfacePrivate
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \class Phonon::AbstractVideoOutput
+ \inmodule Phonon
+ \internal
+ \since 4.4
+ \brief The AbstractVideoOutput class is the common base class for all video output classes.
+
+ \sa VideoWidget
+*/
+
+/*!
+ \namespace Phonon::Experimental
+ \internal
+*/
+
+/*!
+ \fn Phonon::AbstractVideoOutput::AbstractVideoOutput(AbstractVideoOutputPrivate &d)
+ \internal
+
+ Constructor that is called from derived classes.
+
+ \param parent Standard QObject parent.
+*/
+
+/*!
+ \class Phonon::AbstractVideoOutputPrivate
+ \inmodule Phonon
+ \internal
+ \since 4.4
+*/
+
+/*!
+ \class Phonon::VolumeFaderEffect
+ \inmodule Phonon
+ \internal
+ \since 4.4
+
+ This effect differs from gradually changing the output volume in that
+ a dedicated effect can change the volume in the smallest possible
+ steps while every other volume control will make more or less
+ noticeable steps.
+
+ \sa AudioOutput::volume()
+*/
+
+/*!
+ \property Phonon::VolumeFaderEffect::volume
+
+ This is the current volume of the output as voltage factor.
+ Setting this property changes the volume immediately.
+
+ 1.0 means 100%, 0.5 means 50% voltage/25% power, 0.0 means 0%
+
+ \sa volumeDecibel
+*/
+
+/*!
+ \property Phonon::VolumeFaderEffect::volumeDecibel
+
+ This is the current volume of the output in decibel.
+ Setting this property changes the volume immediately.
+
+ 0 dB means no change in volume, -6dB means an attenuation of the
+ voltage to 50% and an attenuation of the power to 25%, -inf dB means
+ silence.
+
+ \sa volume
+*/
+
+/*!
+ \property Phonon::VolumeFaderEffect::fadeCurve
+
+ This property holds the fade curve to be used for the fadeIn(), fadeOut()
+ and fadeTo() slots.
+
+ Defaults to Fade3Decibel.
+
+ \sa FadeCurve
+*/
+
+/*!
+ \enum Phonon::VolumeFaderEffect::FadeCurve
+ Determines the curve of the volume change.
+
+ \value Fade3Decibel Crossfade curve/fast fade out.
+ This is the default fade curve.
+ \value Fade6Decibel Linear fade out.
+ \value Fade9Decibel Slow fade out.
+ \value Fade12Decibel A more extreme version of the -9dB fade.
+
+ \bold{Notes:}
+
+ \c Fade3Decibel is often the best fade for a crossfade, as after half
+ of the time the volume reached -3dB. This means that half the
+ possible power (which is proportional to the square of the
+ voltage) is reached. Summed, the maximum power of two audio
+ signals fading with a -3dB curve will always be equal.
+
+ For fading in or out the -3dB curve is too abrupt in the end.
+
+ With a -6dB fade curve, a volume of -6dB is reached after half of
+ the fading time. -6dB is equal to half of the voltage meaning
+ that the voltage multiplier changes linearly from the start
+ of the fade to the end.
+
+ With the \c Fade9Decibel fade, a volume of -9dB is reached after
+ half of the fade time, so the fade is fast in the beginning and
+ slow at the end. This is a good fade for ending music.
+*/
+
+/*!
+ \fn void Phonon::VolumeFaderEffect::fadeIn(int fadeTime)
+
+ Tells the Fader to change the volume from the current volume to 100%
+ in \a fadeTime milliseconds.
+
+ Short for \c fadeTo(1.0, fadeTime).
+
+ \param fadeTime the fade duration in milliseconds
+
+ \sa fadeTo(), volume
+*/
+
+/*!
+ \fn void Phonon::VolumeFaderEffect::fadeOut(int fadeTime)
+
+ Tells the Fader to change the volume from the current volume to 0%
+ in \a fadeTime milliseconds.
+ Short for \c fadeTo(0.0, fadeTime).
+
+ \param fadeTime the fade duration in milliseconds
+
+ \sa fadeTo
+*/
+
+/*!
+ \fn void Phonon::VolumeFaderEffect::fadeTo(float volume, int fadeTime)
+
+ Tells the Fader to change the volume from the current value to
+ \a volume in \a fadeTime milliseconds.
+
+ \sa fadeIn(), fadeOut()
+*/
+
+/*!
+ \class Phonon::VolumeFaderEffectPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::VolumeFaderInterface
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \fn virtual Phonon::VolumeFaderInterface::~VolumeFaderInterface()
+ \internal
+*/
+
+/*!
+ \fn virtual float Phonon::VolumeFaderInterface::volume() const
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VolumeFaderInterface::setVolume(float)
+ \internal
+*/
+
+/*!
+ \fn virtual Phonon::VolumeFaderEffect::FadeCurve Phonon::VolumeFaderInterface::fadeCurve() const
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VolumeFaderInterface::setFadeCurve(Phonon::VolumeFaderEffect::FadeCurve)
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VolumeFaderInterface::fadeTo(float, int)
+ \internal
+*/
+
+/*!
+ \class Phonon::AbstractMediaStream
+ \inmodule Phonon
+ \internal
+ \since 4.4
+ \brief The AbstractMediaStream class is the base class for custom media data streams.
+ \inheaderfile Phonon/AbstractMediaStream
+
+ This class is subclassed to provide custom data streams for
+ \l{Phonon::}{MediaSource}s.
+
+ The \l{Phonon::}{MediaSource} knows how to handle the most common
+ media sources, such as files and CD. If you need to fetch
+ multimedia from other sources, you can reimplement this class,
+ which can be used by a \l{Phonon::}{MediaSource}.
+
+ When a backend needs more data from the stream, needData() will be
+ called. You must then use writeData() to write the data to the
+ backend. You can either write one time and wait for a new
+ needData() call, or continue to write data until you receive an
+ enoughData() call. When the stream is at its end, call endOfData()
+ instead of writeData().
+
+ Before the custom stream is passed to a \l{Phonon::}{MediaSource},
+ setStreamSize() needs to be called, and also setStreamSeekable()
+ (if the stream is seekable). A good place to do this work is in
+ the constructor. A seekable stream must also reimplement
+ seekStream().
+
+ We show two examples. The first writes data repeatedly until it
+ receives the enoughData() call, while the second only writes once
+ and waits for a new needData() call.
+
+ Example where data is written repeatedly.
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 0
+
+ Example where data is written once:
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 1
+
+ \sa Phonon::MediaSource, Phonon::MediaObject
+
+*/
+
+/*!
+ \fn Phonon::AbstractMediaStream::AbstractMediaStream(QObject *parent = 0)
+ \internal
+
+ Constructs an AbstractMediaStream object with the given \a parent.
+
+*/
+
+/*!
+ \fn qint64 Phonon::AbstractMediaStream::streamSize() const
+
+ Returns the stream size that was set with setStreamSize().
+
+ A negative value means that the length of the stream cannot be known.
+
+ Defaults to 0.
+
+ \sa setStreamSize()
+*/
+
+/*!
+ \fn void Phonon::AbstractMediaStream::setStreamSize(qint64 size)
+
+ Sets the \a size of the stream in number of bytes.
+
+ A negative value means that the length of the stream cannot be known.
+
+ Defaults to 0.
+
+ This function has to be called. A backend will not call needData()
+ until the stream size is set.
+
+ \sa streamSize()
+
+*/
+
+/*!
+ \fn bool Phonon::AbstractMediaStream::streamSeekable() const
+
+ Returns whether your data stream is set as seekable.
+
+ Defaults to \c false.
+
+ \sa setStreamSeekable()
+
+*/
+
+/*!
+ \fn void Phonon::AbstractMediaStream::setStreamSeekable(bool s)
+
+ Sets whether your data stream is seekable. \a s should be true if
+ the stream is seekable; otherwise false.
+
+ Defaults to \c false.
+
+ If you set this to \c true you have to implement the seekStream()
+ function.
+
+ \sa streamSeekable()
+*/
+
+/*!
+ \fn void Phonon::AbstractMediaStream::writeData(const QByteArray &data)
+
+ Sends the media \a data to the backend for decoding.
+
+ Use this function to send data to the backend after needData() has
+ been called.
+
+ If your stream is a push stream, data should be written until the
+ enoughData() function is called. For a pull stream, write data
+ once before the call to needData() function returns.
+
+ If the data is depleted, call endOfData() instead of writeData().
+
+ \warning Don't call this function before the first needData() is emitted.
+
+ \sa needData(), endOfData()
+
+*/
+
+/*!
+ \fn void Phonon::AbstractMediaStream::endOfData()
+
+ Tells the backend that the media data stream is at its end.
+
+ \warning Don't call this function before the first needData() is emitted.
+
+ \sa writeData(), needData()
+*/
+
+/*!
+ \fn void Phonon::AbstractMediaStream::error(Phonon::ErrorType errorType, const QString &errorString)
+
+ If an I/O error occurs you should call this function to make
+ MediaObject go into ErrorState. \c errorType classifies the error,
+ while \a errorString is a textual description of the error suitable
+ for users of Phonon applications.
+
+ \sa MediaObject::errorType(), MediaObject::errorString()
+*/
+
+/*!
+ \fn virtual void Phonon::AbstractMediaStream::reset() = 0
+
+ Reimplement this function to reset the stream. Subsequent calls to writeData should start
+ from the first position of the data unless a seek is requested.
+
+ The function is necessary for the case where a non-seekable MediaStream is
+ played more than once. For a seekable stream the implementation can simply call
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 2
+
+ \sa writeData(), needData()
+*/
+
+/*!
+ \fn virtual void Phonon::AbstractMediaStream::needData() = 0
+
+ Reimplement this function to be notified when the backend needs data.
+
+ When this function is called you should write data to the backend
+ (See writeData()).
+
+ \sa writeData(), endOfData(), enoughData()
+*/
+
+/*!
+ \fn virtual void Phonon::AbstractMediaStream::enoughData()
+
+ If your stream is a push stream, reimplement this function to be
+ notified when the backend has enough data and your stream object
+ may take a break.
+
+ This method is important for pushing data to the backend in order
+ to not fill the backend buffer unnecessarily.
+
+ \sa needData()
+*/
+
+/*!
+ \fn virtual void Phonon::AbstractMediaStream::seekStream(qint64 offset)
+
+ Reimplement this function if your stream is seekable.
+
+ When this function is called the next call to writeData has to be at the
+ requested \a offset.
+
+ \warning Do not call the parent implementation.
+
+ \sa setStreamSeekable(), streamSeekable(), needData()
+*/
+
+/*!
+ \class Phonon::BackendInterface
+ \inmodule Phonon
+ \since 4.4
+ \brief Main Backend class interface
+ \internal
+
+ This interface defines the main factory of the backend. The createObject() function creates all the
+ objects needed by the frontend.
+
+ The objectDescriptionIndexes and objectDescriptionProperties functions return information about
+ available devices, effects and codecs.
+
+ An implementation could look like this:
+ \snippet snippets/phonon/samplebackend/main.cpp snippet
+
+*/
+
+/*!
+ \fn virtual Phonon::BackendInterface::~BackendInterface()
+ \internal
+
+ Silence gcc's warning.
+*/
+
+/*!
+ \enum Phonon::BackendInterface::Class
+ \internal
+
+ Classes that the createObject() function has to handle.
+
+ \value MediaObjectClass Request to return a \c MediaObject object.
+ \value VolumeFaderEffectClass Request to return a \c VolumeFaderEffect
+ object.
+ \value AudioOutputClass Request to return an \c AudioOutput object.
+ \value AudioDataOutputClass Request to return an \c AudioDataOutput object.
+ \value VisualizationClass Request to return a \c Visualization object.
+ \value VideoDataOutputClass Request to return a \c VideoDataOutput object.
+ \value EffectClass Request to return a \c Effect object.
+ Takes an additional int that specifies the effect ID.
+ \value VideoWidgetClass Request to return a \c VideoWidget object.
+*/
+
+/*!
+ \fn virtual QObject *Phonon::BackendInterface::createObject(Class c, QObject *parent, const QList<QVariant> &args = QList<QVariant>()) = 0
+ \internal
+
+ Returns a new instance of the requested class.
+
+ \param c The requested class.
+ \param parent The parent object.
+ \param args Additional arguments (documented in Class).
+*/
+
+
+/*!
+ \fn virtual QList<int> Phonon::BackendInterface::objectDescriptionIndexes(ObjectDescriptionType type) const = 0
+ \internal
+
+ Returns the unique identifiers for the devices/effects/codecs of the given \a type.
+
+ \param type see ObjectDescriptionType
+*/
+
+/*!
+ \fn virtual QHash<QByteArray, QVariant> Phonon::BackendInterface::objectDescriptionProperties(ObjectDescriptionType type, int index) const = 0
+ \internal
+
+ Given a unique identifier that was returned from objectDescriptionIndexes this function
+ returns a hash mapping property names to values.
+
+ The property "name" must always be present. All other properties are optional.
+
+ \table
+ \header \o Property \o Description
+ \row \o name \o The name of the device/effect/codec/...
+ \row \o description \o A text explaining what this device/effect/codec/... is/can do
+ \row \o icon \o An icon name (using the freedesktop naming scheme) or a QIcon for this
+ device/effect/codec/...
+ \row \o available \o A bool telling whether the device is present or unplugged.
+ \endtable
+
+ \param type see ObjectDescriptionType
+ \param index The unique identifier that is returned from objectDescriptionIndexes
+*/
+
+/*!
+ \fn virtual bool Phonon::BackendInterface::startConnectionChange(QSet<QObject *>) = 0;
+ \internal
+
+ When this function is called the nodes given in the parameter list should
+ not lose any signal data when connections are changed.
+*/
+
+/*!
+ \fn virtual bool Phonon::BackendInterface::connectNodes(QObject *, QObject *) = 0
+ \internal
+
+ Defines a signal connection between the two given nodes.
+*/
+
+/*!
+ \fn virtual bool Phonon::BackendInterface::disconnectNodes(QObject *, QObject *) = 0
+ \internal
+
+ Cuts a signal connection between the two given nodes.
+*/
+
+/*!
+ \fn virtual bool Phonon::BackendInterface::endConnectionChange(QSet<QObject *>) = 0
+ \internal
+
+ When this function is called the nodes given in the parameter list may lose
+ signal data when a port is not connected.
+*/
+
+/*!
+ \fn virtual QStringList Phonon::BackendInterface::availableMimeTypes() const = 0
+ \internal
+
+ Returns all available MIME types.
+*/
+
+/*!
+ \class Phonon::MediaSource
+ \inmodule Phonon
+ \inheaderfile Phonon/MediaSource
+ \since 4.4
+ \brief The MediaSource class provides multimedia data for media objects.
+
+ The MediaSource class manages a source of multimedia content, such
+ as a music or video file, of which data is given to a
+ \l{Phonon::}{MediaObject}.
+
+ The media source knows how fetch its data from several sources,
+ e.g., from files, a QIODevice, or a CD. The possible source types
+ are described by the \l{MediaSource::}{Type} enum. The type of the
+ source is set by the media source itself, and is dependent on the
+ constructor used to create it. Note that it is possible to provide
+ data from any source by implementing a QIODevice.
+
+ The class has several functions to acquire information about the
+ source it manages, e.g., fileName() and url(). The return from
+ these functions are dependent on the type() of the media source.
+
+ Normally, a programmer does not need to be concerned with media
+ sources. It's constructors are implicit, so one can, for instance,
+ send an URL or filename directly to the constructors of the
+ \l{Phonon::}{MediaObject}.
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 3
+
+ A MediaSource object cannot be reused for another multimedia
+ source. It is possible to play the same source again, and also
+ stop and start a non-seekable media source, such as a radio
+ stream, with the same MediaSource object.
+
+ \section1 Qt Backends
+
+ Currently, Qt's backends support files in local and remote
+ locations. Support for other sources, such as CD/DVD, are planned
+ for the future.
+
+ \sa MediaObject, {Phonon Module}
+*/
+
+/*!
+ \enum Phonon::MediaSource::Type
+
+ Identifies the type of media described by the MediaSource object.
+
+ \value Invalid The MediaSource object does not describe any valid source.
+ \value LocalFile The MediaSource object describes a local file.
+ \value Url The MediaSource object describes an URL, which can be either a
+ local file or a file on the network.
+ \value Disc The MediaSource object describes a disc, e.g., a CD.
+ \value Stream The MediaSource object describes a data stream.
+ This is the type used for \l{QIODevice}s. Note
+ that a stream opened with a QUrl, will still be of the Url type.
+ \value Empty The media source doesn't have a source.
+
+ \sa MediaSource::type()
+*/
+
+/*!
+ \fn Phonon::MediaSource::MediaSource()
+ \internal
+
+ Creates an invalid MediaSource object.
+
+ \sa Invalid
+*/
+
+/*!
+ \fn Phonon::MediaSource::MediaSource(const QString &fileName)
+
+ Creates a MediaSource object for the file specified by \a
+ fileName. You can also use this constructor with \l{The Qt
+ Resource System}{Qt resources}
+
+ \omit
+ \param fileName file name of a local media file or a Qt resource that was compiled in.
+ \endomit
+*/
+
+/*!
+ \fn Phonon::MediaSource::MediaSource(const QUrl &url)
+
+ Creates a MediaSource object for a the URL specified by \a url.
+
+ If the multimedia content you would like to play back is on a
+ remote network location, you should use this constructor; though,
+ it also possible to specify an URL to a local file.
+
+ \sa QUrl
+*/
+
+
+/*!
+ \fn Phonon::MediaSource::MediaSource(Phonon::DiscType discType, const QString &deviceName = QString())
+
+ Creates a MediaSource object for the type of disc specified by \a discType in the named
+ device referred to by \a deviceName.
+
+ \note \a deviceName is a platform dependent device name. It can be useful to specify this
+ if the computer has more than one CD drive. On KDE, it is recommended to use the Solid
+ hardware discovery framework to retrieve the device name in a portable way.
+*/
+
+/*!
+ \fn Phonon::MediaSource::MediaSource(AbstractMediaStream *stream)
+ \internal
+ Creates a MediaSource object for a data stream.
+
+ Your application can provide the media data by subclassing AbstractMediaStream and
+ passing a pointer to that object. Phonon will never delete the \a stream.
+
+ \param stream The AbstractMediaStream subclass to provide the media data.
+
+ \sa setAutoDelete
+*/
+
+/*!
+ \fn Phonon::MediaSource::MediaSource(QIODevice *ioDevice)
+
+ Creates a MediaSource object for the QIODevice specified by \a ioDevice.
+
+ This constructor can be very handy in the combination of
+ QByteArray and QBuffer.
+
+ If you need to fetch multimedia data from a source that is not
+ supported by MediaSource, you should subclass QIODevice and use
+ this MediaSource constructor. It is important that you reimplement
+ QIODevice::isSequential(), as it is used by MediaSource to
+ determine if the media source is seekable.
+
+ \a ioDevice is an arbitrary readable QIODevice subclass. If the device is not opened
+ MediaSource will open it as QIODevice::ReadOnly.
+
+ \note Sequential devices can also be used, but MediaObject::isSeekable() will
+ return false as a result.
+
+ \warning On Windows, we only support \l{QIODevice}s containing the
+ \c avi, \c mp3, or \c mpg formats. Use the constructor that takes
+ a file name to open files (the Qt backend does not use a QFile
+ internally).
+
+ \sa setAutoDelete()
+*/
+
+/*!
+ \fn Phonon::MediaSource::MediaSource(MediaSourcePrivate &)
+ \internal
+*/
+
+/*!
+ \fn Phonon::MediaSource::~MediaSource()
+
+ Destroys the MediaSource object. You should never delete a
+ MediaSource yourself, the MediaObject will handle this.
+
+*/
+
+/*!
+ \fn Phonon::MediaSource::MediaSource(const MediaSource &other)
+
+ Constructs a copy of the \a other media source.
+
+ This constructor is fast thanks to explicit sharing.
+*/
+
+/*!
+ \fn MediaSource &Phonon::MediaSource::operator=(const MediaSource &other)
+
+ Assigns the \a other media source to this media source and returns a
+ reference to it.
+
+ This operation is fast thanks to explicit sharing.
+*/
+
+/*!
+ \fn bool Phonon::MediaSource::operator==(const MediaSource &other) const
+
+ Returns true if this media source is equal to the \a other media source;
+ otherwise returns false.
+*/
+
+/*!
+ \fn void Phonon::MediaSource::setAutoDelete(bool enable)
+
+ If \a enable is true, the media source will take ownership of the
+ object passed in the \l{Phonon::}{MediaSource}'s constructor
+ object that was passed in the constructor; otherwise, the
+ programmer is responsible for deletion of this object.
+
+ This setting is false by default. If you enable it, you should
+ only access the stream or device as long as you keep the media
+ source object around. As long as you keep the media source
+ wrapping the stream or device, the object will not get deleted.
+
+ \sa autoDelete()
+*/
+
+/*!
+ \fn bool Phonon::MediaSource::autoDelete() const
+
+ Returns the setting of the auto-delete option. The default is
+ false.
+
+ \sa setAutoDelete()
+*/
+
+/*!
+ \fn Type Phonon::MediaSource::type() const
+
+ Returns the type of the MediaSource (depends on the constructor
+ that was used).
+
+ \sa Type
+*/
+
+/*!
+ \fn QString Phonon::MediaSource::fileName() const
+
+ Returns the file name of the MediaSource if type() ==
+ LocalFile; otherwise, returns QString().
+
+ \sa type()
+*/
+
+/*!
+ \fn QUrl Phonon::MediaSource::url() const
+ Returns the URL of the MediaSource if type() == URL or type() == LocalFile;
+ otherwise returns QUrl().
+
+ \sa type()
+*/
+
+/*!
+ \fn Phonon::DiscType Phonon::MediaSource::discType() const
+ Returns the disc type of the MediaSource if type() == Disc; otherwise
+ returns NoDisc.
+
+ \sa type()
+*/
+
+/*!
+ \fn QString Phonon::MediaSource::deviceName() const
+
+ Returns the device name of the MediaSource if type() == Disc; otherwise
+ returns QString().
+
+ \sa type()
+*/
+
+/*!
+ \fn AbstractMediaStream *Phonon::MediaSource::stream() const
+ \internal
+ Returns the media stream of the MediaSource if type() == Stream; otherwise
+ returns 0.
+ QIODevices are handled as streams, too.
+*/
+
+/*!
+ \class Phonon::MediaSourcePrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::SeekSlider
+ \inmodule Phonon
+ \inheaderfile Phonon/SeekSlider
+ \since 4.4
+ \brief The SeekSlider class provides a slider for seeking to positions in media streams.
+
+ The SeekSlider connects to a \l{Phonon::}{MediaObject}, and
+ controls the seek position in the object's media stream.
+
+ The slider will connect to the necessary signals to keep track of
+ the sliders maximum, minimum, and current values. It will also
+ disable itself for non-seekable streams, and update the media
+ object when the current value of the slider changes.
+
+ Here follows a typical example of SeekSlider usage:
+
+ \snippet doc/src/snippets/seekslider.cpp 0
+
+ \sa Phonon::VolumeSlider, Phonon::VideoWidget, {Music Player Example}, {Phonon Module}
+
+*/
+
+/*!
+ \property Phonon::SeekSlider::iconVisible
+ \brief whether the icon next to the slider is visible
+
+ By default the icon is visible if the platform provides an icon; else
+ it's hidden.
+
+*/
+
+/*!
+ \property Phonon::SeekSlider::tracking
+ \brief whether slider tracking is enabled
+
+ If tracking is enabled (the default), the media seeks
+ while the slider is being dragged. If tracking is
+ disabled, the media seeks only when the user
+ releases the slider.
+*/
+
+/*!
+ \property Phonon::SeekSlider::pageStep
+ \brief the page step interval
+
+ The larger of two natural steps that a slider provides and
+ typically corresponds to the user pressing PageUp or PageDown.
+
+ Defaults to 5 seconds.
+*/
+
+/*!
+ \property Phonon::SeekSlider::singleStep
+ \brief the single step interval
+
+ The smaller of two natural steps that a slider provides and
+ typically corresponds to the user pressing an arrow key.
+
+ Defaults to 0.5 seconds.
+*/
+
+/*!
+ \property Phonon::SeekSlider::orientation
+ \brief the orientation of the slider
+
+ The orientation must be Qt::Vertical or Qt::Horizontal (the default).
+*/
+
+/*!
+ \property Phonon::SeekSlider::iconSize
+ \brief the icon size used for the mute button/icon.
+
+ The default size is defined by the GUI style.
+*/
+
+/*!
+ \fn explicit Phonon::SeekSlider::SeekSlider(QWidget *parent = 0)
+
+ Constructs a seek slider widget with the given \a parent.
+*/
+
+/*!
+ \fn explicit Phonon::SeekSlider::SeekSlider(MediaObject *media, QWidget *parent = 0)
+
+ Constructs a seek slider widget for the specified \a media with the
+ given \a parent.
+*/
+
+/*!
+ \fn Phonon::SeekSlider::~SeekSlider()
+ Destroys the seek slider.
+*/
+
+/*!
+ \fn Phonon::MediaObject *Phonon::SeekSlider::mediaObject() const
+
+ Return the media object this SeekSlider controls.
+*/
+
+/*!
+ \class Phonon::SeekSliderPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \fn void Phonon::SeekSlider::setMediaObject(MediaObject *media)
+
+ Sets the media object to be controlled by this slider to the \a media specified.
+*/
+
+/*!
+ \class Phonon::VideoPlayer
+ \inmodule Phonon
+ \inheaderfile Phonon/VideoPlayer
+ \since 4.4
+ \brief The VideoPlayer widget is used to perform playback of video.
+
+ With VideoPlayer you can get results quickly and easily. You can
+ do the standard playback tasks like play(), pause(), and stop(),
+ but also set a playback volume and seek - if the media and backend
+ supports seeking.
+
+ VideoPlayer is provided for convenience and removes the need to
+ create a media graph with a \l{Phonon::}{MediaObject},
+ \l{Phonon::}{AudioOutput}, and \l{Phonon::}{VideoWidget}. If
+ you need functionality not supported by the player, you can build
+ this \l{Building Graphs}{graph} yourself.
+
+ Keep in mind that when the VideoPlayer instance is deleted the
+ playback will stop.
+
+ Note also that most of the functions in this class are
+ asynchronous. For instance, a media source may not play
+ immediately after you call the play() function.
+
+ A play and forget code example:
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 4
+
+ \sa {Phonon Module}, MediaObject
+*/
+
+/*!
+ \fn Phonon::VideoPlayer::VideoPlayer(QWidget *parent = 0)
+
+ Constructs a new video widget with a \a parent using
+ Phonon::VideoCategory as its category.
+
+ \param parent The QObject parent.
+*/
+
+/*!
+ \fn Phonon::VideoPlayer::VideoPlayer(Phonon::Category category, QWidget *parent = 0)
+
+ Constructs a new VideoPlayer instance with the specified \a
+ parent.
+
+ \a category is the category used for the audio output device.
+*/
+
+/*!
+ \fn Phonon::VideoPlayer::~VideoPlayer()
+
+ On destruction the playback is stopped, also the audio output is
+ removed so that the desktop mixer will not show the application
+ anymore. If you need a persistent audio output don't use
+ VideoPlayer but MediaObject, VideoPath and VideoOutput.
+*/
+
+/*!
+ \fn qint64 Phonon::VideoPlayer::totalTime() const
+
+ Get the total time (in milliseconds) of the file currently being played.
+*/
+
+/*!
+ \fn qint64 Phonon::VideoPlayer::currentTime() const
+
+ Get the current time (in milliseconds) of the file currently being played.
+*/
+
+/*!
+ \fn float Phonon::VideoPlayer::volume() const
+
+ This is the current volume of the output as voltage factor.
+
+ 1.0 means 100%, 0.5 means 50% voltage/25% power, 0.0 means 0%
+*/
+
+/*!
+ \fn bool Phonon::VideoPlayer::isPlaying() const
+
+ Returns true if it is currently playing; otherwise returns false if it
+ is currently stopped or paused
+*/
+
+/*!
+ \fn bool Phonon::VideoPlayer::isPaused() const
+
+ Returns true if it is currently paused; otherwise returns false if it
+ is currently playing or stopped.
+*/
+
+/*!
+ \fn void Phonon::VideoPlayer::load(const Phonon::MediaSource &source)
+
+ Starts pre-loading the media data from the specified \a source and
+ filling audio buffers in the backend.
+
+ When there's already a media playing (or paused) it will be stopped
+ (the finished signal will not be emitted).
+
+ \sa MediaObject::setCurrentSource()
+*/
+
+/*!
+ \fn void Phonon::VideoPlayer::play(const Phonon::MediaSource &source)
+
+ Plays the media from the given \a source. Starts playback as fast as
+ possible.
+ This can take a considerable time depending on the URL and the
+ backend.
+
+ If you need low latency between calling play() and the sound actually
+ starting to play on your output device you need to use MediaObject
+ and be able to set the URL before calling play(). Note that
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 5
+ doesn't make a difference: the application should be idle between the
+ load and play calls so that the backend can start preloading the
+ media and fill audio buffers.
+*/
+
+/*!
+ \fn void Phonon::VideoPlayer::play()
+
+ Continues playback of paused media. Restarts playback of a stopped
+ (or newly loaded) media.
+
+ \sa MediaObject::play(), play()
+*/
+
+/*!
+ \fn void Phonon::VideoPlayer::pause()
+
+ Pauses the playback.
+
+ \sa MediaObject::pause()
+*/
+
+/*!
+ \fn void Phonon::VideoPlayer::stop()
+
+ Stops the playback.
+
+ \sa MediaObject::stop()
+*/
+
+/*!
+ \fn void Phonon::VideoPlayer::seek(qint64 ms)
+
+ Seeks to the requested time. Note that the backend is free to
+ ignore the seek request if the media source isn't seekable; you
+ can check this by asking the media object of the VideoPlayer.
+
+ \snippet doc/src/snippets/videomedia.cpp 0
+
+ The \a ms parameter is the time in milliseconds from the start of
+ the media.
+
+ The call is asynchronous, so currentTime() can still be the old
+ value right after this method was called. If all you need is a
+ slider that shows the current position and allows the user to
+ seek, use the class SeekSlider.
+
+ \sa MediaObject::seek(), MediaObject::isSeekable(), mediaObject()
+*/
+
+/*!
+ \fn void Phonon::VideoPlayer::setVolume(float volume)
+
+ Sets the \a volume of the output as voltage factor.
+
+ 1.0 means 100%, 0.5 means 50% voltage/25% power, 0.0 means 0%
+*/
+
+/*!
+ \fn MediaObject *Phonon::VideoPlayer::mediaObject() const
+
+ Returns the media object being used by the player.
+
+ The media object can be accessed directly instead of using the
+ \l{VideoPlayer}s convenience functions, e.g., play() and stop().
+ It is also possible to give the object to other Phonon widgets,
+ e.g., a \l{Phonon::}{SeekSlider} or a \l{Phonon::}{VolumeSlider}.
+
+ \sa Phonon::SeekSlider, Phonon::MediaObject
+*/
+
+/*!
+ \fn AudioOutput *Phonon::VideoPlayer::audioOutput() const
+
+ Returns the audio output object being used by the player.
+
+*/
+
+/*!
+ \fn VideoWidget *Phonon::VideoPlayer::videoWidget() const
+
+ Returns the video widget being used by the player.
+*/
+
+/*!
+ \fn void Phonon::VideoPlayer::finished()
+
+ This signal is emitted when the playback finished.
+
+*/
+
+/*!
+ \class Phonon::VideoWidgetPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::MediaObject
+ \inmodule Phonon
+ \inheaderfile Phonon/MediaObject
+ \since 4.4
+ \brief The MediaObject class provides an interface for media playback.
+
+
+ The media object manages a \l{Phonon::}{MediaSource}, which
+ supplies the media object with multimedia content, e.g., from a
+ file. A playback in Phonon is always started by calling the
+ \l{Phonon::MediaObject::}{play()} function.
+
+ The state of play (play, pause, stop, seek) is controlled by the
+ media object, and you can also query the current
+ \l{Phonon::MediaObject::}{state()}. It keeps track of the playback
+ position in the media stream, and emits the
+ \l{Phonon::MediaObject::}{tick()} signal when the current position
+ in the stream changes.
+
+ Notice that most functions of this class are asynchronous, so you
+ cannot rely on that a state is entered after a function call
+ before you receive the \l{Phonon::MediaObject::}{stateChanged()}
+ signal. The description of the \l{Phonon::}{State} enum gives a
+ description of the different states.
+
+ Before play() is called, the media object should be connected to
+ \l{Sinks}{output nodes}, which outputs the media to the
+ underlying hardware. The output nodes required are dependent on
+ the contents of the multimedia file that is played back. Phonon
+ has currently two output nodes: the \l{Phonon::}{AudioOutput} for
+ audio content and \l{Phonon::}{VideoWidget} for video content. If
+ a \l{Phonon::}{MediaSource} contains both audio and video, both
+ nodes need to be connected to the media object.
+
+ \snippet snippets/phonon.cpp 4
+ \snippet snippets/phonon.cpp 5
+
+ The media object can queue sources for playback. When it has
+ finished to play one source, it will start playing the next in the
+ queue; the new source is then removed from the queue. The
+ queue can be altered at any time.
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 7
+
+ You can also make use of the
+ \l{Phonon::MediaObject::}{aboutToFinish()} signal, which is
+ guaranteed to be emitted in time for altering the queue.
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 8
+
+ When playback is finishing, i.e., when a media source has been
+ played to the end and the queue is empty, several signals are
+ emitted. First, the media object will emit aboutToFinish() -
+ shortly before the playback has finished - and then finished().
+ The stateChanged() signal will also be emitted with
+ \l{Phonon::}{PausedState}, which is the state the media object
+ takes when the playback is finished. If you wish to enter another
+ state, you can connect a slot to finished() and set a new state
+ there.
+
+ The media object resolves the meta information, such as title,
+ artist, and album. The meta data is not resolved immediately after
+ a new source is provided, but will be resolved before the object
+ leaves the \l{Phonon::}{LoadingState}. The data is queried by
+ string keys - which should follow the Ogg Vorbis specification
+ \l http://xiph.org/vorbis/doc/v-comment.html - or by using the
+ \l{Phonon::}{MetaData} enum. The data available will depend on the
+ type and content of the individual media files. metaDataChanged()
+ will be emitted when the media object has resolved new meta data.
+
+ Errors encountered during playback and loading of media sources
+ are reported by emitting a state changed signal with
+ \l{Phonon::}{ErrorState}. The severity of the error can be queried
+ by the \l{Phonon::}{ErrorType}. With a \l{Phonon::}{NormalError},
+ it might be possible to continue the playback, for instance, if
+ only audio playback fails for a media source which also has video.
+ A \l{Phonon::}{FatalError} indicates that Phonon cannot continue
+ playback of the current source, but it is possible to try with a
+ different one. A user readable error message is given by
+ errorString().
+
+ \sa Phonon::MediaSource, Phonon::AudioOutput, VideoWidget,
+ {Music Player Example}, {Phonon Overview}, Phonon::VideoPlayer,
+ Phonon::createPlayer(), {Phonon Module}
+
+*/
+
+/*!
+ \property Phonon::MediaObject::transitionTime
+ \brief Defines the time between playback of two media sources
+ in the media queue.
+
+ A positive transition time defines a gap of silence between queued
+ media sources.
+
+ A transition time of 0 ms requests gapless playback (i.e., the
+ next source in the media queue starts immediately after the
+ playback of the current source finishes).
+
+ A negative transition time defines a crossfade between the queued
+ media sources.
+
+ Defaults to 0 (gapless playback).
+
+ \warning This feature might not work reliably with every
+ backend.
+*/
+
+/*!
+ \property Phonon::MediaObject::prefinishMark
+ \brief the time when the prefinishMarkReached signal is emitted before playback ends.
+
+ This property specifies the time in milliseconds the
+ prefinishMarkReached() signal is emitted before the playback
+ finishes. A value of \c 0 disables the signal. The signal is only
+ emitted for the last source in the \l{queue()}{media queue}.
+
+ Defaults to \c 0 (disabled).
+
+ \warning For some media data the total time cannot be determined
+ accurately, therefore the accuracy of the prefinishMarkReached signal
+ can be bad sometimes. Still, it is better to use this method than to
+ look at totalTime() and currentTime() to emulate the behavior
+ because the backend might have more information available than your
+ application does through totalTime() and currentTime().
+
+ \sa prefinishMarkReached()
+*/
+
+/*!
+ \property Phonon::MediaObject::tickInterval
+ \brief The time interval in milliseconds between two ticks.
+
+ The tick() signal is emitted continuously during playback.
+ The tick interval is the time that elapses between the emission of two tick signals.
+ If you set the interval to \c 0 the tick signal gets disabled.
+
+ The tick() signal can, for instance, be used to update widgets
+ that show the current position in the playback of a media source.
+
+ Defaults to \c 0 (disabled).
+
+ \warning The back-end is free to choose a different tick interval close
+ to what you asked for. This means that the following code \c may fail:
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 9
+ On the other hand the following is guaranteed:
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 10
+
+ \sa tick()
+*/
+
+/*!
+ \fn Phonon::MediaObject::~MediaObject()
+
+ Destroys the MediaObject.
+*/
+
+/*!
+ \fn State Phonon::MediaObject::state() const
+
+ Returns the current Phonon::State of the object.
+
+ \sa Phonon::State, stateChanged()
+*/
+
+/*!
+ \fn bool Phonon::MediaObject::hasVideo() const
+
+ Check whether the current media source includes a video stream.
+
+ \warning This information is not resolved immediately after a
+ media object gets a new source. Listen to the hasVideoChanged()
+ signal instead.
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 11
+
+ Returns \c true if the media contains video data; otherwise,
+ returns \c false.
+
+ \sa hasVideoChanged()
+*/
+
+/*!
+ \fn bool Phonon::MediaObject::isSeekable() const
+
+ Check whether it is possible to seek, i.e., change the
+ playback position in the media stream.
+
+ \warning This information is not solved immediately after the
+ media object gets a new media source. The hasVideoChanged() signal
+ is emitted after this information is available.
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 12
+
+ Returns \c true if the current media may be seeked; otherwise,
+ returns \c false.
+
+ \sa seekableChanged()
+*/
+
+/*!
+ \fn QStringList Phonon::MediaObject::metaData(const QString &key) const
+
+ Returns the strings associated with the given \a key.
+
+ Backends should use the keys specified in the Ogg Vorbis
+ documentation: \l http://xiph.org/vorbis/doc/v-comment.html
+
+ Therefore the following should work with every backend:
+
+ Note that meta data is not resolved before the \c
+ metaDataChanged() signal is emitted.
+
+ A typical usage looks like this:
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 13
+*/
+
+/*!
+ \fn QStringList Phonon::MediaObject::metaData(Phonon::MetaData key) const
+
+ Returns the strings associated with the given \a key.
+
+ Same as above except that the keys are defined in the
+ Phonon::MetaData enum.
+
+ \sa metaDataChanged()
+*/
+
+/*!
+ \fn QMultiMap<QString, QString> Phonon::MediaObject::metaData() const
+
+ Returns all meta data in a multi map.
+
+ \sa metaDataChanged()
+*/
+
+/*!
+ \fn QString Phonon::MediaObject::errorString() const
+
+ Returns a human-readable description of the last error that occurred.
+ The strings given may vary between backends.
+
+ The error description can be used to give a message to the user -
+ and the developer - when the stateChanged() signal is emitted with
+ \l{Phonon::}{ErrorState}.
+
+ \section1 Qt Backends
+
+ On Windows, Qt fetches its error messages from the DirectShow
+ backend. This usually includes an error number, which can be
+ looked up in the DirectShow documentation:
+ \l{http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dx81_c/directx_cpp/htm/errorandsuccesscodes.asp}.
+
+ On Linux and Mac, the error strings are not fetched directly from
+ the backend, but are created in the backend.
+
+ \sa Phonon::ErrorState, stateChanged()
+*/
+
+/*!
+ \fn ErrorType Phonon::MediaObject::errorType() const
+
+ Tells your program what to do about the last error that occurred.
+ Use this function after receiving a stateChanged() signal with
+ \l{Phonon::}{ErrorState}.
+
+ \sa Phonon::ErrorType, Phonon::ErrorState, stateChanged()
+*/
+
+/*!
+ \fn MediaSource Phonon::MediaObject::currentSource() const
+
+ Returns the current media source, i.e., the media source that is
+ being played back. The current source is either set with
+ setCurrentSource() or taken from the media queue() when a media
+ source has finished playing.
+
+ \sa setCurrentSource()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::setCurrentSource(const MediaSource &source)
+
+ Set the media source the MediaObject should use.
+
+ After the media object receives a new source, it will enter the
+ \l{Phonon::}{LoadingState}. When it is ready to play, it
+ enters the \l{Phonon::}{StoppedState} unless another state
+ has been requested, e.g., by calling play().
+
+ \a source is the MediaSource object to the media data. You can
+ just as well use a QUrl or QString (for a local file) here.
+
+ We show an example:
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 14
+
+ \sa currentSource(), MediaSource
+*/
+
+/*!
+ \fn QList<MediaSource> Phonon::MediaObject::queue() const
+
+ Returns the queued media sources.
+
+ This does list does not include the current source,
+ returned by currentSource().
+
+ \sa enqueue()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::setQueue(const QList<MediaSource> &sources)
+
+ Set the \a sources to play when the current source has finished.
+
+ This function will overwrite the current queue.
+
+ \sa clearQueue(), enqueue()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::setQueue(const QList<QUrl> &urls)
+
+ Set the \a urls to play when the current media has finished.
+
+ This function overwrites the current queue.
+
+ \sa clearQueue(), enqueue()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::enqueue(const MediaSource &source)
+
+ Appends \a source to the queue.
+
+ You can use this function to provide the next source after the
+ aboutToFinish() signal has been emitted.
+
+ \sa aboutToFinish(), setQueue(), clearQueue()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::enqueue(const QList<MediaSource> &sources)
+
+ Appends multiple \a sources to the queue.
+
+ \sa setQueue(), clearQueue()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::enqueue(const QList<QUrl> &urls)
+
+ Appends the URLs in \a urls to the media source queue.
+
+ The function will create \l{MediaSource}s from the \l{QUrl}s, and
+ append these to the queue.
+
+ \sa setQueue(), clearQueue()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::clearQueue()
+
+ Clears the queue of media sources.
+
+ \sa queue(), enqueue()
+*/
+
+/*!
+ \fn qint64 Phonon::MediaObject::currentTime() const
+
+ Returns the current time (in milliseconds), i.e., position in the
+ media stream, of the file currently being played.
+
+ \sa tick(), totalTime(), remainingTime()
+*/
+
+/*!
+ \fn qint64 Phonon::MediaObject::totalTime() const
+
+ Get the total time (in milliseconds) of the file currently being played.
+
+ Returns the total time in milliseconds.
+
+ \warning The total time is not defined before the media object
+ enters the \l{Phonon::}{LoadingState}.
+
+ \sa totalTimeChanged()
+*/
+
+/*!
+ \fn qint64 Phonon::MediaObject::remainingTime() const
+
+ Get the remaining time (in milliseconds) of the file currently being played.
+
+ Returns the remaining time in milliseconds.
+
+ \sa totalTime(), currentTime(), totalTimeChanged()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::play()
+
+ Requests playback of the media data to start.
+
+ Playback starts when the stateChanged() signal is emitted with
+ \l{Phonon::}{PlayingState}.
+
+ If the media object is already in a
+ \l{Phonon::}{PlayingState}, nothing happens.
+
+ \sa stop(), pause(), stateChanged()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::pause()
+
+ Requests playback to pause, and the media object to enter the
+ \l{Phonon::}{PausedState}. If it was paused already, nothing
+ changes.
+
+ This function is asynchronous and the media might not be paused
+ immediately.
+
+ \sa play(), stop(), stateChanged()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::stop()
+
+ Requests playback to stop, and the media object to enter the
+ \l{Phonon::}{StoppedState}. If it was stopped before
+ nothing changes.
+
+ This function is asynchronous and the media might not be
+ stopped immediately.
+
+ \sa play(), pause(), stateChanged()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::seek(qint64 time)
+
+ Requests a seek to the \a time indicated, specified in milliseconds.
+
+ You can only seek if state() is PlayingState, BufferingState or PausedState.
+
+ The call is asynchronous, so currentTime can still be the old
+ value right after this method was called. If all you need is a
+ slider that shows the current position and allows the user to
+ seek, use the class SeekSlider.
+
+ If the current source of the media object is not seekable, calls
+ to this functions do nothing.
+
+ \sa SeekSlider, tick()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::clear()
+
+ Stops and removes all playing and enqueued media sources.
+
+ \sa setCurrentSource()
+*/
+
+
+/*!
+ \fn void Phonon::MediaObject::stateChanged(Phonon::State newstate, Phonon::State oldstate)
+
+ This signal is emitted when the state of the MediaObject has changed.
+ The \a oldstate and \a newstate parameters indicate the previous
+ state and current state of the media object.
+
+ If you are only interested in the new state of the media object, you can
+ connect this signal to a slot that accepts only one State argument.
+*/
+
+/*!
+ \fn void Phonon::MediaObject::tick(qint64 time)
+
+ This signal is emitted in intervals defined by the
+ \l{tickInterval} property. The current position of the media
+ object in the stream is given by the \a time parameter. The \a
+ time is specified in milliseconds.
+
+ \sa tickInterval
+*/
+
+/*!
+ \fn void Phonon::MediaObject::metaDataChanged()
+
+ This signal is emitted when the media object has resolved new meta
+ data. This will happen before the media object leaves the
+ \l{Phonon::}{LoadingState} after a new source has been set.
+
+ This signal is not emitted when the media object removes the
+ current data, i.e., when a new source is set or an error has
+ occurred. If you need to know this, you can listen for the
+ \l{Phonon::}{ErrorState}, and connect to the
+ \l{Phonon::MediaObject::}{currentSourceChanged()} signal.
+
+ You can get the new meta data with the metaData methods.
+
+ \sa metaData(), currentSourceChanged(), stateChanged(), Phonon::State
+*/
+
+/*!
+ \fn void Phonon::MediaObject::seekableChanged(bool isSeekable)
+
+ This signal is emitted when the media object's ability to seek in
+ the media stream changes. \a isSeekable is true if it is possible
+ to seek(); otherwise, it is false.
+
+ Change in the ability to seek in the stream usually happens when
+ the current source changes or when an error occurs.
+
+ \omit Emitted whenever the return value of isSeekable()
+ changes. \endomit
+
+ Normally you'll check isSeekable() after setting a new media
+ source, and then let this signal tell you when seeking is
+ possible. That way you don't have to poll isSeekable().
+*/
+
+/*!
+ \fn void Phonon::MediaObject::hasVideoChanged(bool hasVideo)
+
+ Emitted whenever the return value of hasVideo() changes, i.e.,
+ the media source being played back contains video.
+
+ Normally you'll check hasVideo() first and then let this signal
+ tell you whether video is available now or not. That way you
+ don't have to poll hasVideo().
+
+ \a hasVideo is true when the stream contains video and adding a
+ VideoWidget will show a video, and false if there is no video data
+ in the stream and adding a VideoWidget will show an empty (black)
+ VideoWidget.
+*/
+
+/*!
+ \fn void Phonon::MediaObject::bufferStatus(int percentFilled)
+
+ Provides information about the status of the buffer.
+
+ When a MediaObject is in the \l{Phonon::}{BufferingState}, it will
+ send this signal regularly. \a percentFilled is a number between 0
+ and 100 telling you how much the buffer is filled.
+
+ You can use this signal to show a progress bar to the user when
+ in BufferingState:
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 15
+
+ Note that the \l{Phonon::}{BufferingState} is commonly used when
+ waiting for data over a network connection, but this might not be
+ true for all backends.
+*/
+
+/*!
+ \fn void Phonon::MediaObject::finished()
+
+ Emitted when the object has finished playback. It is not emitted
+ if you call stop(), pause() or load(). It is emitted only when the
+ current media source has finished playing and the media queue() is
+ empty, or when a \l{Phonon::FatalError}{fatal error} occurs.
+
+ \warning This signal is not emitted when the current source has
+ finished and there's another source in the queue. It is only
+ emitted when the queue is empty.
+
+ \sa currentSourceChanged(), aboutToFinish(), prefinishMarkReached()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::currentSourceChanged(const Phonon::MediaSource &newSource)
+
+ Emitted when the MediaObject fetches a new MediaSource from the
+ queue() and before it enters the \l{Phonon::}{LoadingState} for
+ the new source. The media object will take a new source from the
+ queue() when it has finished the playback of the
+ \l{currentSource()}{current source}.
+
+ \a newSource is the source that starts to play at the time the
+ signal is emitted.
+*/
+
+/*!
+ \fn void Phonon::MediaObject::aboutToFinish()
+
+ Emitted before the playback of the whole queue ends. When this
+ signal is emitted you still have time to enqueue() a new
+ MediaSource, so that playback continues.
+
+ If you need a signal to be emitted at a specific time before
+ playback is finished, you should use the prefinishMarkReached()
+ signal instead.
+
+ \sa enqueue(), prefinishMark, prefinishMarkReached()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::prefinishMarkReached(qint32 msecToEnd)
+
+ Emitted when there are only \a msecToEnd milliseconds left
+ of playback.
+
+ \warning This signal is not emitted when there is another source
+ in the queue. It is only emitted when the queue is empty.
+
+ \sa setPrefinishMark(), prefinishMark(), aboutToFinish(), finished()
+*/
+
+/*!
+ \fn void Phonon::MediaObject::totalTimeChanged(qint64 newTotalTime)
+
+ This signal is emitted as soon as the total time of the media file is
+ known or has changed. For most non-local media data the total
+ time of the media can only be known after some time. At that time the
+ totalTime function can not return useful information. You have
+ to wait for this signal to know the real total time.
+
+ \a newTotalTime is the length of the media file in milliseconds.
+
+ \sa totalTime()
+*/
+
+/*!
+ \fn MediaObject *Phonon::createPlayer(Phonon::Category category, const MediaSource &source = MediaSource())
+
+ Convenience function to create a MediaObject and AudioOutput
+ connected by a path. The \l{Phonon::}{MediaObject} return will
+ have \a source set as its current source and the specified \a
+ category.
+
+*/
+
+/*!
+ \class Phonon::MediaObjectPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \namespace Phonon::BackendCapabilities
+ \inmodule Phonon
+ \since 4.4
+ \brief The BackendCapabilities namespace contains functions to describe the capabilities of the multimedia backend.
+
+*/
+
+/*!
+ \class Phonon::BackendCapabilitiesPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::BackendCapabilities::Notifier
+ \since 4.4
+ \inmodule Phonon
+ \inheaderfile Phonon/BackendCapabilities
+
+ Notifications about backend capabilities.
+*/
+
+/*!
+ \fn void Phonon::BackendCapabilities::Notifier::capabilitiesChanged()
+
+ This signal is emitted if the capabilities have changed. This can
+ happen if the user has requested a backend change.
+*/
+
+/*!
+ \fn void Phonon::BackendCapabilities::Notifier::availableAudioOutputDevicesChanged()
+
+ This signal is emitted when audio output devices were plugged or
+ unplugged.
+
+ Check BackendCapabilities::availableAudioOutputDevices to get the
+ current list of available devices.
+*/
+
+/*!
+ \fn Notifier *Phonon::BackendCapabilities::notifier()
+
+ Use this function to get a QObject pointer to connect to the capabilitiesChanged signal.
+
+ \return a pointer to a QObject.
+
+ The capabilitiesChanged signal is emitted if the capabilities have changed. This can
+ happen if the user has requested a backend change.
+
+ To connect to this signal do the following:
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 16
+
+ \sa Notifier::capabilitiesChanged()
+*/
+
+/*!
+ \fn QStringList Phonon::BackendCapabilities::availableMimeTypes()
+
+ Returns a list of mime types that the Backend can decode.
+
+ \sa isMimeTypeAvailable()
+*/
+
+/*!
+ \fn bool Phonon::BackendCapabilities::isMimeTypeAvailable(const QString &mimeType)
+
+ Often all you want to know is whether one given MIME type can be
+ decoded by the backend. Use this method in favor of
+ availableMimeTypes() as it can give you a negative answer without
+ having a backend loaded.
+
+ Returns true if the given \a mimeType is supported by the backend;
+ otherwise, returns false.
+
+ \sa availableMimeTypes()
+*/
+
+/*!
+ \fn QList<AudioOutputDevice> Phonon::BackendCapabilities::availableAudioOutputDevices()
+
+ Returns the audio output devices the backend supports.
+
+ \return A list of AudioOutputDevice objects that give a name and
+ description for every supported audio output device.
+*/
+
+/*!
+ \fn QList<EffectDescription> Phonon::BackendCapabilities::availableAudioEffects()
+
+ Returns descriptions for the audio effects the backend supports.
+
+ \return A list of AudioEffectDescription objects that give a name and
+ description for every supported audio effect.
+*/
+
+/*!
+ \internal
+ \class ObjectDescriptionModelData
+ \internal
+ \inmodule Phonon
+ \brief Data class for models for ObjectDescription objects.
+*/
+
+/*!
+ \typedef Phonon::EffectDescription
+ \relates Phonon::ObjectDescription
+
+ EffectDescription gives a description of an \l{Processors}{audio
+ effect}. It is a typedef of the \l{Phonon::}{ObjectDescription}
+ class. Please see its class description for details.
+
+ EffectDescription is used to create audio \l{Phonon::}{Effect}s,
+ which can be inserted into a media graph, altering an audio
+ stream.
+
+ \sa Phonon::ObjectDescription, {Capabilities Example}, {Media
+ Player}
+
+*/
+
+/*!
+ \class Phonon::ObjectDescriptionModel
+ \inmodule Phonon
+ \internal
+ \since 4.4
+ \brief The ObjectDescriptionModel class provides a model from
+ a list of ObjectDescription objects.
+
+ ObjectDescriptionModel is a read only model that supplies a list
+ using ObjectDescription::name() for the text and
+ ObjectDescription::description() for the tooltip. If set the properties
+ "icon" and "available" are used to set the decoration and disable the
+ item (disabled only visually, you can still select and drag it).
+
+ It also provides the methods moveUp() and moveDown() to order the list.
+ Additionally drag and drop is possible so that
+ QAbstractItemView::InternalMove can be used.
+ The resulting order of the ObjectDescription::index() values can then be
+ retrieved using tupleIndexOrder().
+
+ An example use case would be to give the user a QComboBox to select
+ the output device:
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 17
+
+ And to retrieve the selected AudioOutputDevice:
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 18
+
+*/
+
+/*!
+ \fn inline int Phonon::ObjectDescriptionModel::rowCount(const QModelIndex &parent = QModelIndex()) const
+
+ Returns the number of rows in the model. This value corresponds
+ to the size of the list passed through setModelData.
+
+ \param parent The optional \a parent argument is used in most models to specify
+ the parent of the rows to be counted. Because this is a list if a
+ valid parent is specified the result will always be 0.
+
+ Reimplemented from QAbstractItemModel.
+
+ \sa QAbstractItemModel::rowCount()
+*/
+
+/*!
+ \fn inline QVariant Phonon::ObjectDescriptionModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
+
+ Returns data from the item with the given \a index for the specified
+ \a role.
+ If the view requests an invalid index, an invalid variant is
+ returned.
+
+ Reimplemented from QAbstractItemModel.
+
+ \sa QAbstractItemModel::data(), Qt::ItemDataRole
+*/
+
+/*!
+ \fn inline Qt::ItemFlags Phonon::ObjectDescriptionModel::flags(const QModelIndex &index) const
+ \internal
+
+ Reimplemented to show unavailable devices as disabled (but still
+ selectable). The \a index of the model index for which to return
+ flags.
+
+*/
+
+/*!
+ \fn inline QList<int> Phonon::ObjectDescriptionModel::tupleIndexOrder() const
+
+ Returns a list of indexes in the same order as they are in the
+ model. The indexes come from the ObjectDescription::index
+ method.
+
+ This is useful to let the user define a list of preference.
+*/
+
+/*!
+ \fn inline int Phonon::ObjectDescriptionModel::tupleIndexAtPositionIndex(int positionIndex) const
+
+ Returns the ObjectDescription::index for the tuple
+ at the given position \a positionIndex. For example a
+ QComboBox will give you the currentIndex as the
+ position in the list. But to select the according
+ AudioOutputDevice using AudioOutputDevice::fromIndex
+ you can use this method.
+
+ \param positionIndex The position in the list.
+*/
+
+/*!
+ \class Phonon::ObjectDescriptionModelDataPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \fn inline QMimeData *Phonon::ObjectDescriptionModel::mimeData(const QModelIndexList &indexes) const
+ \internal
+
+ Returns the MIME data that dropMimeData() can use to create new
+ items.
+*/
+
+/*!
+ \fn inline void Phonon::ObjectDescriptionModel::moveUp(const QModelIndex &index)
+
+ Moves the item at the given \a index up. In the resulting list
+ the items at index.row() and index.row() - 1 are swapped.
+
+ Connected views are updated automatically.
+*/
+
+/*!
+ \fn inline void Phonon::ObjectDescriptionModel::moveDown(const QModelIndex &index)
+
+ Moves the item at the given \a index down. In the resulting list
+ the items at index.row() and index.row() + 1 are swapped.
+
+ Connected views are updated automatically.
+*/
+
+/*!
+ \fn explicit inline Phonon::ObjectDescriptionModel::ObjectDescriptionModel(QObject *parent = 0)
+
+ Constructs a ObjectDescription model with the
+ given \a parent.
+*/
+
+/*!
+ \fn explicit inline Phonon::ObjectDescriptionModel::ObjectDescriptionModel(const QList<ObjectDescription<type> > &data, QObject *parent = 0)
+
+ Constructs a ObjectDescription model with the
+ given \a parent and the given \a data.
+*/
+
+/*!
+ \fn inline void Phonon::ObjectDescriptionModel::setModelData(const QList<ObjectDescription<type> > &data)
+
+ Sets the model data using the list provided by \a data.
+
+ All previous model data is cleared.
+*/
+
+/*!
+ \fn inline QList<ObjectDescription<type> > Phonon::ObjectDescriptionModel::modelData() const
+
+ Returns the model data.
+
+ As the order of the list might have changed this can be different
+ to what was set using setModelData().
+*/
+
+/*!
+ \fn inline ObjectDescription<type> Phonon::ObjectDescriptionModel::modelData(const QModelIndex &index) const
+
+ Returns one ObjectDescription of the model data for the given \a index.
+*/
+
+/*!
+ \fn inline Qt::DropActions Phonon::ObjectDescriptionModel::supportedDropActions() const
+
+ This model supports drag and drop to copy or move
+ items.
+*/
+
+/*!
+ \fn inline bool Phonon::ObjectDescriptionModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
+
+ Accept drops from other models of the same ObjectDescriptionType.
+
+ The \a data is dropped at the given \a row and \a column; you
+ also receive the \a parent model index.
+
+ If a valid \a parent is given the dropped items will be inserted
+ above that item.
+*/
+
+/*!
+ \fn inline bool Phonon::ObjectDescriptionModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
+
+ Removes count rows starting with the given row.
+
+ If a valid \a parent is given no rows are removed since this is a
+ list model.
+
+ Returns true if the rows were successfully removed; otherwise returns false.
+*/
+
+/*!
+ \fn inline QStringList Phonon::ObjectDescriptionModel::mimeTypes() const
+
+ Returns a list of supported drag and drop MIME types. Currently
+ it only supports one type used internally.
+*/
+
+/*!
+ \class Phonon::EffectInterface
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::Effect
+ \inmodule Phonon
+ \inheaderfile Phonon/Effect
+ \since 4.4
+ \brief The Effect class is used to transform audio streams.
+
+ An effect is a media node which is inserted into a path between a
+ \l{Phonon::}{MediaObject} and an audio output node, for instance,
+ an \l{Phonon::}{AudioOutput}. The Effect transforms the media
+ stream on that path.
+
+ Examples may include simple modifiers, such as fading or pitch
+ shifting, and more complex mathematical transformations. You can
+ query the backend for available effects with
+ BackendCapabilities::availableAudioEffects(). Note that the
+ effects available is dependent on the underlying system
+ (DirectDraw, GStreamer, or QuickTime).
+
+ In order to use an effect, insert it into the path as follows:
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 19
+
+ The effect will immediately begin applying it's transformations on
+ the path. To stop it, remove the Effect from the path.
+
+ To create an effect, you use the \l{Phonon::}{EffectDescription}
+ class, which you get from
+ \l{BackendCapabilities::}{availableAudioEffects()}. We give a code
+ example below.
+
+ \snippet doc/src/snippets/audioeffects.cpp 0
+
+ An effect can have one or more parameters, which let you alter how
+ the effect works, for instance, by specifying the depth of a
+ reverb effect. See the EffectParameter class description for
+ details.
+
+ Phonon also provides EffectWidget, which lets the user modify the
+ parameters of an effect an the fly; e.g., with combo boxes.
+
+ \sa {Phonon Module}, EffectWidget
+*/
+
+/*!
+ \fn explicit Phonon::Effect::Effect(const EffectDescription &description, QObject *parent = 0)
+
+ Constructs a new effect object with the given \a description and \a parent object.
+
+ The EffectDescription object determines the type of the effect.
+
+ \sa {Phonon::BackendCapabilities::availableAudioEffects()}
+*/
+
+/*!
+ \fn Phonon::Effect::Effect(EffectPrivate &dd, QObject *parent)
+ \internal
+*/
+
+/*!
+ \fn Phonon::Effect::~Effect()
+ \internal
+*/
+
+/*!
+ \fn QVariant Phonon::Effect::parameterValue(const EffectParameter &parameter) const
+
+ Returns the value of the given effect \a parameter. You can fetch
+ the available parameters for an effect with parameters().
+
+ \sa setParameterValue(), EffectParameter
+*/
+
+/*!
+ \fn void Phonon::Effect::setParameterValue(const EffectParameter &parameter, const QVariant &value)
+
+ Sets the given effect \a parameter to the specified \a value.
+
+ Parameters for an effect are returned by parameters(). You can
+ check which QVariant::Type an EffectParameter takes with the
+ EffectParameter::type() function.
+
+ \sa parameterValue(), EffectParameter
+*/
+
+/*!
+ \fn EffectDescription Phonon::Effect::description() const;
+
+ Returns the description of this effect. This is the same
+ description that was passed to the constructor.
+*/
+
+/*!
+ \fn QList<EffectParameter> Phonon::Effect::parameters() const;
+
+ Returns a list of parameters that this effect provides to control
+ its behavior.
+
+ \sa EffectParameter, EffectWidget
+*/
+
+/*!
+ \class Phonon::EffectPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::AudioOutput
+ \inmodule Phonon
+ \inheaderfile Phonon/AudioOutput
+ \since 4.4
+ \brief The AudioOutput class is used to send data to audio output devices.
+
+ The AudioOutput class plays sound over a sound device. The audio
+ output needs to be connected to a \l{Phonon::}{MediaObject} using
+ \l{Phonon::}{createPath()}. To start playback, you call
+ \l{Phonon::MediaObject::}{play()} on the media object.
+
+ \snippet snippets/phonon.cpp 2
+
+ The class supports changing the volume(). It is also possible to
+ mute the sound.
+
+ To find out what \l{Phonon::}{AudioOutputDevice}s are available
+ for AudioOutput, you can call
+ BackendCapabilities::availableAudioOutputDevices(). A default device is
+ selected by the backend, but it is possible to set the device to
+ be used with setOutputDevice(). The outputDeviceChanged() signal
+ will be emitted if the device changes.
+
+ If an error occurs with the playback, for instance, if no valid
+ output device is found, the media object will receive a
+ stateChanged() signal with the \l{Phonon::}{ErrorState}.
+
+ Note that the default values of properties are dependent on the
+ backend.
+
+ \sa Phonon::VolumeSlider, {Music Player Example}, BackendCapabilities, {Phonon Module}
+*/
+
+/*!
+ \property Phonon::AudioOutput::name
+
+ This is the name that appears in Mixer applications that control
+ the volume of this output.
+
+*/
+
+/*!
+ \property Phonon::AudioOutput::volume
+
+ This is the current loudness of the output. \omit The volume is a
+ real value between 0.0 (minimum) and 1.0 (maximum). The volume
+ follows the sound device used, with 1.0 being the maximum volume
+ the device can produce. \endomit
+
+ (it is using Stevens' law
+ to calculate the change in voltage internally).
+
+ \sa volumeDecibel
+*/
+
+/*!
+ \property Phonon::AudioOutput::volumeDecibel
+
+ This is the current volume of the output in decibel.
+
+ 0 dB means no change in volume, -6dB means an attenuation of the
+ voltage to 50% and an attenuation of the power to 25%, -inf dB means
+ silence.
+
+ \sa volume
+*/
+
+/*!
+ \property Phonon::AudioOutput::outputDevice
+ This property holds the (hardware) destination for the output.
+
+ The default device is determined by the \l{Phonon::}{Category} and the global
+ configuration for that category. Normally you don't need
+ to override this setting - letting the user change the global
+ configuration is the right choice. You can still override the
+ device though, if you have good reasons to do so.
+
+ \sa outputDeviceChanged()
+*/
+
+/*!
+ \property Phonon::AudioOutput::muted
+ This property tells whether the output is muted.
+
+ Muting the output has the same effect as calling setVolume(0.0).
+*/
+
+/*!
+ \fn explicit Phonon::AudioOutput::AudioOutput(Phonon::Category category, QObject *parent = 0)
+
+ Creates a new AudioOutput with the given \a parent that defines
+ output to a physical device.
+
+ The \a category can be used by mixer applications to group volume
+ controls of applications into categories. That makes it easier for
+ the user to identify the programs.
+ The category is also used for the default output device that is
+ configured centrally. As an example: often users want to have the
+ audio signal of a VoIP application go to their USB headset while
+ all other sounds should go to the internal soundcard.
+
+ \sa Phonon::categoryToString(), outputDevice
+*/
+
+/*!
+ \fn explicit Phonon::AudioOutput::AudioOutput(QObject *parent = 0)
+
+ Creates a new AudioOutput that defines output to the system
+ default device with the \{Phonon::Category::}{NoCategory} category
+
+ \sa Phonon::categoryToString(), outputDevice
+*/
+
+/*!
+ \fn Phonon::Category Phonon::AudioOutput::category() const
+
+ Returns the category of this output.
+
+ \sa Phonon::AudioOutput::AudioOutput()
+*/
+
+/*!
+ \fn void Phonon::AudioOutput::volumeChanged(qreal newVolume)
+
+ This signal is emitted whenever the volume has changed. As the
+ volume can change without a call to setVolume (calls over dbus)
+ this is important to keep a widget showing the current volume up
+ to date.
+
+ \a newVolume is the new volume level.
+
+ \sa setVolume(), volume()
+*/
+
+/*!
+ \fn void Phonon::AudioOutput::mutedChanged(bool muted)
+
+ This signal is emitted when the muted property has changed. The \a muted
+ value passed by the signal indicates the state of the muted property.
+ As this property can change by IPC (DBus) calls a UI element showing
+ the muted property should listen to this signal.
+*/
+
+/*!
+ \fn void Phonon::AudioOutput::outputDeviceChanged(const Phonon::AudioOutputDevice &newAudioOutputDevice)
+
+ This signal is emitted when the (hardware) device for the output
+ has changed. \a newAudioOutputDevice is the new device.
+
+ The change can happen either through setOutputDevice or if the
+ global configuration for the used category has changed.
+
+ \sa outputDevice
+*/
+
+/*!
+ \class Phonon::AudioOutputPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::EffectParameter
+ \inmodule Phonon
+ \inheaderfile Phonon/EffectParameter
+ \since 4.4
+ \brief The EffectParameter class describes one parameter of an effect.
+
+ You fetch the parameters of an \l{Phonon::}{Effect} with
+ \l{Phonon::}{Effect::parameters()}.
+
+ \snippet doc/src/snippets/phononeffectparameter.cpp 0
+
+ To describe itself, an effect parameter gives a name() and
+ possibly description() (depending on the backend used). These are
+ suited to present the effect parameter to the user of a Phonon
+ application.
+
+ Note that effects are created by the backend, and that
+ their name and descriptions may vary.
+
+ The value of an effect parameter is stored in a \l{QVariant},
+ of which type() is usually \c int or \c double.
+
+ The value is retrieved with \l{Phonon::}{Effect::parameterValue()}
+ and set with \l{Phonon::Effect::}{setParameterValue()} - both of
+ which takes the EffectParameter as argument. Note that not all
+ effect parameters support setting of their value.
+
+ You get the values a parameter can take with possibleValues(); an
+ empty list is returned if the values are continuous.
+
+ A parameter may also specify default(), minimum(), and maximum()
+ values. Values are returned as \l{QVariant}s. If the parameter
+ does not have the requested value, an \l{QVariant::Invalid}
+ invalid QVariant is returned from these functions.
+
+ The \l{Phonon::}{EffectWidget} provides a widget with which one
+ can control the parameters of an \l{Phonon::}{Effect}.
+
+ \snippet doc/src/snippets/phononeffectparameter.cpp 1
+
+ \sa Effect, EffectWidget, {Capabilities Example}, {Phonon Module}
+*/
+
+/*!
+ \fn Phonon::EffectParameter::EffectParameter()
+ \internal
+
+ Creates an invalid effect parameter.
+*/
+
+/*!
+ \fn Phonon::EffectParameter::~EffectParameter()
+
+ Destroys the effect parameter.
+*/
+
+/*!
+ \fn Phonon::EffectParameter::EffectParameter(const EffectParameter &other)
+
+ Constructs a copy of the \a other effect parameter.
+*/
+
+/*!
+ \fn const QString &Phonon::EffectParameter::name() const
+
+ The name of the parameter. Can be used as the label.
+
+ \return A label for the parameter.
+*/
+
+/*!
+ \fn const QString &Phonon::EffectParameter::description() const
+
+ The parameter may come with a description (LADSPA doesn't have a
+ field for this, so don't expect many effects to provide a
+ description).
+
+ The description can be used for a tooltip or WhatsThis help.
+
+ \return A text describing the parameter.
+*/
+
+/*!
+ \fn QVariant::Type Phonon::EffectParameter::type() const
+
+ Returns the parameter type.
+
+ Common types are QVariant::Int, QVariant::Double, QVariant::Bool and QVariant::String. When
+ QVariant::String is returned you get the possible values from possibleValues.
+*/
+
+/*!
+ \fn bool Phonon::EffectParameter::isLogarithmicControl() const
+
+ Returns whether the parameter should be
+ displayed using a logarithmic scale. This is particularly useful for
+ frequencies and gains.
+*/
+
+/*!
+ \fn QVariant Phonon::EffectParameter::minimumValue() const
+
+ The minimum value to be used for the control to edit the parameter.
+
+ If the returned QVariant is invalid the value is not bounded from
+ below.
+*/
+
+/*!
+ \fn QVariant Phonon::EffectParameter::maximumValue() const
+
+ The maximum value to be used for the control to edit the parameter.
+
+ If the returned QVariant is invalid the value is not bounded from
+ above.
+*/
+
+/*!
+ \fn QVariant Phonon::EffectParameter::defaultValue() const
+
+ The default value.
+*/
+
+/*!
+ \fn QVariantList Phonon::EffectParameter::possibleValues() const
+
+ The possible values to be used for the control to edit the parameter.
+
+ if the value of this parameter is to be picked from predefined values
+ this returns the list (otherwise it returns an empty QVariantList).
+*/
+
+/*!
+ \fn bool Phonon::EffectParameter::operator<(const EffectParameter &rhs) const
+
+ \internal
+ compares the ids of the parameters
+*/
+
+/*!
+ \fn bool Phonon::EffectParameter::operator>(const EffectParameter &rhs) const
+
+ \internal
+ compares the ids of the parameters
+*/
+
+/*!
+ \fn bool Phonon::EffectParameter::operator==(const EffectParameter &rhs) const
+
+ \internal
+ compares the ids of the parameters
+*/
+
+/*!
+ \fn Phonon::EffectParameter &Phonon::EffectParameter::operator=(const EffectParameter &other)
+
+ Assigns the \a other effect parameter to this parameter and returns
+ a reference to this parameter.
+*/
+
+/*!
+ \enum Phonon::EffectParameter::Hint
+
+ Only for backend developers:
+
+ Flags to set the return values of isToggleControl(),
+ isLogarithmicControl(), isIntegerControl(), isBoundedBelow() and
+ isBoundedAbove(). The values of the flags correspond to the values
+ used for LADSPA effects.
+
+ \value ToggledHint
+ If this hint is set it means that
+ the control has only two states: zero and non-zero
+ (see isToggleControl()).
+
+ \value LogarithmicHint
+ LADSPA's SAMPLE_RATE hint needs to be translated by the backend
+ to normal bounds, as the backend knows the sample rate - and the
+ frontend doesn't (see isLogarithmicControl()).
+
+ \value IntegerHint See isIntegerControl().
+*/
+
+/*!
+ \fn Phonon::EffectParameter::EffectParameter(int parameterId,
+ const QString &name, EffectParameter::Hints hints,
+ const QVariant &defaultValue, const QVariant &min = QVariant(),
+ const QVariant &max = QVariant(), const QVariantList &values = QVariantList(),
+ const QString &description = QString())
+
+ Only to be used by backend implementations:
+
+ Creates a new effect parameter.
+
+ \a parameterId This is a number to uniquely identify the
+ parameter. The id is used for value() and setValue().
+
+ \a name is the name/label for this parameter.
+
+ \a hints sets the hints for the type of parameter.
+
+ \a defaultValue The value that should be used as a default.
+
+ \a min is the minimum value allowed for this parameter. You only
+ need to set this if the BoundedBelowHint is set.
+
+ \a max is the maximum value allowed for this parameter. You only
+ need to set this if the BoundedAboveHint is set.
+
+ The \a values parameter is the values that the effect parameter
+ can take (only applies if non-continuous)
+
+ \a description is a descriptive text for the parameter
+ (explaining what it controls) to be used as a tooltip or
+ WhatsThis help.
+*/
+
+/*!
+ \fn int Phonon::EffectParameter::id() const
+
+ \internal
+
+ Returns the parameter's identifier.
+*/
+
+/*!
+ \typedef Phonon::AudioOutputInterface
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \class Phonon::AudioOutputInterface40
+ \inmodule Phonon
+ \since 4.4
+ \internal
+ \brief Interface for AudioOutput objects
+
+*/
+
+/*!
+ \fn virtual Phonon::AudioOutputInterface40::~AudioOutputInterface40()
+ \internal
+*/
+
+/*!
+ \fn virtual qreal Phonon::AudioOutputInterface40::volume() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::AudioOutputInterface40::setVolume(qreal) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual int Phonon::AudioOutputInterface40::outputDevice() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual bool Phonon::AudioOutputInterface40::setOutputDevice(int) = 0
+ \internal
+*/
+
+/*!
+ \class Phonon::Path
+ \inmodule Phonon
+ \inheaderfile Phonon/Path
+ \since 4.4
+ \brief The Path class describes connections between media nodes.
+
+ In a \l{Building Graphs}{media graph}, \l{Phonon::}{MediaNode}s
+ are connected by Paths. The multimedia travels in streams over
+ these paths.
+
+ You create a path between two media nodes using the static
+ Phonon::createPath() function, which takes two nodes as arguments.
+ The first argument will send the media stream to the second.
+ Please refer to the class description of the individual media
+ nodes and the Phonon \l{Phonon Overview}{overview} to see which
+ nodes can be connected to each other.
+
+ Paths are also used to insert audio \l{Phonon::}{Effect}s between
+ two media nodes. The effect will then alter the stream on the
+ path. Notice that \l{Phonon::}{Effect}s also are media nodes, but
+ that insertEffect() - instead of Phonon::createPath() - is used to
+ insert them into the media graph.
+
+ The following code example shows how to create a path between two
+ media nodes and insert an effect on that path.
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 20
+
+ \sa Phonon::MediaNode, Phonon::MediaObject, Phonon::AudioOutput,
+ Phonon::VideoWidget, {Phonon Module}
+*/
+
+/*!
+ \fn Phonon::Path::~Path();
+
+ Destroys this reference to the Path. If the path was valid the connection is not broken
+ as both the source and the sink MediaNodes still keep a reference to the Path.
+
+ \sa disconnect()
+*/
+
+/*!
+ \fn Phonon::Path::Path();
+
+ Creates an invalid path.
+
+ You can still make it a valid path by calling reconnect. It is
+ recommended to use the Phonon::createPath() function to create
+ paths.
+
+ \sa Phonon::createPath(), isValid()
+*/
+
+/*!
+ \fn Phonon::Path::Path(const Path &path);
+
+ Constructs a copy of the other \a path specified.
+
+ This constructor is fast thanks to explicit sharing.
+*/
+
+/*!
+ \fn bool Phonon::Path::isValid() const;
+
+ A path is considered valid if it is connected to two media nodes,
+ in which case this function returns true. If it is connected to
+ one or no media nodes, it is consider invalid, and this function
+ will then return false.
+*/
+
+/*!
+ \fn Effect *Phonon::Path::insertEffect(const EffectDescription &desc, Effect *insertBefore = 0);
+
+ Creates and inserts an effect into the path.
+
+ You may insert effects of the same class as often as you like,
+ but if you insert the same object, the call will fail.
+
+ \a desc is the EffectDescription object for the effect to be inserted.
+
+ If you already inserted an effect you can
+ tell with \a insertBefore in which order the data gets
+ processed. If this is \c 0 the effect is appended at the end of
+ the processing list. If the effect has not been inserted before
+ the method will do nothing and return \c false.
+
+ Returns a pointer to the effect object if it could be inserted
+ at the specified position. If \c 0 is returned, the effect was not
+ inserted.
+
+ Below is a code example for inserting an effect into a path:
+
+ \snippet doc/src/snippets/audioeffects.cpp 0
+
+ \sa removeEffect(), effects()
+*/
+
+/*!
+ \fn bool Phonon::Path::insertEffect(Effect *effect, Effect *insertBefore = 0);
+
+ Inserts the given \a effect into the path before the effect specified by \a insertBefore
+ and returns true if successful; otherwise returns false.
+
+ If \a insertBefore is zero, the effect is appended to the processing list.
+
+ You may insert effects of the same class as often as you like, but if you insert
+ the same object, the call will fail.
+
+ \a effect will be inserted right before \a insertBefore. If
+ \a insertBefore is \c 0, the effect is appended at the end of the
+ processing list. If the effect has not been inserted before the
+ method will do nothing and return \c false.
+
+ Returns whether the effect could be inserted at the specified
+ position. If \c false is returned the effect was not inserted.
+
+ \sa removeEffect(), effects()
+*/
+
+/*!
+ \fn bool Phonon::Path::removeEffect(Effect *effect);
+
+ Removes the given \a effect from the path and returns true; otherwise returns false.
+
+ Removes an \a effect from the path.
+
+ If the effect is deleted while it is still connected, the effect will be removed
+ automatically.
+
+ \omit
+ \param effect The effect to be removed.
+
+ \return Returns whether the call was successful. If it returns
+ \c false the effect could not be found in the path, meaning it
+ has not been inserted before.
+ \endomit
+
+ \sa insertEffect(), effects()
+*/
+
+/*!
+ \fn QList<Effect *> Phonon::Path::effects() const;
+
+ Returns a list of Effect objects that are currently
+ used as effects. The order in the list determines the order the
+ signal is sent through the effects.
+
+ \return A list with all current effects.
+
+ \sa insertEffect(), removeEffect()
+*/
+
+/*!
+ \fn bool Phonon::Path::reconnect(MediaNode *source, MediaNode *sink);
+
+ Changes the media nodes the path is connected to by connecting the path
+ to the \a source and \a sink nodes specified. Returns true if successful;
+ otherwise returns false.
+
+ If unsuccessful, the path remains connected to the same nodes as before.
+
+ \sa Phonon::createPath(), {Phonon Overview}
+*/
+
+/*!
+ \fn bool Phonon::Path::disconnect();
+
+ Tries to disconnect the path from the MediaNodes it is connected to, returning
+ true if successful or false if unsuccessful.
+
+ If successful, the path is invalidated: isValid() will returns false.
+*/
+
+/*!
+ \fn Path &Phonon::Path::operator=(const Path &p);
+
+ Assigns \a p to this Path and returns a reference to this Path.
+
+ This operation is fast thanks to explicit sharing.
+*/
+
+/*!
+ \fn bool Phonon::Path::operator==(const Path &p) const;
+
+ Returns true if this Path is equal to \a p; otherwise returns false;
+*/
+
+/*!
+ \fn bool Phonon::Path::operator!=(const Path &p) const;
+
+ Returns true if this Path is not equal to \a p; otherwise returns false.
+*/
+
+/*!
+ \fn MediaNode *Phonon::Path::source() const;
+
+ Returns the source MediaNode used by the path.
+*/
+
+/*!
+ \fn MediaNode *Phonon::Path::sink() const;
+
+ Returns the sink MediaNode used by the path.
+*/
+
+/*!
+ \fn Path Phonon::createPath(MediaNode *source, MediaNode *sink);
+
+ \relates Phonon::Path
+ Creates a new Path connecting the two MediaNodes \a source and \a sink.
+
+ The implementation will automatically select the right format and media type. E.g. connecting a
+ MediaObject and AudioOutput will create a Path object connecting the audio. This might be
+ represented as PCM or perhaps even AC3 depending on the AudioOutput object.
+
+ \param source The MediaNode to connect an output from
+ \param sink The MediaNode to connect to.
+*/
+
+/*!
+ \class Phonon::PathPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::MediaObjectInterface
+ \inmodule Phonon
+ \since 4.4
+ \internal
+ \brief Backend interface for media sources.
+
+ The backend implementation has to provide two signals, that are not defined
+ in this interface:
+ \list
+ \o \target phonon_MediaObjectInterface_stateChanged
+ void stateChanged(Phonon::State newstate, Phonon::State oldstate)
+
+ Emitted when the state of the MediaObject has changed.
+ In case you're not interested in the old state you can also
+ connect to a slot that only has one State argument.
+
+ \param newstate The state the Player is in now.
+ \param oldstate The state the Player was in before.
+
+ \o \target phonon_MediaObjectInterface_tick
+ void tick(qint64 time)
+
+ This signal gets emitted every tickInterval milliseconds.
+
+ \param time The position of the media file in milliseconds.
+
+ \sa setTickInterval()
+ \sa tickInterval()
+ \endlist
+
+ \sa MediaObject
+*/
+
+/*!
+ \fn virtual Phonon::MediaObjectInterface::~MediaObjectInterface()
+ \internal
+*/
+
+/*!
+ \fn virtual qint64 Phonon::MediaObjectInterface::remainingTime() const
+ \internal
+*/
+
+/*!
+ \fn virtual qint32 Phonon::MediaObjectInterface::prefinishMark() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::setPrefinishMark(qint32) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual qint32 Phonon::MediaObjectInterface::transitionTime() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::setTransitionTime(qint32) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::play() = 0
+ \internal
+
+ Requests the playback to start.
+
+ This method is only called if the state transition to PlayingState is possible.
+
+ The backend should react immediately
+ by either going into PlayingState or BufferingState if the
+ former is not possible.
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::pause() = 0
+ \internal
+
+ Requests the playback to pause.
+
+ This method is only called if the state transition to PausedState is possible.
+
+ The backend should react as fast as possible. Go to PausedState
+ as soon as playback is paused.
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::stop() = 0
+ \internal
+
+ Requests the playback to be stopped.
+
+ This method is only called if the state transition to StoppedState is possible.
+
+ The backend should react as fast as possible. Go to StoppedState
+ as soon as playback is stopped.
+
+ A subsequent call to play() will start playback at the beginning of
+ the media.
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::seek(qint64 milliseconds) = 0
+ \internal
+
+ Requests the playback to be seeked to the given time.
+
+ The backend does not have to finish seeking while in this function
+ (i.e. the backend does not need to block the thread until the seek is
+ finished; even worse it might lead to deadlocks when using a
+ ByteStream which gets its data from the thread this function would
+ block).
+
+ As soon as the seek is done the currentTime() function and
+ the tick() signal will report it.
+
+ \param milliseconds The time where playback should seek to in
+ milliseconds.
+*/
+
+/*!
+ \fn virtual qint32 Phonon::MediaObjectInterface::tickInterval() const = 0
+ \internal
+
+ Return the time interval in milliseconds between two ticks.
+
+ Returns the tick interval that it was set to (might not
+ be the same as you asked for).
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::setTickInterval(qint32 interval) = 0
+ \internal
+
+ Change the interval the tick signal is emitted. Set \a interval to 0 to
+ disable the signal.
+
+ \a interval tick interval in milliseconds
+
+ Returns the tick interval that it was set to (might not be the same as you
+ asked for).
+
+*/
+
+/*!
+ \fn virtual bool Phonon::MediaObjectInterface::hasVideo() const = 0
+ \internal
+
+ Check whether the media data includes a video stream.
+
+ Returns true if the media contains video data.
+*/
+
+/*!
+ \fn virtual bool Phonon::MediaObjectInterface::isSeekable() const = 0
+ \internal
+
+ If the current media may be seeked this function returns true;
+ otherwise, false.
+
+ Returns whether the current media may be seeked.
+*/
+
+/*!
+ \fn virtual qint64 Phonon::MediaObjectInterface::currentTime() const = 0
+ \internal
+
+ Get the current time (in milliseconds) of the file currently being played.
+*/
+
+/*!
+ \fn virtual Phonon::State Phonon::MediaObjectInterface::state() const = 0
+ \internal
+
+ Get the current state.
+*/
+
+/*!
+ \fn virtual QString Phonon::MediaObjectInterface::errorString() const = 0
+ \internal
+
+ A translated string describing the error.
+*/
+
+/*!
+ \fn virtual Phonon::ErrorType Phonon::MediaObjectInterface::errorType() const = 0
+ \internal
+
+ Tells your program what to do about the error.
+
+ \sa Phonon::ErrorType
+*/
+
+/*!
+ \fn virtual qint64 Phonon::MediaObjectInterface::totalTime() const = 0
+ \internal
+
+ Returns the total time of the media in milliseconds.
+
+ If the total time is not know return -1. Do not block until it is
+ known, instead emit the totalTimeChanged signal as soon as the total
+ time is known or changes.
+*/
+
+/*!
+ \fn virtual MediaSource Phonon::MediaObjectInterface::source() const = 0
+ \internal
+
+ Returns the current source.
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::setSource(const MediaSource &) = 0
+ \internal
+
+ Sets the current source. When this function is called the MediaObject is
+ expected to stop all current activity and start loading the new
+ source (i.e. go into LoadingState).
+
+ It is expected that the
+ backend now starts preloading the media data, filling the audio
+ and video buffers and making all media meta data available. It
+ will also trigger the totalTimeChanged signal.
+
+ If the backend does not know how to handle the source it needs to
+ change state to Phonon::ErrorState. Don't bother about handling KIO
+ URLs. It is enough to handle AbstractMediaStream sources correctly.
+
+ \warning Keep the MediaSource object around as long as the backend
+ uses the AbstractMediaStream returned by the MediaSource. In case
+ that no other reference to the MediaSource exists and it is set to
+ MediaSource::autoDelete, the AbstractMediaStream is deleted when the
+ last MediaSource ref is deleted.
+*/
+
+/*!
+ \fn virtual void Phonon::MediaObjectInterface::setNextSource(const MediaSource &source) = 0
+ \internal
+
+ Sets the next source to be used for transitions. When a next source
+ is set playback should continue with the new source. In that case
+ finished and prefinishMarkReached are not emitted.
+
+ \param source The source to transition to (crossfade/gapless/gap). If
+ \a source is an invalid MediaSource object then the queue is empty
+ and the playback should stop normally.
+
+ \warning Keep the MediaSource object around as long as the backend
+ uses the AbstractMediaStream returned by the MediaSource. In case
+ that no other reference to the MediaSource exists and it is set to
+ MediaSource::autoDelete, the AbstractMediaStream is deleted when the
+ last MediaSource ref is deleted.
+*/
+
+/*!
+ \class Phonon::EffectWidget effectwidget.h Phonon/EffectWidget
+ \inmodule Phonon
+ \inheaderfile Phonon/EffectWidget
+ \since 4.4
+ \brief The EffectWidget class provides a widget to control the parameters of an Effect.
+
+ The EffectWidget class provides a widget, with which an effects
+ parameters can be controlled. The widget does not have an API,
+ and is constructed with the \l{Phonon::}{Effect}, of which
+ parameters should be controlled.
+
+ \snippet doc/src/snippets/audioeffects.cpp 1
+
+ The following image shows an example of an effect widget.
+
+ \image effectwidget.png
+
+ Note that some audio effects do not have parameters, and the
+ widget will then not \l{QWidget::}{show()} at all.
+
+ \sa Effect, BackendCapabilities, EffectDescription, {Phonon Module}
+*/
+
+/*!
+ \class Phonon::AbstractAudioOutput
+ \inmodule Phonon
+ \internal
+ \brief Provides a common base class for all audio outputs.
+
+ \sa AudioOutput
+*/
+
+/*!
+ \fn Phonon::AbstractAudioOutput::~AbstractAudioOutput()
+ \internal
+*/
+
+/*!
+ \class Phonon::AbstractAudioOutputPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class AudioOutputAdaptor
+ \inmodule Phonon
+ \brief Provides an adaptor class for interface org.kde.Phonon.AudioOutput
+ \internal
+*/
+
+/*!
+ \class Phonon::VolumeSlider
+ \inmodule Phonon
+ \inheaderfile Phonon/VolumeSlider
+ \since 4.4
+ \brief The VolumeSlider widget provides a slider that is used to control the volume of an audio output device.
+
+ The slider also displays an icon indicating if the volume of the
+ \l{Phonon::}{AudioOutput} it is connected to is muted. The icon
+ can be removed with setMuteVisible().
+
+ It is possible to set the \l{maximumVolume}{maximum} value of the
+ slider. By default, the minimum and maximum values of the slider
+ are 0.0 (no sound) to 1.0 (the maximum volume the audio output can
+ produce).
+
+ Here follows a code example:
+
+ \snippet doc/src/snippets/volumeslider.cpp 0
+
+ \omit mention how to change the style of the slider. \endomit
+
+ \sa {Phonon Module}
+*/
+
+/*!
+ \property Phonon::VolumeSlider::maximumVolume
+
+ This property holds the maximum volume that can be set with this slider.
+
+ By default the maximum value is 1.0 (100%).
+*/
+
+/*!
+ \property Phonon::VolumeSlider::orientation
+ This property holds the orientation of the slider.
+
+ The orientation must be Qt::Vertical (the default) or Qt::Horizontal.
+*/
+
+/*!
+ \property Phonon::VolumeSlider::tracking
+ This property holds whether slider tracking is enabled.
+
+ If tracking is enabled (the default), the volume changes
+ while the slider is being dragged. If tracking is
+ disabled, the volume changes only when the user
+ releases the slider.
+*/
+
+/*!
+ \property Phonon::VolumeSlider::pageStep
+ This property holds the page step.
+
+ The larger of two natural steps that a slider provides and
+ typically corresponds to the user pressing PageUp or PageDown.
+
+ Defaults to 5 (5% of the voltage).
+*/
+
+/*!
+ \property Phonon::VolumeSlider::singleStep
+ This property holds the single step.
+
+ The smaller of two natural steps that a slider provides and
+ typically corresponds to the user pressing an arrow key.
+
+ Defaults to 1 (1% of the voltage).
+*/
+
+/*!
+ \property Phonon::VolumeSlider::muteVisible
+ This property holds whether the mute button/icon next to the slider is visible.
+
+ By default the mute button/icon is visible.
+*/
+
+/*!
+ \property Phonon::VolumeSlider::iconSize
+ \brief the icon size used for the mute button/icon.
+
+ The default size is defined by the GUI style.
+*/
+
+/*!
+ \fn explicit Phonon::VolumeSlider::VolumeSlider(QWidget *parent = 0)
+ Constructs a new volume slider with the given \a parent.
+*/
+
+/*!
+ \fn explicit Phonon::VolumeSlider::VolumeSlider(AudioOutput *output, QWidget *parent = 0)
+ Constructs a new volume slider with the given \a output object and \a parent.
+*/
+
+/*!
+ \fn Phonon::VolumeSlider::~VolumeSlider()
+*/
+
+/*!
+ \fn AudioOutput *Phonon::VolumeSlider::audioOutput() const
+*/
+
+/*!
+ \fn void Phonon::VolumeSlider::setAudioOutput(Phonon::AudioOutput *output)
+
+ Sets the audio output object to be controlled by this slider to the specified
+ \a output object.
+*/
+
+/*!
+ \class Phonon::VolumeSliderPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::MediaController
+ \inmodule Phonon
+ \inheaderfile Phonon/MediaController
+ \since 4.4
+ \brief The MediaController class controls optional features of a media file/device.
+
+ Some media sources have content that the \l{Phonon::}{MediaObject}
+ does not provide control over, for instance, chapters in a DVD
+ file. The functionality the media controller offers is
+ dependent on the type of media source that is played back.
+ Commonly, the media controller allows you to:
+
+ \list
+ \o Navigate between \bold chapters.
+ \o Navigate between \bold titles.
+ \o Select between \bold angles.
+ \endlist
+
+ The \l{Phonon::MediaController::}{Feature} enum explains these
+ terms in more detail, and their context in playback of CD and DVD.
+
+ The media controller keeps a \l{Phonon::}{MediaObject}, of which
+ \l{Phonon::MediaObject::currentSource()}{media source} is played
+ back. You can still call the media object's functions, e.g.,
+ \l{Phonon::MediaObject::}{stop()}; this is all handled correctly
+ by the media controller. You have the option of letting the media
+ controller play all titles of a source in sequence by setting the
+ \l{autoplayTitles()}{autoplay titles} option.
+
+ To start a playback using a media object, you call
+ \l{Phonon::MediaObject::}{play()} on the media object. To play a
+ specific title, use setCurrentTitle() and then call
+ \l{Phonon::MediaObject::}{play()}.
+
+ \warning The Phonon::MediaController class is not yet supported by
+ Qt backends.
+
+ \sa {Phonon Module}
+*/
+
+/*!
+ \fn int Phonon::MediaController::availableAudioChannels() const
+ \internal
+*/
+
+/*!
+ \fn void Phonon::MediaController::availableAudioChannelsChanged()
+ \internal
+*/
+
+/*!
+ \fn QList<SubtitleDescription> Phonon::MediaController::availableSubtitles() const
+ \internal
+*/
+
+/*!
+ \fn void Phonon::MediaController::availableSubtitlesChanged()
+ \internal
+*/
+
+/*!
+ \fn AudioChannelDescription Phonon::MediaController::currentAudioChannel() const
+ \internal
+*/
+
+/*!
+ \fn SubtitleDescription Phonon::MediaController::currentSubtitle() const
+ \internal
+*/
+
+/*!
+ \fn void Phonon::MediaController::setCurrentAudioChannel(const Phonon::AudioChannelDescription &stream)
+ \internal
+*/
+
+/*!
+ \fn void Phonon::MediaController::setCurrentSubtitle(const Phonon::SubtitleDescription &stream)
+ \internal
+*/
+
+/*!
+ \fn Phonon::BackendCapabilities::availableAudioCaptureDevices()
+ \internal
+*/
+
+/*!
+ \fn Phonon::BackendCapabilities::Notifier::availableAudioCaptureDevicesChanged()
+ \internal
+*/
+
+/*!
+ \enum Phonon::MediaController::Feature
+
+ The values of this enum are interpreted differently depending on
+ the type of media source, e.g., DVD or CD. We give examples for
+ these sources.
+
+ \value Angles In the VOB (DVD) format, it is possible to to give
+ several video streams of the same scene, each of which displays
+ the scene from a different angle. The DVD viewer can then change
+ between these angles.
+
+ \value Chapters In the VOB format, chapters are points in a
+ single video stream that can be played and seeked to
+ separately.
+
+ \value Titles On a CD, a title is a separate sound track. On DVD,
+ a title is a separate VOB file.
+
+*/
+
+/*!
+ \fn Phonon::MediaController::MediaController(MediaObject *parent)
+
+ Constructs a new MediaController with the media object (\a parent)
+ to be used by the media controller.
+
+ \sa MediaObject, Feature
+*/
+
+/*!
+ \fn Phonon::MediaController::~MediaController()
+*/
+
+/*!
+ \fn Features Phonon::MediaController::supportedFeatures() const
+*/
+
+/*!
+ \fn int Phonon::MediaController::availableAngles() const
+
+ Returns the available angles that is available for the current
+ media source.
+
+ \sa Feature
+*/
+
+/*!
+ \fn int Phonon::MediaController::currentAngle() const
+
+ Returns the angle that is currently used.
+
+ \sa Feature
+*/
+
+/*!
+ \fn int Phonon::MediaController::availableChapters() const
+
+ Returns the number of chapters the current media source
+ contains.
+
+ \sa Feature
+*/
+
+/*!
+ \fn int Phonon::MediaController::currentChapter() const
+
+ Returns the chapter that is currently being played back.
+
+ \sa Feature
+*/
+
+/*!
+ \fn int Phonon::MediaController::availableTitles() const
+
+ Returns the number of titles that the current media source
+ contains.
+
+ \sa Feature
+*/
+
+/*!
+ \fn int Phonon::MediaController::currentTitle() const
+
+ Returns the title that is currently played back.
+
+ The current title is 0 (the first) by default.
+
+ \sa Feature
+*/
+
+/*!
+ \fn bool Phonon::MediaController::autoplayTitles() const
+
+ Returns true if titles will automatically be played when the media
+ is played; otherwise returns false.
+
+ The media controller will play the titles of the media source in
+ sequence when the media object's \l{Phonon::MediaObject::}{play()}
+ function is called. If the autoplay option is disabled, the media
+ object will play the
+ \l{Phonon::}{MediaController::currentTitle()}{current title} and then
+ finish the playback.
+
+ \sa setAutoplayTitles(), currentTitle()
+*/
+
+/*!
+ \fn void Phonon::MediaController::setAutoplayTitles(bool enable)
+
+ Sets the titles to play automatically when the media is played if
+ \a enable is true; otherwise disables this option.
+
+ The media controller will play the titles of the media source in
+ sequence when the media object's \l{Phonon::MediaObject::}{play()}
+ function is called. If the autoplay option is disabled, the media
+ object will play the
+ \l{Phonon::}{MediaController::currentTitle()}{current title} and then
+ finish the playback.
+
+ \sa autoplayTitles(), currentTitle()
+*/
+
+/*!
+ \fn void Phonon::MediaController::setCurrentAngle(int angleNumber)
+
+ Sets the current angle to the given \a angleNumber if the media
+ file or device supports navigation by angle number.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::setCurrentChapter(int chapterNumber)
+
+ Sets the current chapter to the given \a chapterNumber if the media
+ file or device supports navigation by chapter number.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::setCurrentTitle(int titleNumber)
+
+ Skips to the given title \a titleNumber.
+
+ If it was playing before the title change it will start playback on the new title if
+ autoplayTitles is enabled.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::nextTitle()
+
+ Skips to the next title.
+
+ If it was playing before the title change it will start playback on the next title if
+ autoplayTitles is enabled.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::previousTitle()
+
+ Skips to the previous title.
+
+ If it was playing before the title change it will start playback on the previous title if
+ autoplayTitles is enabled.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::availableAnglesChanged(int availableAngles)
+
+ This signal is emitted whenever the number of available angles changes.
+ The new number of available angles is given by \a availableAngles.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::angleChanged(int angleNumber)
+
+ This signal is emitted whenever the current angle changes.
+ The new angle number is given by \a angleNumber.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::availableChaptersChanged(int availableChapters)
+
+ This signal is emitted whenever the number of available chapters changes.
+ The new number of available chapters is given by \a availableChapters.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::chapterChanged(int chapterNumber)
+
+ This signal is emitted whenever the current chapter changes.
+ The new chapter number is given by \a chapterNumber.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::availableTitlesChanged(int availableTitles)
+
+ This signal is emitted whenever the number of available titles changes.
+ The new number of available titles is given by \a availableTitles.
+
+ \sa Feature
+*/
+
+/*!
+ \fn void Phonon::MediaController::titleChanged(int titleNumber)
+
+ This signal is emitted whenever the current title changes.
+ The new title number is given by \a titleNumber.
+
+ \sa Feature
+*/
+
+/*!
+ \class Phonon::VideoWidget
+ \inmodule Phonon
+ \inheaderfile Phonon/VideoWidget
+ \since 4.4
+ \ingroup advanced
+ \ingroup multimedia
+ \brief The VideoWidget class provides a widget that is used to display video.
+
+ The VideoWidget class renders the video of a media stream on a
+ QWidget. It is connected to the \l{Phonon::}{MediaObject}, of
+ which video stream it should render. You connect the two objects
+ using the Phonon::createPath() function.
+
+ The widget has some possibilities to manipulate the video
+ stream. You can change the brightness(), hue(), saturation(),
+ and contrast().
+
+ Resizing of the video is handled automatically, but you can affect
+ the way the video is resized with the aspectRatio and scaleMode
+ properties. By default, the widget will use the aspect ratio of
+ the video stream itself.
+
+ The video widget takes the size of the video when it receives a new video
+ stream (i.e., when a new MediaSource is set on the MediaObject to which it is
+ connected). If you need to know the size of the video, you can call
+ \l{QWidget::}{sizeHint()} after the video has been loaded (i.e., after the
+ MediaObject leaves the \l{Phonon::}{LoadingState}).
+
+ It is also possible to go to \l{fullScreen}{full screen} mode.
+
+ A typical example of usage follows below:
+
+ \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 21
+
+ \sa {Phonon Module}
+*/
+
+/*!
+ \fn Phonon::VideoWidget::VideoWidget(QWidget *parent = 0)
+
+ Constructs a new video widget with the specified \a parent.
+*/
+
+/*!
+ \fn Phonon::VideoWidget::VideoWidget(VideoWidgetPrivate &d, QWidget *parent)
+ \internal
+
+ Constructs a new video widget with the specified \a parent.
+*/
+
+/*!
+ \fn bool Phonon::VideoWidget::event(QEvent *)
+ \reimp
+*/
+
+/*!
+ \fn void Phonon::VideoWidget::mouseMoveEvent(QMouseEvent *)
+ \reimp
+*/
+
+/*!
+ \enum Phonon::VideoWidget::ScaleMode
+
+ The ScaleMode enum describes how to treat aspect ratio during
+ resizing of video.
+
+ \value FitInView The video will be fitted to fill the view
+ keeping aspect ratio.
+ \value ScaleAndCrop The video is scaled
+*/
+
+/*!
+ \property Phonon::VideoWidget::fullScreen
+ This property holds whether the video is shown using the complete
+ screen.
+
+ The property differs from QWidget::fullScreen in that it is
+ writeable.
+
+ By default the widget is not shown in fullScreen.
+
+ \warning When switching to full screen mode using setFullScreen(),
+ the widget onto which the video is rendered is shown as a
+ top-level window. Key event forwarding is handled by VideoWidget,
+ but if you need to handle other events, e.g., mouse events, you
+ should handle fullscreen mode yourself.
+*/
+
+/*!
+ \property Phonon::VideoWidget::aspectRatio
+ Defaults to AspectRatioAuto.
+
+ \sa AspectRatio
+*/
+
+/*!
+ \property Phonon::VideoWidget::scaleMode
+
+ If the size of the widget and the size of the video are not equal.
+ The video will be zoomed to fit the widget. The smaller zoom
+ (AddBarsScaleMode) adds black bars at the left/right or top/bottom to
+ make all of the image visible (default). The bigger zoom (ExpandMode)
+ fills the widget completely, keeping all information in one direction
+ and leaving parts of the image outside of the widget in the other
+ direction.
+*/
+
+/*!
+ \property Phonon::VideoWidget::brightness
+
+ This property holds brightness of the video.
+
+ Default is 0. Acceptable values are in range of -1, 1.
+*/
+
+/*!
+ \property Phonon::VideoWidget::contrast
+
+ This property holds the contrast of the video.
+
+ Default is 0. Acceptable values are in range of -1, 1.
+*/
+
+/*!
+ \property Phonon::VideoWidget::hue
+
+ This property holds the hue of the video.
+
+ Default is 0. Acceptable values are in range of -1, 1.
+*/
+
+/*!
+ \property Phonon::VideoWidget::saturation
+
+ This property holds saturation of the video.
+
+ Default is 0. Acceptable values are in range of -1, 1.
+*/
+
+/*!
+ \enum Phonon::VideoWidget::AspectRatio
+
+ Defines the width:height to be used for the video.
+
+ \value AspectRatioAuto
+ Let the decoder find the aspect ratio automatically from the
+ media file (this is the default).
+
+ \value AspectRatioWidget
+ Fits the video into the widget making the aspect ratio depend
+ solely on the size of the widget. This way the aspect ratio
+ is freely resizeable by the user.
+
+ \value AspectRatio4_3
+ Make width/height == 4/3, which is the old TV size and
+ monitor size (1024/768 == 4/3). (4:3)
+
+ \value AspectRatio16_9
+ Make width/height == 16/9, which is the size of most current
+ media. (16:9)
+*/
+
+/*!
+ \fn void Phonon::VideoWidget::exitFullScreen()
+
+ Convenience slot, calling setFullScreen(false)
+*/
+
+
+/*!
+ \fn void Phonon::VideoWidget::enterFullScreen()
+
+ Convenience slot, calling setFullScreen(true)
+*/
+
+/*!
+ \class Phonon::VideoWidgetInterface
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \fn virtual Phonon::VideoWidgetInterface::~VideoWidgetInterface()
+*/
+
+/*!
+ \fn virtual Phonon::VideoWidget::AspectRatio Phonon::VideoWidgetInterface::aspectRatio() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VideoWidgetInterface::setAspectRatio(Phonon::VideoWidget::AspectRatio ratio) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual qreal Phonon::VideoWidgetInterface::brightness() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VideoWidgetInterface::setBrightness(qreal) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual Phonon::VideoWidget::ScaleMode Phonon::VideoWidgetInterface::scaleMode() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VideoWidgetInterface::setScaleMode(Phonon::VideoWidget::ScaleMode mode) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual qreal Phonon::VideoWidgetInterface::contrast() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VideoWidgetInterface::setContrast(qreal) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual qreal Phonon::VideoWidgetInterface::hue() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VideoWidgetInterface::setHue(qreal) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual qreal Phonon::VideoWidgetInterface::saturation() const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual void Phonon::VideoWidgetInterface::setSaturation(qreal) = 0
+ \internal
+*/
+
+/*!
+ \fn virtual QWidget *Phonon::VideoWidgetInterface::widget() = 0
+ \internal
+*/
+
+/*!
+ \class Phonon::PlatformPlugin
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \fn virtual AbstractMediaStream *Phonon::PlatformPlugin::createMediaStream(const QUrl &url, QObject *parent) = 0
+
+ Creates a AbstractMediaStream object with the given \a parent that provides the data
+ for the given URL specified by \a url.
+ \omit
+ On KDE this uses KIO.
+ \endomit
+*/
+
+/*!
+ \fn virtual QIcon Phonon::PlatformPlugin::icon(const QString &name) const = 0
+
+ Returns the icon for the given icon name.
+*/
+
+/*!
+ \fn virtual void Phonon::PlatformPlugin::notification(const char *notificationName, const QString &text,
+ const QStringList &actions, QObject *receiver, const char *actionSlot) const = 0
+
+ Shows a notification pop-up with the given \a notificationName and \a text.
+ Each action in the associated list of \a actions is connected to the \a actionSlot
+ of the specified \a receiver object, which is expected to act on the actions as
+ they are triggered by the user.
+*/
+
+/*!
+ \fn virtual QString Phonon::PlatformPlugin::applicationName() const = 0
+
+ Returns the name of the application. For most Qt application this is
+ QCoreApplication::applicationName(), but for KDE this is overridden by KAboutData.
+*/
+
+
+/*!
+ \fn virtual QObject *Phonon::PlatformPlugin::createBackend() = 0
+
+ Creates a backend object. This way the platform can decide the backend preference.
+*/
+
+/*!
+ \fn virtual QObject *Phonon::PlatformPlugin::createBackend(const QString &library, const QString &version) = 0
+
+ Using the library loader of the platform, loads a given backend provided the
+ specified \a library and \a version.
+*/
+
+/*!
+ \fn virtual bool Phonon::PlatformPlugin::isMimeTypeAvailable(const QString &mimeType) const = 0
+
+ Tries to check whether the default backend supports the MIME type specified by \a mimeType
+ without loading the actual backend library.
+ \omit
+ On KDE this reads the MIME type list from the .desktop file of
+ the backend.
+ \endomit
+*/
+
+/*!
+ \fn virtual void Phonon::PlatformPlugin::saveVolume(const QString &outputName, qreal volume) = 0
+
+ Saves the volume for the given output.
+*/
+
+/*!
+ \fn virtual qreal Phonon::PlatformPlugin::loadVolume(const QString &outputName) const = 0
+
+ Loads the volume for the given output.
+*/
+
+/*!
+ \class Phonon::MediaNode
+ \inmodule Phonon
+ \inheaderfile Phonon/MediaNode
+ \since 4.4
+ \brief The MediaNode class is the base class for all nodes in a media graph.
+
+ In all phonon applications, one builds a media graph consisting of
+ MediaNodes. The graph will take multimedia content, e.g., from a
+ file, as input. After its nodes have processed the multimedia, the
+ graph will output the media again, e.g., to a sound card.
+
+ The multimedia content is streamed over \l{Phonon::}{Path}s
+ between the nodes in the graph. You can query the paths that are
+ connected to a media node with inputPaths() and outputPaths().
+
+ You can check whether the node is implemented by the current
+ backend by calling isValid(). This does not guarantee that an
+ instance of the class works as expected, but that the backend has
+ implemented functionality for the class.
+
+ Currently, Phonon has four media nodes: \l{Phonon::}{MediaObject},
+ \l{Phonon::}{AudioOutput}, \l{Phonon::}{VideoWidget}, and \l{Phonon::}{Effect}.
+ Please refer to their class descriptions for details about their usage, and to
+ find out which nodes can be connected to each other. See also \l{Building
+ Graphs} in Phonon's \l{Phonon Overview}{overview} document.
+
+ Two nodes are connected to each other using the
+ Phonon::createPath() or \l{Phonon::}{Path::insertEffect()}
+ functions (only \l{Phonon::Effect}s use
+ \l{Phonon::Path::}{insertEffect()}). We show a code example below,
+ in which we build a media graph for video playback and then query
+ its media nodes for their \l{Phonon::}{Path}s:
+
+ \snippet doc/src/snippets/medianodesnippet.cpp 0
+
+ When you create a Phonon application, you will likely build the
+ graph yourself. This makes isValid() the most useful function of
+ this class. The other two functions help navigate the graph, which
+ you do not need to do as you created the nodes yourself.
+
+ \sa {Phonon Overview}, Phonon::MediaObject,
+ Phonon::AudioOutput, Phonon::VideoWidget, {Phonon Module}
+*/
+
+/*!
+ \fn virtual Phonon::MediaNode::~MediaNode()
+
+ Destroys the media node and any paths connecting it to other
+ nodes. Any \l{Phonon::}{Effect}s connected to these paths will
+ also be deleted.
+*/
+
+/*!
+ \fn bool Phonon::MediaNode::isValid() const
+
+ Returns true if the backend provides an implementation of this
+ class; otherwise returns false.
+
+ This does not guarantee that instances of the class works as
+ expected, but that the backend has implemented the functionality
+ for this class. For instance, Qt's GStreamer backend will return
+ true for instances of the \l{Phonon::}{AudioOutput} class, even if
+ there is a problem with GStreamer and it could not play sound.
+
+*/
+
+/*!
+ \fn QList<Path> Phonon::MediaNode::inputPaths() const
+
+ Returns the paths that inputs multimedia to this media node.
+
+ \sa outputPaths()
+*/
+
+/*!
+ \fn QList<Path> Phonon::MediaNode::outputPaths() const
+
+ Returns the paths to which this media node outputs media.
+
+ \sa inputPaths()
+*/
+
+/*!
+ \fn Phonon::MediaNode::MediaNode(MediaNodePrivate &dd)
+ \internal
+*/
+
+/*!
+ \class Phonon::GlobalConfig
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \fn Phonon::GlobalConfig::GlobalConfig()
+ \internal
+*/
+
+/*!
+ \fn Phonon::GlobalConfig::~GlobalConfig()
+ \internal
+*/
+
+/*!
+ \fn QList<int> Phonon::GlobalConfig::audioOutputDeviceListFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const
+ \internal
+*/
+
+/*!
+ \fn int Phonon::GlobalConfig::audioOutputDeviceFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const
+ \internal
+*/
+
+/*!
+ \class Phonon::ObjectDescriptionData
+ \inmodule Phonon
+ \since 4.4
+ \internal
+ \brief Data class for objects describing devices or features of the backend.
+
+ \sa Phonon::BackendCapabilities
+*/
+
+/*!
+ \fn bool Phonon::ObjectDescriptionData::operator==(const ObjectDescriptionData &otherDescription) const
+
+ Returns \c true if this ObjectDescription describes the same
+ as \a otherDescription; otherwise returns \c false.
+*/
+
+/*!
+ \fn QString Phonon::ObjectDescriptionData::name() const
+
+ Returns the name of the capture source.
+
+ \return A string that should be presented to the user to
+ choose the capture source.
+*/
+
+/*!
+ \fn QString Phonon::ObjectDescriptionData::description() const
+
+ Returns a description of the capture source. This text should
+ make clear what sound source this is, which is sometimes hard
+ to describe or understand from just the name.
+
+ \return A string describing the capture source.
+*/
+
+/*!
+ \fn QVariant Phonon::ObjectDescriptionData::property(const char *name) const
+
+ Returns a named property.
+
+ If the property is not set an invalid value is returned.
+
+ \sa propertyNames()
+*/
+
+/*!
+ \fn QList<QByteArray> Phonon::ObjectDescriptionData::propertyNames() const
+
+ Returns all names that return valid data when property() is called.
+
+ \sa property()
+*/
+
+/*!
+ \fn bool Phonon::ObjectDescriptionData::isValid() const
+
+ Returns true if the Tuple is valid (index != -1); otherwise returns
+ false.
+*/
+
+/*!
+ \fn int Phonon::ObjectDescriptionData::index() const
+
+ A unique identifier for this device/. Used internally
+ to distinguish between the devices/.
+
+ \return An integer that uniquely identifies every device.
+*/
+
+/*!
+ \fn static ObjectDescriptionData *Phonon::ObjectDescriptionData::fromIndex(ObjectDescriptionType type, int index)
+ \internal
+*/
+
+/*!
+ \fn Phonon::ObjectDescriptionData::~ObjectDescriptionData()
+ \internal
+*/
+
+/*!
+ \fn Phonon::ObjectDescriptionData::ObjectDescriptionData(ObjectDescriptionPrivate * = 0)
+ \internal
+*/
+
+/*!
+ \class Phonon::AddonInterface
+ \inmodule Phonon
+ \since 4.4
+ \internal
+ \brief Interface for Menu, Chapter, Angle and Title/Track control.
+*/
+
+/*!
+ \fn virtual Phonon::AddonInterface::~AddonInterface()
+ \internal
+*/
+
+/*!
+ \enum Phonon::AddonInterface::Interface
+
+ This enum describes the type of interface represented by an AddonInterface object.
+
+ \value NavigationInterface
+ \value ChapterInterface
+ \value AngleInterface
+ \value TitleInterface
+*/
+
+/*!
+ \enum Phonon::AddonInterface::NavigationCommand
+ \internal
+ \value Menu1Button
+*/
+
+/*!
+ \enum Phonon::AddonInterface::ChapterCommand
+ \internal
+ \value availableChapters
+ \value chapter
+ \value setChapter
+*/
+
+/*!
+ \enum Phonon::AddonInterface::AngleCommand
+ \internal
+ \value availableAngles
+ \value angle
+ \value setAngle
+*/
+
+/*!
+ \enum Phonon::AddonInterface::TitleCommand
+ \internal
+ \value availableTitles
+ \value title
+ \value setTitle
+ \value autoplayTitles
+ \value setAutoplayTitles
+*/
+
+/*!
+ \fn virtual bool Phonon::AddonInterface::hasInterface(Interface iface) const = 0
+ \internal
+*/
+
+/*!
+ \fn virtual QVariant Phonon::AddonInterface::interfaceCall(Interface iface, int command,
+ const QList<QVariant> &arguments) = 0
+ \internal
+*/
+
+/*!
+ \class Phonon::MediaNodePrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \namespace Phonon::Factory
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \fn Sender *Phonon::Factory::sender()
+
+ Returns a pointer to the object emitting the signals.
+
+ \sa Sender::backendChanged()
+*/
+
+/*!
+ \fn QObject *Phonon::Factory::createMediaObject(QObject *parent = 0)
+
+ Create a new backend object for a MediaObject.
+
+ \return a pointer to the MediaObject the backend provides.
+*/
+
+/*!
+ \fn QObject *Phonon::Factory::createEffect(int effectId, QObject *parent = 0)
+
+ Create a new backend object for a Effect.
+
+ \return a pointer to the Effect the backend provides.
+*/
+
+/*!
+ \fn QObject *Phonon::Factory::createVolumeFaderEffect(QObject *parent = 0)
+
+ Create a new backend object for a VolumeFaderEffect.
+
+ \return a pointer to the VolumeFaderEffect the backend provides.
+*/
+
+/*!
+ \fn QObject *Phonon::Factory::createAudioOutput(QObject *parent = 0)
+
+ Create a new backend object for a AudioOutput.
+
+ \return a pointer to the AudioOutput the backend provides.
+*/
+
+/*!
+ \fn QObject *Phonon::Factory::createVideoWidget(QObject *parent = 0)
+
+ Create a new backend object for a VideoWidget.
+
+ \return a pointer to the VideoWidget the backend provides.
+*/
+
+/*!
+ \fn QObject *Phonon::Factory::backend(bool createWhenNull = true)
+
+ \return a pointer to the backend interface.
+*/
+
+/*!
+ \fn QString Phonon::Factory::identifier()
+
+ Unique identifier for the Backend. Can be used in configuration files
+ for example.
+*/
+
+
+/*!
+ \fn QString Phonon::Factory::backendName()
+
+ Get the name of the Backend.
+ \omit
+ It's the name from the .desktop file.
+ \endomit
+*/
+
+/*!
+ \fn QString Phonon::Factory::backendComment()
+
+ Get the comment of the Backend.
+ \omit
+ It's the comment from the .desktop file.
+ \endomit
+*/
+
+/*!
+ \fn QString Phonon::Factory::backendVersion()
+
+ Get the version of the Backend.
+ \omit
+ It's the version from the .desktop file.
+ \endomit
+
+ The version is especially interesting if there are several versions
+ available for binary incompatible versions of the backend's media
+ framework.
+*/
+
+/*!
+ \fn QString Phonon::Factory::backendIcon()
+
+ Get the icon (name) of the Backend.
+ \omit
+ It's the icon from the .desktop file.
+ \endomit
+*/
+
+/*!
+ \fn QString Phonon::Factory::backendWebsite()
+
+ Get the website of the Backend.
+ \omit
+ It's the website from the .desktop file.
+ \endomit
+*/
+
+/*!
+ \fn QObject *Phonon::Factory::registerQObject(QObject *object)
+
+ Registers the given backend \a object with the factory.
+*/
+
+/*!
+ \fn bool Phonon::Factory::isMimeTypeAvailable(const QString &mimeType)
+*/
+
+/*!
+ \fn void Phonon::Factory::registerFrontendObject(MediaNodePrivate *)
+ \internal
+*/
+
+/*!
+ \fn void Phonon::Factory::deregisterFrontendObject(MediaNodePrivate *)
+ \internal
+*/
+
+/*!
+ \fn void Phonon::Factory::setBackend(QObject *)
+*/
+
+/*!
+ \fn PlatformPlugin *Phonon::Factory::platformPlugin()
+*/
+
+/*!
+/*!
+ \class Phonon::AbstractMediaStreamPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::FrontendInterfacePrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::EffectWidgetPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::IODeviceStream
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \fn explicit Phonon::IODeviceStream::IODeviceStream(QIODevice *ioDevice, QObject *parent = 0)
+ \internal
+
+ Creates a new IODeviceStream with the given \a ioDevice and \a
+ parent.
+
+*/
+
+/*!
+ \fn Phonon::IODeviceStream::~IODeviceStream()
+ \internal
+*/
+
+/*!
+ \fn void Phonon::IODeviceStream::reset()
+ \internal
+*/
+
+/*!
+ \fn void Phonon::IODeviceStream::needData()
+ \internal
+*/
+
+/*!
+ \fn void Phonon::IODeviceStream::seekStream(qint64)
+ \internal
+*/
+
+/*!
+ \namespace Phonon::Platform
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \typedef Phonon::EffectDescriptionModel
+ \inmodule Phonon
+ \brief provides a item view model containing available audio effects.
+
+*/
+
+/*!
+ \typedef Phonon::SubtitleDescription
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \typedef Phonon::SubtitleDescriptionModel
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \typedef Phonon::AudioChannelDescription
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \typedef Phonon::AudioChannelDescriptionModel
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \typedef Phonon::AudioCaptureDevice
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \typedef Phonon::AudioCaptureDeviceModel
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \typedef Phonon::CleanUpFunction
+ \inmodule Phonon
+ \internal
+*/
+
+/*!
+ \typedef Phonon::QObjectPair
+ \inmodule Phonon
+ \since 4.4
+ \internal
+
+*/
+
+/*!
+ \typedef Phonon::AudioOutputDeviceModel
+ \inmodule Phonon
+ \brief provides an item view model containing available audio output devices.
+
+*/
+
+/*!
+ \fn uint Phonon::qHash(const Phonon::EffectParameter &param)
+ \internal
+
+*/
+
+/*!
+ \fn Phonon::CleanUpGlobalStatic::~CleanUpGlobalStatic()
+ \internal
+*/
+
+/*!
+ \class Phonon::ConstIface
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::CleanUpGlobalStatic
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class Phonon::EffectParameterPrivate
+ \inmodule Phonon
+ \since 4.4
+ \internal
+
+*/
+
+/*!
+ \class Phonon::QSettingsGroup
+ \inmodule Phonon
+ \since 4.4
+ \internal
+
+*/
+
+/*!
+ \class Phonon::MediaNodeDestructionHandler
+ \inmodule Phonon
+ \since 4.4
+ \internal
+
+*/
+
+/*!
+ \fn Phonon::MediaNodeDestructionHandler::~MediaNodeDestructionHandler()
+ \internal
+ Called from Base::~Base if this object was registered
+ using BasePrivate::addDestructionHandler().
+*/
+
+/*!
+ \fn Phonon::MediaNodeDestructionHandler::phononObjectDestroyed(MediaNodePrivate *)
+ \internal
+*/
+
+/*!
+ \fn explicit Phonon::EffectWidget::EffectWidget(Effect *effect, QWidget *parent = 0)
+ \internal
+
+ Constructs a new EffectWidget for the specified \a effect and with
+ the specified \a parent.
+*/
+
+/*!
+ \fn Phonon::EffectWidget::~EffectWidget()
+ \internal
+*/
+
+/*!
+ \fn QDebug Phonon::operator<<(QDebug s, const ObjectDescription<T> &o)
+ \internal
+*/
+
+/*!
+ \class Phonon::ListModelHelper
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
+/*!
+ \class AudioOutputInterface42
+ \inmodule Phonon
+ \since 4.4
+ \internal
+*/
+
diff --git a/doc/src/classes/phonon-namespace.qdoc b/doc/src/classes/phonon-namespace.qdoc
new file mode 100644
index 0000000..b6c6408
--- /dev/null
+++ b/doc/src/classes/phonon-namespace.qdoc
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \namespace Phonon
+ \brief The Phonon namespace contains classes and functions for multimedia applications.
+ \since 4.4
+
+ This namespace contains classes to access multimedia functions for
+ audio and video playback. Those classes are not dependent on any specific
+ framework, but rather use exchangeable backends to do the work.
+
+ See the \l{Phonon Module} page for general information about the
+ framework and the \l{Phonon Overview} for an introductory tour of its
+ features.
+*/
diff --git a/doc/src/qpatternistdummy.cpp b/doc/src/classes/qpatternistdummy.cpp
index 4a7da26..4a7da26 100644
--- a/doc/src/qpatternistdummy.cpp
+++ b/doc/src/classes/qpatternistdummy.cpp
diff --git a/doc/src/codecs.qdoc b/doc/src/codecs.qdoc
deleted file mode 100644
index ef15be0..0000000
--- a/doc/src/codecs.qdoc
+++ /dev/null
@@ -1,534 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page codec-big5.html
- \title Big5 Text Codec
- \ingroup codecs
-
- The Big5 codec provides conversion to and from the Big5 encoding.
- The code was originally contributed by Ming-Che Chuang
- \<mingche@cobra.ee.ntu.edu.tw\> for the Big-5+ encoding, and was
- included in Qt with the author's permission, and the grateful
- thanks of the Qt team. (Note: Ming-Che's code is QPL'd, as
- per an mail to qt-info@nokia.com.)
-
- However, since Big-5+ was never formally approved, and was never
- used by anyone, the Taiwan Free Software community and the Li18nux
- Big5 Standard Subgroup agree that the de-facto standard Big5-ETen
- (zh_TW.Big5 or zh_TW.TW-Big5) be used instead.
-
- The Big5 is currently implemented as a pure subset of the
- Big5-HKSCS codec, so more fine-tuning is needed to make it
- identical to the standard Big5 mapping as determined by
- Li18nux-Big5. See \l{http://www.autrijus.org/xml/} for the draft
- Big5 (2002) standard.
-
- James Su \<suzhe@turbolinux.com.cn\> \<suzhe@gnuchina.org\>
- generated the Big5-HKSCS-to-Unicode tables with a very
- space-efficient algorithm. He generously donated his code to glibc
- in May 2002. Subsequently, James has kindly allowed Anthony Fok
- \<anthony@thizlinux.com\> \<foka@debian.org\> to adapt the code
- for Qt.
-
- \legalese
- Copyright (C) 2000 Ming-Che Chuang \BR
- Copyright (C) 2002 James Su, Turbolinux Inc. \BR
- Copyright (C) 2002 Anthony Fok, ThizLinux Laboratory Ltd.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- \list 1
- \o Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \o Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- \endlist
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- \endlegalese
-*/
-
-/*!
- \page codec-big5hkscs.html
- \title Big5-HKSCS Text Codec
- \ingroup codecs
-
- The Big5-HKSCS codec provides conversion to and from the
- Big5-HKSCS encoding.
-
- The codec grew out of the QBig5Codec originally contributed by
- Ming-Che Chuang \<mingche@cobra.ee.ntu.edu.tw\>. James Su
- \<suzhe@turbolinux.com.cn\> \<suzhe@gnuchina.org\> and Anthony Fok
- \<anthony@thizlinux.com\> \<foka@debian.org\> implemented HKSCS-1999
- QBig5hkscsCodec for Qt-2.3.x, but it was too late in Qt development
- schedule to be officially included in the Qt-2.3.x series.
-
- Wu Yi \<wuyi@hancom.com\> ported the HKSCS-1999 QBig5hkscsCodec to
- Qt-3.0.1 in March 2002.
-
- With the advent of the new HKSCS-2001 standard, James Su
- \<suzhe@turbolinux.com.cn\> \<suzhe@gnuchina.org\> generated the
- Big5-HKSCS<->Unicode tables with a very space-efficient algorithm.
- He generously donated his code to glibc in May 2002. Subsequently,
- James has generously allowed Anthony Fok to adapt the code for
- Qt-3.0.5.
-
- Currently, the Big5-HKSCS tables are generated from the following
- sources, and with the Euro character added:
- \list 1
- \o \l{http://www.microsoft.com/typography/unicode/950.txt}
- \o \l{http://www.info.gov.hk/digital21/chi/hkscs/download/big5-iso.txt}
- \o \l{http://www.info.gov.hk/digital21/chi/hkscs/download/big5cmp.txt}
- \endlist
-
- There may be more fine-tuning to the QBig5hkscsCodec to maximize its
- compatibility with the standard Big5 (2002) mapping as determined by
- Li18nux Big5 Standard Subgroup. See \l{http://www.autrijus.org/xml/}
- for the various Big5 CharMapML tables.
-
- \legalese
- Copyright (C) 2000 Ming-Che Chuang \BR
- Copyright (C) 2001, 2002 James Su, Turbolinux Inc. \BR
- Copyright (C) 2002 WU Yi, HancomLinux Inc. \BR
- Copyright (C) 2001, 2002 Anthony Fok, ThizLinux Laboratory Ltd.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- \list 1
- \o Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \o Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- \endlist
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- \endlegalese
-*/
-
-/*!
- \page codec-eucjp.html
- \title EUC-JP Text Codec
- \ingroup codecs
-
- The EUC-JP codec provides conversion to and from EUC-JP, the main
- legacy encoding for Unix machines in Japan.
-
- The environment variable \c UNICODEMAP_JP can be used to
- fine-tune the JIS, Shift-JIS, and EUC-JP codecs. The \l{ISO
- 2022-JP (JIS) Text Codec} documentation describes how to use this
- variable.
-
- Most of the code here was written by Serika Kurusugawa,
- a.k.a. Junji Takagi, and is included in Qt with the author's
- permission and the grateful thanks of the Qt team. Here is
- the copyright statement for that code:
-
- \legalese
-
- Copyright (C) 1999 Serika Kurusugawa. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- \list 1
- \o Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \o Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- \endlist
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS".
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- \endlegalese
-*/
-
-/*!
- \page codec-euckr.html
- \title EUC-KR Text Codec
- \ingroup codecs
-
- The EUC-KR codec provides conversion to and from EUC-KR, KR, the
- main legacy encoding for Unix machines in Korea.
-
- It was largely written by Mizi Research Inc. Here is the
- copyright statement for the code as it was at the point of
- contribution. The subsequent modifications are covered by
- the usual copyright for Qt.
-
- \legalese
-
- Copyright (C) 1999-2000 Mizi Research Inc. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- \list 1
- \o Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \o Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- \endlist
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- \endlegalese
-*/
-
-/*!
- \page codec-gbk.html
- \title GBK Text Codec
- \ingroup codecs
-
- The GBK codec provides conversion to and from the Chinese
- GB18030/GBK/GB2312 encoding.
-
- GBK, formally the Chinese Internal Code Specification, is a commonly
- used extension of GB 2312-80. Microsoft Windows uses it under the
- name codepage 936.
-
- GBK has been superseded by the new Chinese national standard
- GB 18030-2000, which added a 4-byte encoding while remaining
- compatible with GB2312 and GBK. The new GB 18030-2000 may be described
- as a special encoding of Unicode 3.x and ISO-10646-1.
-
- Special thanks to charset gurus Markus Scherer (IBM),
- Dirk Meyer (Adobe Systems) and Ken Lunde (Adobe Systems) for publishing
- an excellent GB 18030-2000 summary and specification on the Internet.
- Some must-read documents are:
-
- \list
- \o \l{ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/pdf/GB18030_Summary.pdf}
- \o \l{http://oss.software.ibm.com/cvs/icu/~checkout~/charset/source/gb18030/gb18030.html}
- \o \l{http://oss.software.ibm.com/cvs/icu/~checkout~/charset/data/xml/gb-18030-2000.xml}
- \endlist
-
- The GBK codec was contributed to Qt by
- Justin Yu \<justiny@turbolinux.com.cn\> and
- Sean Chen \<seanc@turbolinux.com.cn\>. They may also be reached at
- Yu Mingjian \<yumj@sun.ihep.ac.cn\>, \<yumingjian@china.com\>
- Chen Xiangyang \<chenxy@sun.ihep.ac.cn\>
-
- The GB18030 codec Qt functions were contributed to Qt by
- James Su \<suzhe@gnuchina.org\>, \<suzhe@turbolinux.com.cn\>
- who pioneered much of GB18030 development on GNU/Linux systems.
-
- The GB18030 codec was contributed to Qt by
- Anthony Fok \<anthony@thizlinux.com\>, \<foka@debian.org\>
- using a Perl script to generate C++ tables from gb-18030-2000.xml
- while merging contributions from James Su, Justin Yu and Sean Chen.
- A copy of the source Perl script is available at
- \l{http://people.debian.org/~foka/gb18030/gen-qgb18030codec.pl}
-
- The copyright notice for their code follows:
-
- \legalese
- Copyright (C) 2000 TurboLinux, Inc. Written by Justin Yu and Sean Chen. \BR
- Copyright (C) 2001, 2002 Turbolinux, Inc. Written by James Su. \BR
- Copyright (C) 2001, 2002 ThizLinux Laboratory Ltd. Written by Anthony Fok.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- \list 1
- \o Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \o Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- \endlist
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- \endlegalese
-*/
-
-/*!
- \page codecs-jis.html
- \title ISO 2022-JP (JIS) Text Codec
- \ingroup codecs
-
- The JIS codec provides conversion to and from ISO 2022-JP.
-
- The environment variable \c UNICODEMAP_JP can be used to
- fine-tune the JIS, Shift-JIS, and EUC-JP codecs. The mapping
- names are as for the Japanese XML working group's \link
- http://www.y-adagio.com/public/standards/tr_xml_jpf/toc.htm XML
- Japanese Profile\endlink, because it names and explains all the
- widely used mappings. Here are brief descriptions, written by
- Serika Kurusugawa:
-
- \list
-
- \o "unicode-0.9" or "unicode-0201" for Unicode style. This assumes
- JISX0201 for 0x00-0x7f. (0.9 is a table version of jisx02xx mapping
- used for Unicode 1.1.)
-
- \o "unicode-ascii" This assumes US-ASCII for 0x00-0x7f; some
- chars (JISX0208 0x2140 and JISX0212 0x2237) are different from
- Unicode 1.1 to avoid conflict.
-
- \o "open-19970715-0201" ("open-0201" for convenience) or
- "jisx0221-1995" for JISX0221-JISX0201 style. JIS X 0221 is JIS
- version of Unicode, but a few chars (0x5c, 0x7e, 0x2140, 0x216f,
- 0x2131) are different from Unicode 1.1. This is used when 0x5c is
- treated as YEN SIGN.
-
- \o "open-19970715-ascii" ("open-ascii" for convenience) for
- JISX0221-ASCII style. This is used when 0x5c is treated as REVERSE
- SOLIDUS.
-
- \o "open-19970715-ms" ("open-ms" for convenience) or "cp932" for
- Microsoft Windows style. Windows Code Page 932. Some chars (0x2140,
- 0x2141, 0x2142, 0x215d, 0x2171, 0x2172) are different from Unicode
- 1.1.
-
- \o "jdk1.1.7" for Sun's JDK style. Same as Unicode 1.1, except that
- JIS 0x2140 is mapped to UFF3C. Either ASCII or JISX0201 can be used
- for 0x00-0x7f.
-
- \endlist
-
- In addition, the extensions "nec-vdc", "ibm-vdc" and "udc" are
- supported.
-
- For example, if you want to use Unicode style conversion but with
- NEC's extension, set \c UNICODEMAP_JP to \c {unicode-0.9,
- nec-vdc}. (You will probably need to quote that in a shell
- command.)
-
- Most of the code here was written by Serika Kurusugawa,
- a.k.a. Junji Takagi, and is included in Qt with the author's
- permission and the grateful thanks of the Qt team. Here is
- the copyright statement for that code:
-
- \legalese
-
- Copyright (C) 1999 Serika Kurusugawa. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- \list 1
- \o Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \o Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- \endlist
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS".
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- \endlegalese
-*/
-
-/*!
- \page codec-sjis.html
- \title Shift-JIS Text Codec
- \ingroup codecs
-
- The Shift-JIS codec provides conversion to and from Shift-JIS, an
- encoding of JIS X 0201 Latin, JIS X 0201 Kana and JIS X 0208.
-
- The environment variable \c UNICODEMAP_JP can be used to
- fine-tune the codec. The \l{ISO 2022-JP (JIS) Text Codec}
- documentation describes how to use this variable.
-
- Most of the code here was written by Serika Kurusugawa, a.k.a.
- Junji Takagi, and is included in Qt with the author's permission
- and the grateful thanks of the Qt team. Here is the
- copyright statement for the code as it was at the point of
- contribution. The subsequent modifications are covered by
- the usual copyright for Qt.
-
- \legalese
-
- Copyright (C) 1999 Serika Kurusugawa. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- \list 1
- \o Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \o Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- \endlist
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS".
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- \endlegalese
-*/
-
-/*!
- \page codec-tscii.html
- \title TSCII Text Codec
- \ingroup codecs
-
- The TSCII codec provides conversion to and from the Tamil TSCII
- encoding.
-
- TSCII, formally the Tamil Standard Code Information Interchange
- specification, is a commonly used charset for Tamils. The
- official page for the standard is at
- \link http://www.tamil.net/tscii/ http://www.tamil.net/tscii/\endlink
-
- This codec uses the mapping table found at
- \link http://www.geocities.com/Athens/5180/tsciiset.html
- http://www.geocities.com/Athens/5180/tsciiset.html\endlink.
- Tamil uses composed Unicode which might cause some
- problems if you are using Unicode fonts instead of TSCII fonts.
-
- Most of the code was written by Hans Petter Bieker and is
- included in Qt with the author's permission and the grateful
- thanks of the Qt team. Here is the copyright statement for
- the code as it was at the point of contribution. The
- subsequent modifications are covered by the usual copyright for
- Qt:
-
- \legalese
-
- Copyright (c) 2000 Hans Petter Bieker. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- \list 1
- \o Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \o Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- \endlist
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- \endlegalese
-*/
diff --git a/doc/src/commercialeditions.qdoc b/doc/src/commercialeditions.qdoc
deleted file mode 100644
index 3e210518..0000000
--- a/doc/src/commercialeditions.qdoc
+++ /dev/null
@@ -1,134 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page commercialeditions.html
- \title Qt Commercial Editions
- \ingroup licensing
- \brief Information about the license and features of the Commercial Edition.
-
- \keyword Qt Full Framework Edition
- \keyword Qt GUI Framework Edition
-
- Two editions of Qt are available under a commercial license:
- Qt GUI Framework Edition, and Qt Full Framework Edition.
-
- If you want to develop Free or Open Source software for release using a recognized
- Open Source license, you can use the \l{Open Source Versions of Qt}.
-
- The table below summarizes the differences between the two commercial editions:
-
- \table 75%
- \header \o{1,2} Features \o{2,1} Editions
- \header \o Qt GUI Framework \o Qt Full Framework
- \row \o \l{QtCore}{Qt Core classes (QtCore)} \o \bold{X} \o \bold{X}
- \row \o \l{QtGui}{Qt GUI classes (QtGui)} \o \bold{(X)} \o \bold{X}
- \row \o \l{Graphics View Classes} (part of QtGui) \o \o \bold{X}
- \row \o \l{QtNetwork}{Networking (QtNetwork)} \o \o \bold{X}
- \row \o \l{QtOpenGL}{OpenGL (QtOpenGL)} \o \o \bold{X}
- \row \o \l{QtScript}{Scripting (QtScript)} \o \o \bold{X}
- \row \o \l{QtScriptTools}{Script Debugging (QtScriptTools)}\o \o \bold{X}
- \row \o \l{QtSql}{Database/SQL (QtSql)} \o \o \bold{X}
- \row \o \l{QtSvg}{SVG (QtSvg)} \o \o \bold{X}
- \row \o \l{QtWebKit}{WebKit integration (QtWebKit)} \o \o \bold{X}
- \row \o \l{QtXml}{XML (QtXml)} \o \o \bold{X}
- \row \o \l{QtXmlPatterns}{XQuery and XPath (QtXmlPatterns)}\o \o \bold{X}
- \row \o \l{Qt3Support}{Qt 3 Support (Qt3Support)} \o \bold{(X)} \o \bold{X}
- \row \o \l{QtHelp}{Help system (QtHelp)} \o \o \bold{X}
- \row \o \l{QtDBus}{D-Bus IPC support (QtDBus)} \o \bold{X} \o \bold{X}
- \row \o \l{QtDesigner}{\QD extension classes (QtDesigner)} \o \o \bold{X}
- \row \o \l{QtTest}{Unit testing framework (QtTest)} \o \bold{X} \o \bold{X}
- \row \o \l{QtUiTools}{Run-time form handling (QtUiTools)} \o \o \bold{X}
- \row \o \l{Phonon Module}{Phonon Multimedia Framework} \o \o \bold{X}
- \row \o \l{ActiveQt} \o \o \bold{<X>}
- \endtable
-
- \bold{(X)} The Qt GUI Framework Edition contains selected classes from the QtGui and
- Qt3Support modules corresponding to the functionality available in the Qt 3 Professional
- Edition.
-
- \bold{<X>} The ActiveQt module is only available on Windows.
-
- Lists of the classes available in each edition are available on the
- following pages:
-
- \list
- \o \l{Qt GUI Framework Edition Classes}
- \o \l{Qt Full Framework Edition Classes}
- \endlist
-
- Please see the \l{Supported Platforms}{list of supported
- platforms} for up-to-date information about the various platforms
- and compilers that Qt supports.
-
- On the Qt web site, you can find a
- \l{Qt Licensing Overview} and information on \l{Qt License Pricing}
- for commercial editions of Qt and other Qt-related products.
-
- To purchase, please visit the \l{How to Order}{online order
- form}.
-
- For further information and assistance, please contact Qt
- sales.
-
- Web: http://qt.nokia.com/contact.
-
- Phone, U.S. office (for North America): \bold{1-650-813-1676}.
-
- Phone, Norway office (for the rest of the world): \bold{+47 21 60
- 48 00}.
-*/
-
-/*!
- \page full-framework-edition-classes.html
- \title Qt Full Framework Edition Classes
- \ingroup classlists
-
- \generatelist{classesbyedition Desktop}
-*/
-
-/*!
- \page gui-framework-edition-classes.html
- \title Qt GUI Framework Edition Classes
- \ingroup classlists
-
- \generatelist{classesbyedition DesktopLight}
-*/
diff --git a/doc/src/compatclasses.qdoc b/doc/src/compatclasses.qdoc
deleted file mode 100644
index b8356de..0000000
--- a/doc/src/compatclasses.qdoc
+++ /dev/null
@@ -1,54 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page compatclasses.html
- \title Qt 3 Compatibility Classes
- \ingroup classlists
-
- This is a list of the classes that Qt provides for compatibility
- with Qt 3. The vast majority of these are provided by the
- Qt3Support module.
-
- \generatelist compatclasses
-
- \sa {Qt's Classes}, {Qt's Modules}
-*/
diff --git a/doc/src/containers.qdoc b/doc/src/containers.qdoc
deleted file mode 100644
index dccf0b7..0000000
--- a/doc/src/containers.qdoc
+++ /dev/null
@@ -1,775 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \group containers
- \title Generic Containers
- \ingroup architecture
- \ingroup groups
- \keyword container class
- \keyword container classes
-
- \brief Qt's template-based container classes.
-
- \tableofcontents
-
- \section1 Introduction
-
- The Qt library provides a set of general purpose template-based
- container classes. These classes can be used to store items of a
- specified type. For example, if you need a resizable array of
- \l{QString}s, use QVector<QString>.
-
- These container classes are designed to be lighter, safer, and
- easier to use than the STL containers. If you are unfamiliar with
- the STL, or prefer to do things the "Qt way", you can use these
- classes instead of the STL classes.
-
- The container classes are \l{implicitly shared}, they are
- \l{reentrant}, and they are optimized for speed, low memory
- consumption, and minimal inline code expansion, resulting in
- smaller executables. In addition, they are \l{thread-safe}
- in situations where they are used as read-only containers
- by all threads used to access them.
-
- For traversing the items stored in a container, you can use one
- of two types of iterators: \l{Java-style iterators} and
- \l{STL-style iterators}. The Java-style iterators are easier to
- use and provide high-level functionality, whereas the STL-style
- iterators are slightly more efficient and can be used together
- with Qt's and STL's \l{generic algorithms}.
-
- Qt also offers a \l{foreach} keyword that make it very
- easy to iterate over all the items stored in a container.
-
- \section1 The Container Classes
-
- Qt provides the following container classes:
-
- \table
- \header \o Class \o Summary
-
- \row \o \l{QList}<T>
- \o This is by far the most commonly used container class. It
- stores a list of values of a given type (T) that can be accessed
- by index. Internally, the QList is implemented using an array,
- ensuring that index-based access is very fast.
-
- Items can be added at either end of the list using
- QList::append() and QList::prepend(), or they can be inserted in
- the middle using QList::insert(). More than any other container
- class, QList is highly optimized to expand to as little code as
- possible in the executable. QStringList inherits from
- QList<QString>.
-
- \row \o \l{QLinkedList}<T>
- \o This is similar to QList, except that it uses
- iterators rather than integer indexes to access items. It also
- provides better performance than QList when inserting in the
- middle of a huge list, and it has nicer iterator semantics.
- (Iterators pointing to an item in a QLinkedList remain valid as
- long as the item exists, whereas iterators to a QList can become
- invalid after any insertion or removal.)
-
- \row \o \l{QVector}<T>
- \o This stores an array of values of a given type at adjacent
- positions in memory. Inserting at the front or in the middle of
- a vector can be quite slow, because it can lead to large numbers
- of items having to be moved by one position in memory.
-
- \row \o \l{QStack}<T>
- \o This is a convenience subclass of QVector that provides
- "last in, first out" (LIFO) semantics. It adds the following
- functions to those already present in QVector:
- \l{QStack::push()}{push()}, \l{QStack::pop()}{pop()},
- and \l{QStack::top()}{top()}.
-
- \row \o \l{QQueue}<T>
- \o This is a convenience subclass of QList that provides
- "first in, first out" (FIFO) semantics. It adds the following
- functions to those already present in QList:
- \l{QQueue::enqueue()}{enqueue()},
- \l{QQueue::dequeue()}{dequeue()}, and \l{QQueue::head()}{head()}.
-
- \row \o \l{QSet}<T>
- \o This provides a single-valued mathematical set with fast
- lookups.
-
- \row \o \l{QMap}<Key, T>
- \o This provides a dictionary (associative array) that maps keys
- of type Key to values of type T. Normally each key is associated
- with a single value. QMap stores its data in Key order; if order
- doesn't matter QHash is a faster alternative.
-
- \row \o \l{QMultiMap}<Key, T>
- \o This is a convenience subclass of QMap that provides a nice
- interface for multi-valued maps, i.e. maps where one key can be
- associated with multiple values.
-
- \row \o \l{QHash}<Key, T>
- \o This has almost the same API as QMap, but provides
- significantly faster lookups. QHash stores its data in an
- arbitrary order.
-
- \row \o \l{QMultiHash}<Key, T>
- \o This is a convenience subclass of QHash that
- provides a nice interface for multi-valued hashes.
-
- \endtable
-
- Containers can be nested. For example, it is perfectly possible
- to use a QMap<QString, QList<int> >, where the key type is
- QString and the value type QList<int>. The only pitfall is that
- you must insert a space between the closing angle brackets (>);
- otherwise the C++ compiler will misinterpret the two >'s as a
- right-shift operator (>>) and report a syntax error.
-
- The containers are defined in individual header files with the
- same name as the container (e.g., \c <QLinkedList>). For
- convenience, the containers are forward declared in \c
- <QtContainerFwd>.
-
- \keyword assignable data type
- \keyword assignable data types
-
- The values stored in the various containers can be of any
- \e{assignable data type}. To qualify, a type must provide a
- default constructor, a copy constructor, and an assignment
- operator. This covers most data types you are likely to want to
- store in a container, including basic types such as \c int and \c
- double, pointer types, and Qt data types such as QString, QDate,
- and QTime, but it doesn't cover QObject or any QObject subclass
- (QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a
- QList<QWidget>, the compiler will complain that QWidget's copy
- constructor and assignment operators are disabled. If you want to
- store these kinds of objects in a container, store them as
- pointers, for example as QList<QWidget *>.
-
- Here's an example custom data type that meets the requirement of
- an assignable data type:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 0
-
- If we don't provide a copy constructor or an assignment operator,
- C++ provides a default implementation that performs a
- member-by-member copy. In the example above, that would have been
- sufficient. Also, if you don't provide any constructors, C++
- provides a default constructor that initializes its member using
- default constructors. Although it doesn't provide any
- explicit constructors or assignment operator, the following data
- type can be stored in a container:
-
- \snippet doc/src/snippets/streaming/main.cpp 0
-
- Some containers have additional requirements for the data types
- they can store. For example, the Key type of a QMap<Key, T> must
- provide \c operator<(). Such special requirements are documented
- in a class's detailed description. In some cases, specific
- functions have special requirements; these are described on a
- per-function basis. The compiler will always emit an error if a
- requirement isn't met.
-
- Qt's containers provide operator<<() and operator>>() so that they
- can easily be read and written using a QDataStream. This means
- that the data types stored in the container must also support
- operator<<() and operator>>(). Providing such support is
- straightforward; here's how we could do it for the Movie struct
- above:
-
- \snippet doc/src/snippets/streaming/main.cpp 1
- \codeline
- \snippet doc/src/snippets/streaming/main.cpp 2
-
- \keyword default-constructed values
-
- The documentation of certain container class functions refer to
- \e{default-constructed values}; for example, QVector
- automatically initializes its items with default-constructed
- values, and QMap::value() returns a default-constructed value if
- the specified key isn't in the map. For most value types, this
- simply means that a value is created using the default
- constructor (e.g. an empty string for QString). But for primitive
- types like \c{int} and \c{double}, as well as for pointer types,
- the C++ language doesn't specify any initialization; in those
- cases, Qt's containers automatically initialize the value to 0.
-
- \section1 The Iterator Classes
-
- Iterators provide a uniform means to access items in a container.
- Qt's container classes provide two types of iterators: Java-style
- iterators and STL-style iterators.
-
- \section2 Java-Style Iterators
-
- The Java-style iterators are new in Qt 4 and are the standard
- ones used in Qt applications. They are more convenient to use than
- the STL-style iterators, at the price of being slightly less
- efficient. Their API is modelled on Java's iterator classes.
-
- For each container class, there are two Java-style iterator data
- types: one that provides read-only access and one that provides
- read-write access.
-
- \table
- \header \o Containers \o Read-only iterator
- \o Read-write iterator
- \row \o QList<T>, QQueue<T> \o QListIterator<T>
- \o QMutableListIterator<T>
- \row \o QLinkedList<T> \o QLinkedListIterator<T>
- \o QMutableLinkedListIterator<T>
- \row \o QVector<T>, QStack<T> \o QVectorIterator<T>
- \o QMutableVectorIterator<T>
- \row \o QSet<T> \o QSetIterator<T>
- \o QMutableSetIterator<T>
- \row \o QMap<Key, T>, QMultiMap<Key, T> \o QMapIterator<Key, T>
- \o QMutableMapIterator<Key, T>
- \row \o QHash<Key, T>, QMultiHash<Key, T> \o QHashIterator<Key, T>
- \o QMutableHashIterator<Key, T>
- \endtable
-
- In this discussion, we will concentrate on QList and QMap. The
- iterator types for QLinkedList, QVector, and QSet have exactly
- the same interface as QList's iterators; similarly, the iterator
- types for QHash have the same interface as QMap's iterators.
-
- Unlike STL-style iterators (covered \l{STL-style
- iterators}{below}), Java-style iterators point \e between items
- rather than directly \e at items. For this reason, they are
- either pointing to the very beginning of the container (before
- the first item), at the very end of the container (after the last
- item), or between two items. The diagram below shows the valid
- iterator positions as red arrows for a list containing four
- items:
-
- \img javaiterators1.png
-
- Here's a typical loop for iterating through all the elements of a
- QList<QString> in order and printing them to the console:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 1
-
- It works as follows: The QList to iterate over is passed to the
- QListIterator constructor. At that point, the iterator is located
- just in front of the first item in the list (before item "A").
- Then we call \l{QListIterator::hasNext()}{hasNext()} to
- check whether there is an item after the iterator. If there is, we
- call \l{QListIterator::next()}{next()} to jump over that
- item. The next() function returns the item that it jumps over. For
- a QList<QString>, that item is of type QString.
-
- Here's how to iterate backward in a QList:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 2
-
- The code is symmetric with iterating forward, except that we
- start by calling \l{QListIterator::toBack()}{toBack()}
- to move the iterator after the last item in the list.
-
- The diagram below illustrates the effect of calling
- \l{QListIterator::next()}{next()} and
- \l{QListIterator::previous()}{previous()} on an iterator:
-
- \img javaiterators2.png
-
- The following table summarizes the QListIterator API:
-
- \table
- \header \o Function \o Behavior
- \row \o \l{QListIterator::toFront()}{toFront()}
- \o Moves the iterator to the front of the list (before the first item)
- \row \o \l{QListIterator::toBack()}{toBack()}
- \o Moves the iterator to the back of the list (after the last item)
- \row \o \l{QListIterator::hasNext()}{hasNext()}
- \o Returns true if the iterator isn't at the back of the list
- \row \o \l{QListIterator::next()}{next()}
- \o Returns the next item and advances the iterator by one position
- \row \o \l{QListIterator::peekNext()}{peekNext()}
- \o Returns the next item without moving the iterator
- \row \o \l{QListIterator::hasPrevious()}{hasPrevious()}
- \o Returns true if the iterator isn't at the front of the list
- \row \o \l{QListIterator::previous()}{previous()}
- \o Returns the previous item and moves the iterator back by one position
- \row \o \l{QListIterator::peekPrevious()}{peekPrevious()}
- \o Returns the previous item without moving the iterator
- \endtable
-
- QListIterator provides no functions to insert or remove items
- from the list as we iterate. To accomplish this, you must use
- QMutableListIterator. Here's an example where we remove all
- odd numbers from a QList<int> using QMutableListIterator:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 3
-
- The next() call in the loop is made every time. It jumps over the
- next item in the list. The
- \l{QMutableListIterator::remove()}{remove()} function removes the
- last item that we jumped over from the list. The call to
- \l{QMutableListIterator::remove()}{remove()} does not invalidate
- the iterator, so it is safe to continue using it. This works just
- as well when iterating backward:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 4
-
- If we just want to modify the value of an existing item, we can
- use \l{QMutableListIterator::setValue()}{setValue()}. In the code
- below, we replace any value larger than 128 with 128:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 5
-
- Just like \l{QMutableListIterator::remove()}{remove()},
- \l{QMutableListIterator::setValue()}{setValue()} operates on the
- last item that we jumped over. If we iterate forward, this is the
- item just before the iterator; if we iterate backward, this is
- the item just after the iterator.
-
- The \l{QMutableListIterator::next()}{next()} function returns a
- non-const reference to the item in the list. For simple
- operations, we don't even need
- \l{QMutableListIterator::setValue()}{setValue()}:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 6
-
- As mentioned above, QLinkedList's, QVector's, and QSet's iterator
- classes have exactly the same API as QList's. We will now turn to
- QMapIterator, which is somewhat different because it iterates on
- (key, value) pairs.
-
- Like QListIterator, QMapIterator provides
- \l{QMapIterator::toFront()}{toFront()},
- \l{QMapIterator::toBack()}{toBack()},
- \l{QMapIterator::hasNext()}{hasNext()},
- \l{QMapIterator::next()}{next()},
- \l{QMapIterator::peekNext()}{peekNext()},
- \l{QMapIterator::hasPrevious()}{hasPrevious()},
- \l{QMapIterator::previous()}{previous()}, and
- \l{QMapIterator::peekPrevious()}{peekPrevious()}. The key and
- value components are extracted by calling key() and value() on
- the object returned by next(), peekNext(), previous(), or
- peekPrevious().
-
- The following example removes all (capital, country) pairs where
- the capital's name ends with "City":
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 7
-
- QMapIterator also provides a key() and a value() function that
- operate directly on the iterator and that return the key and
- value of the last item that the iterator jumped above. For
- example, the following code copies the contents of a QMap into a
- QHash:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 8
-
- If we want to iterate through all the items with the same
- value, we can use \l{QMapIterator::findNext()}{findNext()}
- or \l{QMapIterator::findPrevious()}{findPrevious()}.
- Here's an example where we remove all the items with a particular
- value:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 9
-
- \section2 STL-Style Iterators
-
- STL-style iterators have been available since the release of Qt
- 2.0. They are compatible with Qt's and STL's \l{generic
- algorithms} and are optimized for speed.
-
- For each container class, there are two STL-style iterator types:
- one that provides read-only access and one that provides
- read-write access. Read-only iterators should be used wherever
- possible because they are faster than read-write iterators.
-
- \table
- \header \o Containers \o Read-only iterator
- \o Read-write iterator
- \row \o QList<T>, QQueue<T> \o QList<T>::const_iterator
- \o QList<T>::iterator
- \row \o QLinkedList<T> \o QLinkedList<T>::const_iterator
- \o QLinkedList<T>::iterator
- \row \o QVector<T>, QStack<T> \o QVector<T>::const_iterator
- \o QVector<T>::iterator
- \row \o QSet<T> \o QSet<T>::const_iterator
- \o QSet<T>::iterator
- \row \o QMap<Key, T>, QMultiMap<Key, T> \o QMap<Key, T>::const_iterator
- \o QMap<Key, T>::iterator
- \row \o QHash<Key, T>, QMultiHash<Key, T> \o QHash<Key, T>::const_iterator
- \o QHash<Key, T>::iterator
- \endtable
-
- The API of the STL iterators is modelled on pointers in an array.
- For example, the \c ++ operator advances the iterator to the next
- item, and the \c * operator returns the item that the iterator
- points to. In fact, for QVector and QStack, which store their
- items at adjacent memory positions, the
- \l{QVector::iterator}{iterator} type is just a typedef for \c{T *},
- and the \l{QVector::iterator}{const_iterator} type is
- just a typedef for \c{const T *}.
-
- In this discussion, we will concentrate on QList and QMap. The
- iterator types for QLinkedList, QVector, and QSet have exactly
- the same interface as QList's iterators; similarly, the iterator
- types for QHash have the same interface as QMap's iterators.
-
- Here's a typical loop for iterating through all the elements of a
- QList<QString> in order and converting them to lowercase:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 10
-
- Unlike \l{Java-style iterators}, STL-style iterators point
- directly at items. The begin() function of a container returns an
- iterator that points to the first item in the container. The
- end() function of a container returns an iterator to the
- imaginary item one position past the last item in the container.
- end() marks an invalid position; it must never be dereferenced.
- It is typically used in a loop's break condition. If the list is
- empty, begin() equals end(), so we never execute the loop.
-
- The diagram below shows the valid iterator positions as red
- arrows for a vector containing four items:
-
- \img stliterators1.png
-
- Iterating backward with an STL-style iterator requires us to
- decrement the iterator \e before we access the item. This
- requires a \c while loop:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 11
-
- In the code snippets so far, we used the unary \c * operator to
- retrieve the item (of type QString) stored at a certain iterator
- position, and we then called QString::toLower() on it. Most C++
- compilers also allow us to write \c{i->toLower()}, but some
- don't.
-
- For read-only access, you can use const_iterator, constBegin(),
- and constEnd(). For example:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 12
-
- The following table summarizes the STL-style iterators' API:
-
- \table
- \header \o Expression \o Behavior
- \row \o \c{*i} \o Returns the current item
- \row \o \c{++i} \o Advances the iterator to the next item
- \row \o \c{i += n} \o Advances the iterator by \c n items
- \row \o \c{--i} \o Moves the iterator back by one item
- \row \o \c{i -= n} \o Moves the iterator back by \c n items
- \row \o \c{i - j} \o Returns the number of items between iterators \c i and \c j
- \endtable
-
- The \c{++} and \c{--} operators are available both as prefix
- (\c{++i}, \c{--i}) and postfix (\c{i++}, \c{i--}) operators. The
- prefix versions modify the iterators and return a reference to
- the modified iterator; the postfix versions take a copy of the
- iterator before they modify it, and return that copy. In
- expressions where the return value is ignored, we recommend that
- you use the prefix operators (\c{++i}, \c{--i}), as these are
- slightly faster.
-
- For non-const iterator types, the return value of the unary \c{*}
- operator can be used on the left side of the assignment operator.
-
- For QMap and QHash, the \c{*} operator returns the value
- component of an item. If you want to retrieve the key, call key()
- on the iterator. For symmetry, the iterator types also provide a
- value() function to retrieve the value. For example, here's how
- we would print all items in a QMap to the console:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 13
-
- Thanks to \l{implicit sharing}, it is very inexpensive for a
- function to return a container per value. The Qt API contains
- dozens of functions that return a QList or QStringList per value
- (e.g., QSplitter::sizes()). If you want to iterate over these
- using an STL iterator, you should always take a copy of the
- container and iterate over the copy. For example:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 14
-
- This problem doesn't occur with functions that return a const or
- non-const reference to a container.
-
- \l{Implicit sharing} has another consequence on STL-style
- iterators: You must not take a copy of a container while
- non-const iterators are active on that container. Java-style
- iterators don't suffer from that limitation.
-
- \keyword foreach
- \section1 The foreach Keyword
-
- If you just want to iterate over all the items in a container
- in order, you can use Qt's \c foreach keyword. The keyword is a
- Qt-specific addition to the C++ language, and is implemented
- using the preprocessor.
-
- Its syntax is: \c foreach (\e variable, \e container) \e
- statement. For example, here's how to use \c foreach to iterate
- over a QLinkedList<QString>:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 15
-
- The \c foreach code is significantly shorter than the equivalent
- code that uses iterators:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 16
-
- Unless the data type contains a comma (e.g., \c{QPair<int,
- int>}), the variable used for iteration can be defined within the
- \c foreach statement:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 17
-
- And like any other C++ loop construct, you can use braces around
- the body of a \c foreach loop, and you can use \c break to leave
- the loop:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 18
-
- With QMap and QHash, \c foreach accesses the value component of
- the (key, value) pairs. If you want to iterate over both the keys
- and the values, you can use iterators (which are fastest), or you
- can write code like this:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 19
-
- For a multi-valued map:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 20
-
- Qt automatically takes a copy of the container when it enters a
- \c foreach loop. If you modify the container as you are
- iterating, that won't affect the loop. (If you don't modify the
- container, the copy still takes place, but thanks to \l{implicit
- sharing} copying a container is very fast.) Similarly, declaring
- the variable to be a non-const reference, in order to modify the
- current item in the list will not work either.
-
- In addition to \c foreach, Qt also provides a \c forever
- pseudo-keyword for infinite loops:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 21
-
- If you're worried about namespace pollution, you can disable
- these macros by adding the following line to your \c .pro file:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 22
-
- \section1 Other Container-Like Classes
-
- Qt includes three template classes that resemble containers in
- some respects. These classes don't provide iterators and cannot
- be used with the \c foreach keyword.
-
- \list
- \o QVarLengthArray<T, Prealloc> provides a low-level
- variable-length array. It can be used instead of QVector in
- places where speed is particularly important.
-
- \o QCache<Key, T> provides a cache to store objects of a certain
- type T associated with keys of type Key.
-
- \o QPair<T1, T2> stores a pair of elements.
- \endlist
-
- Additional non-template types that compete with Qt's template
- containers are QBitArray, QByteArray, QString, and QStringList.
-
- \section1 Algorithmic Complexity
-
- Algorithmic complexity is concerned about how fast (or slow) each
- function is as the number of items in the container grow. For
- example, inserting an item in the middle of a QLinkedList is an
- extremely fast operation, irrespective of the number of items
- stored in the QLinkedList. On the other hand, inserting an item
- in the middle of a QVector is potentially very expensive if the
- QVector contains many items, since half of the items must be
- moved one position in memory.
-
- To describe algorithmic complexity, we use the following
- terminology, based on the "big Oh" notation:
-
- \keyword constant time
- \keyword logarithmic time
- \keyword linear time
- \keyword linear-logarithmic time
- \keyword quadratic time
-
- \list
- \o \bold{Constant time:} O(1). A function is said to run in constant
- time if it requires the same amount of time no matter how many
- items are present in the container. One example is
- QLinkedList::insert().
-
- \o \bold{Logarithmic time:} O(log \e n). A function that runs in
- logarithmic time is a function whose running time is
- proportional to the logarithm of the number of items in the
- container. One example is qBinaryFind().
-
- \o \bold{Linear time:} O(\e n). A function that runs in linear time
- will execute in a time directly proportional to the number of
- items stored in the container. One example is
- QVector::insert().
-
- \o \bold{Linear-logarithmic time:} O(\e{n} log \e n). A function
- that runs in linear-logarithmic time is asymptotically slower
- than a linear-time function, but faster than a quadratic-time
- function.
-
- \o \bold{Quadratic time:} O(\e{n}\unicode{178}). A quadratic-time function
- executes in a time that is proportional to the square of the
- number of items stored in the container.
- \endlist
-
- The following table summarizes the algorithmic complexity of Qt's
- sequential container classes:
-
- \table
- \header \o \o Index lookup \o Insertion \o Prepending \o Appending
- \row \o QLinkedList<T> \o O(\e n) \o O(1) \o O(1) \o O(1)
- \row \o QList<T> \o O(1) \o O(n) \o Amort. O(1) \o Amort. O(1)
- \row \o QVector<T> \o O(1) \o O(n) \o O(n) \o Amort. O(1)
- \endtable
-
- In the table, "Amort." stands for "amortized behavior". For
- example, "Amort. O(1)" means that if you call the function
- only once, you might get O(\e n) behavior, but if you call it
- multiple times (e.g., \e n times), the average behavior will be
- O(1).
-
- The following table summarizes the algorithmic complexity of Qt's
- associative containers and sets:
-
- \table
- \header \o{1,2} \o{2,1} Key lookup \o{2,1} Insertion
- \header \o Average \o Worst case \o Average \o Worst case
- \row \o QMap<Key, T> \o O(log \e n) \o O(log \e n) \o O(log \e n) \o O(log \e n)
- \row \o QMultiMap<Key, T> \o O((log \e n) \o O(log \e n) \o O(log \e n) \o O(log \e n)
- \row \o QHash<Key, T> \o Amort. O(1) \o O(\e n) \o Amort. O(1) \o O(\e n)
- \row \o QSet<Key> \o Amort. O(1) \o O(\e n) \o Amort. O(1) \o O(\e n)
- \endtable
-
- With QVector, QHash, and QSet, the performance of appending items
- is amortized O(log \e n). It can be brought down to O(1) by
- calling QVector::reserve(), QHash::reserve(), or QSet::reserve()
- with the expected number of items before you insert the items.
- The next section discusses this topic in more depth.
-
- \section1 Growth Strategies
-
- QVector<T>, QString, and QByteArray store their items
- contiguously in memory; QList<T> maintains an array of pointers
- to the items it stores to provide fast index-based access (unless
- T is a pointer type or a basic type of the size of a pointer, in
- which case the value itself is stored in the array); QHash<Key,
- T> keeps a hash table whose size is proportional to the number
- of items in the hash. To avoid reallocating the data every single
- time an item is added at the end of the container, these classes
- typically allocate more memory than necessary.
-
- Consider the following code, which builds a QString from another
- QString:
-
- \snippet doc/src/snippets/code/doc_src_containers.qdoc 23
-
- We build the string \c out dynamically by appending one character
- to it at a time. Let's assume that we append 15000 characters to
- the QString string. Then the following 18 reallocations (out of a
- possible 15000) occur when QString runs out of space: 4, 8, 12,
- 16, 20, 52, 116, 244, 500, 1012, 2036, 4084, 6132, 8180, 10228,
- 12276, 14324, 16372. At the end, the QString has 16372 Unicode
- characters allocated, 15000 of which are occupied.
-
- The values above may seem a bit strange, but here are the guiding
- principles:
- \list
- \o QString allocates 4 characters at a time until it reaches size 20.
- \o From 20 to 4084, it advances by doubling the size each time.
- More precisely, it advances to the next power of two, minus
- 12. (Some memory allocators perform worst when requested exact
- powers of two, because they use a few bytes per block for
- book-keeping.)
- \o From 4084 on, it advances by blocks of 2048 characters (4096
- bytes). This makes sense because modern operating systems
- don't copy the entire data when reallocating a buffer; the
- physical memory pages are simply reordered, and only the data
- on the first and last pages actually needs to be copied.
- \endlist
-
- QByteArray and QList<T> use more or less the same algorithm as
- QString.
-
- QVector<T> also uses that algorithm for data types that can be
- moved around in memory using memcpy() (including the basic C++
- types, the pointer types, and Qt's \l{shared classes}) but uses a
- different algorithm for data types that can only be moved by
- calling the copy constructor and a destructor. Since the cost of
- reallocating is higher in that case, QVector<T> reduces the
- number of reallocations by always doubling the memory when
- running out of space.
-
- QHash<Key, T> is a totally different case. QHash's internal hash
- table grows by powers of two, and each time it grows, the items
- are relocated in a new bucket, computed as qHash(\e key) %
- QHash::capacity() (the number of buckets). This remark applies to
- QSet<T> and QCache<Key, T> as well.
-
- For most applications, the default growing algorithm provided by
- Qt does the trick. If you need more control, QVector<T>,
- QHash<Key, T>, QSet<T>, QString, and QByteArray provide a trio of
- functions that allow you to check and specify how much memory to
- use to store the items:
-
- \list
- \o \l{QString::capacity()}{capacity()} returns the
- number of items for which memory is allocated (for QHash and
- QSet, the number of buckets in the hash table).
- \o \l{QString::reserve()}{reserve}(\e size) explicitly
- preallocates memory for \e size items.
- \o \l{QString::squeeze()}{squeeze()} frees any memory
- not required to store the items.
- \endlist
-
- If you know approximately how many items you will store in a
- container, you can start by calling reserve(), and when you are
- done populating the container, you can call squeeze() to release
- the extra preallocated memory.
-*/
diff --git a/doc/src/coordsys.qdoc b/doc/src/coordsys.qdoc
deleted file mode 100644
index c31228f..0000000
--- a/doc/src/coordsys.qdoc
+++ /dev/null
@@ -1,486 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Qt Coordinate System Documentation.
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \page coordsys.html
- \title The Coordinate System
- \ingroup architecture
- \brief Information about the coordinate system used by the paint
- system.
-
- The coordinate system is controlled by the QPainter
- class. Together with the QPaintDevice and QPaintEngine classes,
- QPainter form the basis of Qt's painting system, Arthur. QPainter
- is used to perform drawing operations, QPaintDevice is an
- abstraction of a two-dimensional space that can be painted on
- using a QPainter, and QPaintEngine provides the interface that the
- painter uses to draw onto different types of devices.
-
- The QPaintDevice class is the base class of objects that can be
- painted: Its drawing capabilities are inherited by the QWidget,
- QPixmap, QPicture, QImage, and QPrinter classes. The default
- coordinate system of a paint device has its origin at the top-left
- corner. The \e x values increase to the right and the \e y values
- increase downwards. The default unit is one pixel on pixel-based
- devices and one point (1/72 of an inch) on printers.
-
- The mapping of the logical QPainter coordinates to the physical
- QPaintDevice coordinates are handled by QPainter's transformation
- matrix, viewport and "window". The logical and physical coordinate
- systems coincide by default. QPainter also supports coordinate
- transformations (e.g. rotation and scaling).
-
- \tableofcontents
-
- \section1 Rendering
-
- \section2 Logical Representation
-
- The size (width and height) of a graphics primitive always
- correspond to its mathematical model, ignoring the width of the
- pen it is rendered with:
-
- \table
- \row
- \o \inlineimage coordinatesystem-rect.png
- \o \inlineimage coordinatesystem-line.png
- \row
- \o QRect(1, 2, 6, 4)
- \o QLine(2, 7, 6, 1)
- \endtable
-
- \section2 Aliased Painting
-
- When drawing, the pixel rendering is controlled by the
- QPainter::Antialiasing render hint.
-
- The \l {QPainter::RenderHint}{RenderHint} enum is used to specify
- flags to QPainter that may or may not be respected by any given
- engine. The QPainter::Antialiasing value indicates that the engine
- should antialias edges of primitives if possible, i.e. smoothing
- the edges by using different color intensities.
-
- But by default the painter is \e aliased and other rules apply:
- When rendering with a one pixel wide pen the pixels will be
- rendered to the \e {right and below the mathematically defined
- points}. For example:
-
- \table
- \row
- \o \inlineimage coordinatesystem-rect-raster.png
- \o \inlineimage coordinatesystem-line-raster.png
-
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 0
-
- \o
- \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 1
- \endtable
-
- When rendering with a pen with an even number of pixels, the
- pixels will be rendered symetrically around the mathematical
- defined points, while rendering with a pen with an odd number of
- pixels, the spare pixel will be rendered to the right and below
- the mathematical point as in the one pixel case. See the QRectF
- diagrams below for concrete examples.
-
- \table
- \header
- \o {3,1} QRectF
- \row
- \o \inlineimage qrect-diagram-zero.png
- \o \inlineimage qrectf-diagram-one.png
- \row
- \o Logical representation
- \o One pixel wide pen
- \row
- \o \inlineimage qrectf-diagram-two.png
- \o \inlineimage qrectf-diagram-three.png
- \row
- \o Two pixel wide pen
- \o Three pixel wide pen
- \endtable
-
- Note that for historical reasons the return value of the
- QRect::right() and QRect::bottom() functions deviate from the true
- bottom-right corner of the rectangle.
-
- QRect's \l {QRect::right()}{right()} function returns \l
- {QRect::left()}{left()} + \l {QRect::width()}{width()} - 1 and the
- \l {QRect::bottom()}{bottom()} function returns \l
- {QRect::top()}{top()} + \l {QRect::height()}{height()} - 1. The
- bottom-right green point in the diagrams shows the return
- coordinates of these functions.
-
- We recommend that you simply use QRectF instead: The QRectF class
- defines a rectangle in the plane using floating point coordinates
- for accuracy (QRect uses integer coordinates), and the
- QRectF::right() and QRectF::bottom() functions \e do return the
- true bottom-right corner.
-
- Alternatively, using QRect, apply \l {QRect::x()}{x()} + \l
- {QRect::width()}{width()} and \l {QRect::y()}{y()} + \l
- {QRect::height()}{height()} to find the bottom-right corner, and
- avoid the \l {QRect::right()}{right()} and \l
- {QRect::bottom()}{bottom()} functions.
-
- \section2 Anti-aliased Painting
-
- If you set QPainter's \l {QPainter::Antialiasing}{anti-aliasing}
- render hint, the pixels will be rendered symetrically on both
- sides of the mathematically defined points:
-
- \table
- \row
- \o \inlineimage coordinatesystem-rect-antialias.png
- \o \inlineimage coordinatesystem-line-antialias.png
- \row
- \o
-
- \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 2
-
- \o
- \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 3
- \endtable
-
- \section1 Transformations
-
- By default, the QPainter operates on the associated device's own
- coordinate system, but it also has complete support for affine
- coordinate transformations.
-
- You can scale the coordinate system by a given offset using the
- QPainter::scale() function, you can rotate it clockwise using the
- QPainter::rotate() function and you can translate it (i.e. adding
- a given offset to the points) using the QPainter::translate()
- function.
-
- \table
- \row
- \o \inlineimage qpainter-clock.png
- \o \inlineimage qpainter-rotation.png
- \o \inlineimage qpainter-scale.png
- \o \inlineimage qpainter-translation.png
- \row
- \o nop
- \o \l {QPainter::rotate()}{rotate()}
- \o \l {QPainter::scale()}{scale()}
- \o \l {QPainter::translate()}{translate()}
- \endtable
-
- You can also twist the coordinate system around the origin using
- the QPainter::shear() function. See the \l {demos/affine}{Affine
- Transformations} demo for a visualization of a sheared coordinate
- system. All the transformation operations operate on QPainter's
- transformation matrix that you can retrieve using the
- QPainter::worldMatrix() function. A matrix transforms a point in the
- plane to another point.
-
- If you need the same transformations over and over, you can also
- use QMatrix objects and the QPainter::worldMatrix() and
- QPainter::setWorldMatrix() functions. You can at any time save the
- QPainter's transformation matrix by calling the QPainter::save()
- function which saves the matrix on an internal stack. The
- QPainter::restore() function pops it back.
-
- One frequent need for the transformation matrix is when reusing
- the same drawing code on a variety of paint devices. Without
- transformations, the results are tightly bound to the resolution
- of the paint device. Printers have high resolution, e.g. 600 dots
- per inch, whereas screens often have between 72 and 100 dots per
- inch.
-
- \table 100%
- \header
- \o {2,1} Analog Clock Example
- \row
- \o \inlineimage coordinatesystem-analogclock.png
- \o
- The Analog Clock example shows how to draw the contents of a
- custom widget using QPainter's transformation matrix.
-
- Qt's example directory provides a complete walk-through of the
- example. Here, we will only review the example's \l
- {QWidget::paintEvent()}{paintEvent()} function to see how we can
- use the transformation matrix (i.e. QPainter's matrix functions)
- to draw the clock's face.
-
- We recommend compiling and running this example before you read
- any further. In particular, try resizing the window to different
- sizes.
-
- \row
- \o {2,1}
-
- \snippet examples/widgets/analogclock/analogclock.cpp 9
-
- First, we set up the painter. We translate the coordinate system
- so that point (0, 0) is in the widget's center, instead of being
- at the top-left corner. We also scale the system by \c side / 100,
- where \c side is either the widget's width or the height,
- whichever is shortest. We want the clock to be square, even if the
- device isn't.
-
- This will give us a 200 x 200 square area, with the origin (0, 0)
- in the center, that we can draw on. What we draw will show up in
- the largest possible square that will fit in the widget.
-
- See also the \l {Window-Viewport Conversion} section.
-
- \snippet examples/widgets/analogclock/analogclock.cpp 18
-
- We draw the clock's hour hand by rotating the coordinate system
- and calling QPainter::drawConvexPolygon(). Thank's to the
- rotation, it's drawn pointed in the right direction.
-
- The polygon is specified as an array of alternating \e x, \e y
- values, stored in the \c hourHand static variable (defined at the
- beginning of the function), which corresponds to the four points
- (2, 0), (0, 2), (-2, 0), and (0, -25).
-
- The calls to QPainter::save() and QPainter::restore() surrounding
- the code guarantees that the code that follows won't be disturbed
- by the transformations we've used.
-
- \snippet examples/widgets/analogclock/analogclock.cpp 24
-
- We do the same for the clock's minute hand, which is defined by
- the four points (1, 0), (0, 1), (-1, 0), and (0, -40). These
- coordinates specify a hand that is thinner and longer than the
- minute hand.
-
- \snippet examples/widgets/analogclock/analogclock.cpp 27
-
- Finally, we draw the clock face, which consists of twelve short
- lines at 30-degree intervals. At the end of that, the painter is
- rotated in a way which isn't very useful, but we're done with
- painting so that doesn't matter.
- \endtable
-
- For a demonstation of Qt's ability to perform affine
- transformations on painting operations, see the \l
- {demos/affine}{Affine Transformations} demo which allows the user
- to experiment with the transformation operations. See also the \l
- {painting/transformations}{Transformations} example which shows
- how transformations influence the way that QPainter renders
- graphics primitives. In particular, it shows how the order of
- transformations affects the result.
-
- For more information about the transformation matrix, see the
- QMatrix documentation.
-
- \section1 Window-Viewport Conversion
-
- When drawing with QPainter, we specify points using logical
- coordinates which then are converted into the physical coordinates
- of the paint device.
-
- The mapping of the logical coordinates to the physical coordinates
- are handled by QPainter's world transformation \l
- {QPainter::worldMatrix()}{worldMatrix()} (described in the \l
- Transformations section), and QPainter's \l
- {QPainter::viewport()}{viewport()} and \l
- {QPainter::window()}{window()}. The viewport represents the
- physical coordinates specifying an arbitrary rectangle. The
- "window" describes the same rectangle in logical coordinates. By
- default the logical and physical coordinate systems coincide, and
- are equivalent to the paint device's rectangle.
-
- Using window-viewport conversion you can make the logical
- coordinate system fit your preferences. The mechanism can also be
- used to make the drawing code independent of the paint device. You
- can, for example, make the logical coordinates extend from (-50,
- -50) to (50, 50) with (0, 0) in the center by calling the
- QPainter::setWindow() function:
-
- \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 4
-
- Now, the logical coordinates (-50,-50) correspond to the paint
- device's physical coordinates (0, 0). Independent of the paint
- device, your painting code will always operate on the specified
- logical coordinates.
-
- By setting the "window" or viewport rectangle, you perform a
- linear transformation of the coordinates. Note that each corner of
- the "window" maps to the corresponding corner of the viewport, and
- vice versa. For that reason it normally is a good idea to let the
- viewport and "window" maintain the same aspect ratio to prevent
- deformation:
-
- \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 5
-
- If we make the logical coordinate system a square, we should also
- make the viewport a square using the QPainter::setViewport()
- function. In the example above we make it equivalent to the
- largest square that fit into the paint device's rectangle. By
- taking the paint device's size into consideration when setting the
- window or viewport, it is possible to keep the drawing code
- independent of the paint device.
-
- Note that the window-viewport conversion is only a linear
- transformation, i.e. it does not perform clipping. This means that
- if you paint outside the currently set "window", your painting is
- still transformed to the viewport using the same linear algebraic
- approach.
-
- \image coordinatesystem-transformations.png
-
- The viewport, "window" and transformation matrix determine how
- logical QPainter coordinates map to the paint device's physical
- coordinates. By default the world transformation matrix is the
- identity matrix, and the "window" and viewport settings are
- equivalent to the paint device's settings, i.e. the world,
- "window" and device coordinate systems are equivalent, but as we
- have seen, the systems can be manipulated using transformation
- operations and window-viewport conversion. The illustration above
- describes the process.
-
- \omit
- \section1 Related Classes
-
- Qt's paint system, Arthur, is primarily based on the QPainter,
- QPaintDevice, and QPaintEngine classes:
-
- \table
- \header \o Class \o Description
- \row
- \o QPainter
- \o
- The QPainter class performs low-level painting on widgets and
- other paint devices. QPainter can operate on any object that
- inherits the QPaintDevice class, using the same code.
- \row
- \o QPaintDevice
- \o
- The QPaintDevice class is the base class of objects that can be
- painted. Qt provides several devices: QWidget, QImage, QPixmap,
- QPrinter and QPicture, and other devices can also be defined by
- subclassing QPaintDevice.
- \row
- \o QPaintEngine
- \o
- The QPaintEngine class provides an abstract definition of how
- QPainter draws to a given device on a given platform. Qt 4
- provides several premade implementations of QPaintEngine for the
- different painter backends we support; it provides one paint
- engine for each supported window system and painting
- frameworkt. You normally don't need to use this class directly.
- \endtable
-
- The 2D transformations of the coordinate system are specified
- using the QMatrix class:
-
- \table
- \header \o Class \o Description
- \row
- \o QMatrix
- \o
- A 3 x 3 transformation matrix. Use QMatrix to rotate, shear,
- scale, or translate the coordinate system.
- \endtable
-
- In addition Qt provides several graphics primitive classes. Some
- of these classes exist in two versions: an \c{int}-based version
- and a \c{qreal}-based version. For these, the \c qreal version's
- name is suffixed with an \c F.
-
- \table
- \header \o Class \o Description
- \row
- \o \l{QPoint}(\l{QPointF}{F})
- \o
- A single 2D point in the coordinate system. Most functions in Qt
- that deal with points can accept either a QPoint, a QPointF, two
- \c{int}s, or two \c{qreal}s.
- \row
- \o \l{QSize}(\l{QSizeF}{F})
- \o
- A single 2D vector. Internally, QPoint and QSize are the same, but
- a point is not the same as a size, so both classes exist. Again,
- most functions accept either QSizeF, a QSize, two \c{int}s, or two
- \c{qreal}s.
- \row
- \o \l{QRect}(\l{QRectF}{F})
- \o
- A 2D rectangle. Most functions accept either a QRectF, a QRect,
- four \c{int}s, or four \c {qreal}s.
- \row
- \o \l{QLine}(\l{QLineF}{F})
- \o
- A 2D finite-length line, characterized by a start point and an end
- point.
- \row
- \o \l{QPolygon}(\l{QPolygonF}{F})
- \o
- A 2D polygon. A polygon is a vector of \c{QPoint(F)}s. If the
- first and last points are the same, the polygon is closed.
- \row
- \o QPainterPath
- \o
- A vectorial specification of a 2D shape. Painter paths are the
- ultimate painting primitive, in the sense that any shape
- (rectange, ellipse, spline) or combination of shapes can be
- expressed as a path. A path specifies both an outline and an area.
- \row
- \o QRegion
- \o
- An area in a paint device, expressed as a list of
- \l{QRect}s. In general, we recommend using the vectorial
- QPainterPath class instead of QRegion for specifying areas,
- because QPainterPath handles painter transformations much better.
- \endtable
- \endomit
-
- \sa {Analog Clock Example}, {Transformations Example}
-*/
diff --git a/doc/src/credits.qdoc b/doc/src/credits.qdoc
index e013b2d..fb6b65d 100644
--- a/doc/src/credits.qdoc
+++ b/doc/src/credits.qdoc
@@ -247,6 +247,7 @@
Mike Perik <mikep at crt.com>\br
Mike Sharkey <msharkey at softarc.com>\br
Mikko Ala-Fossi <mikko.ala-fossi at vaisala.com>\br
+ Milan Burda <milan.burda at gmail.com>\br
Miroslav Flidr <flidr at kky.zcu.cz>\br
Miyata Shigeru <miyata at kusm.kyoto-u.ac.jp>\br
Myron Uecker <muecker at csd.net>\br
diff --git a/doc/src/custom-types.qdoc b/doc/src/custom-types.qdoc
deleted file mode 100644
index 9a637e5..0000000
--- a/doc/src/custom-types.qdoc
+++ /dev/null
@@ -1,178 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page custom-types.html
- \title Creating Custom Qt Types
- \ingroup architecture
- \brief How to create and register new types with Qt.
-
- \tableofcontents
-
- \section1 Overview
-
- When creating user interfaces with Qt, particularly those with specialized controls and
- features, developers sometimes need to create new data types that can be used alongside
- or in place of Qt's existing set of value types.
-
- Standard types such as QSize, QColor and QString can all be stored in QVariant objects,
- used as the types of properties in QObject-based classes, and emitted in signal-slot
- communication.
-
- In this document, we take a custom type and describe how to integrate it into Qt's object
- model so that it can be stored in the same way as standard Qt types. We then show how to
- register the custom type to allow it to be used in signals and slots connections.
-
- \section1 Creating a Custom Type
-
- Before we begin, we need to ensure that the custom type we are creating meets all the
- requirements imposed by QMetaType. In other words, it must provide:
-
- \list
- \o a public default constructor,
- \o a public copy constructor, and
- \o a public destructor.
- \endlist
-
- The following \c Message class definition includes these members:
-
- \snippet examples/tools/customtype/message.h custom type definition
-
- The class also provides a constructor for normal use and two public member functions
- that are used to obtain the private data.
-
- \section1 Declaring the Type with QMetaType
-
- The \c Message class only needs a suitable implementation in order to be usable.
- However, Qt's type system will not be able to understand how to store, retrieve
- and serialize instances of this class without some assistance. For example, we
- will be unable to store \c Message values in QVariant.
-
- The class in Qt responsible for custom types is QMetaType. To make the type known
- to this class, we invoke the Q_DECLARE_METATYPE() macro on the class in the header
- file where it is defined:
-
- \snippet examples/tools/customtype/message.h custom type meta-type declaration
-
- This now makes it possible for \c Message values to be stored in QVariant objects
- and retrieved later. See the \l{Custom Type Example} for code that demonstrates
- this.
-
- The Q_DECLARE_METATYPE() macro also makes it possible for these values to be used as
- arguments to signals, but \e{only in direct signal-slot connections}.
- To make the custom type generally usable with the signals and slots mechanism, we
- need to perform some extra work.
-
- \section1 Creating and Destroying Custom Objects
-
- Although the declaration in the previous section makes the type available for use
- in direct signal-slot connections, it cannot be used for queued signal-slot
- connections, such as those that are made between objects in different threads.
- This is because the meta-object system does not know how to handle creation and
- destruction of objects of the custom type at run-time.
-
- To enable creation of objects at run-time, call the qRegisterMetaType() template
- function to register it with the meta-object system. This also makes the type
- available for queued signal-slot communication as long as you call it before you
- make the first connection that uses the type.
-
- The \l{Queued Custom Type Example} declares a \c Block class which is registered
- in the \c{main.cpp} file:
-
- \snippet examples/threads/queuedcustomtype/main.cpp main start
- \dots
- \snippet examples/threads/queuedcustomtype/main.cpp register meta-type for queued communications
- \dots
- \snippet examples/threads/queuedcustomtype/main.cpp main finish
-
- This type is later used in a signal-slot connection in the \c{window.cpp} file:
-
- \snippet examples/threads/queuedcustomtype/window.cpp Window constructor start
- \dots
- \snippet examples/threads/queuedcustomtype/window.cpp connecting signal with custom type
- \dots
- \snippet examples/threads/queuedcustomtype/window.cpp Window constructor finish
-
- If a type is used in a queued connection without being registered, a warning will be
- printed at the console; for example:
-
- \code
- QObject::connect: Cannot queue arguments of type 'Block'
- (Make sure 'Block' is registered using qRegisterMetaType().)
- \endcode
-
- \section1 Making the Type Printable
-
- It is often quite useful to make a custom type printable for debugging purposes,
- as in the following code:
-
- \snippet examples/tools/customtype/main.cpp printing a custom type
-
- This is achieved by creating a streaming operator for the type, which is often
- defined in the header file for that type:
-
- \snippet examples/tools/customtype/message.h custom type streaming operator
-
- The implementation for the \c Message type in the \l{Custom Type Example}
- goes to some effort to make the printable representation as readable as
- possible:
-
- \snippet examples/tools/customtype/message.cpp custom type streaming operator
-
- The output sent to the debug stream can, of course, be made as simple or as
- complicated as you like. Note that the value returned by this function is
- the QDebug object itself, though this is often obtained by calling the
- maybeSpace() member function of QDebug that pads out the stream with space
- characters to make it more readable.
-
- \section1 Further Reading
-
- The Q_DECLARE_METATYPE() macro and qRegisterMetaType() function documentation
- contain more detailed information about their uses and limitations.
-
- The \l{Custom Type Example}{Custom Type},
- \l{Custom Type Sending Example}{Custom Type Sending}
- and \l{Queued Custom Type Example}{Queued Custom Type} examples show how to
- implement a custom type with the features outlined in this document.
-
- The \l{Debugging Techniques} document provides an overview of the debugging
- mechanisms discussed above.
-*/
diff --git a/doc/src/datastreamformat.qdoc b/doc/src/datastreamformat.qdoc
deleted file mode 100644
index 558d87d..0000000
--- a/doc/src/datastreamformat.qdoc
+++ /dev/null
@@ -1,320 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Documentation of the Format of the QDataStream operators.
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \page datastreamformat.html
- \title Format of the QDataStream Operators
- \ingroup architecture
- \brief Representations of data types that can be serialized by QDataStream.
-
- The \l QDataStream allows you to serialize some of the Qt data types.
- The table below lists the data types that QDataStream can serialize
- and how they are represented. The format described below is
- \l{QDataStream::setVersion()}{version 8}.
-
- It is always best to cast integers to a Qt integer type, such as
- qint16 or quint32, when reading and writing. This ensures that
- you always know exactly what size integers you are reading and
- writing, no matter what the underlying platform and architecture
- the application happens to be running on.
-
- \table
- \row \o bool
- \o \list
- \o boolean
- \endlist
- \row \o qint8
- \o \list
- \o signed byte
- \endlist
- \row \o qint16
- \o \list
- \o signed 16-bit integer
- \endlist
- \row \o qint32
- \o \list
- \o signed 32-bit integer
- \endlist
- \row \o qint64
- \o \list
- \o signed 64-bit integer
- \endlist
- \row \o quint8
- \o \list
- \o unsigned byte
- \endlist
- \row \o quint16
- \o \list
- \o unsigned 16-bit integer
- \endlist
- \row \o quint32
- \o \list
- \o unsigned 32-bit integer
- \endlist
- \row \o quint64
- \o \list
- \o unsigned 64-bit integer
- \endlist
- \row \o \c float
- \o \list
- \o 32-bit floating point number using the standard IEEE 754 format
- \endlist
- \row \o \c double
- \o \list
- \o 64-bit floating point number using the standard IEEE 754 format
- \endlist
- \row \o \c {const char *}
- \o \list
- \o The string length (quint32)
- \o The string bytes, excluding the terminating 0
- \endlist
- \row \o QBitArray
- \o \list
- \o The array size (quint32)
- \o The array bits, i.e. (size + 7)/8 bytes
- \endlist
- \row \o QBrush
- \o \list
- \o The brush style (quint8)
- \o The brush color (QColor)
- \o If style is CustomPattern, the brush pixmap (QPixmap)
- \endlist
- \row \o QByteArray
- \o \list
- \o If the byte array is null: 0xFFFFFFFF (quint32)
- \o Otherwise: the array size (quint32) followed by the array bytes, i.e. size bytes
- \endlist
- \row \o \l QColor
- \o \list
- \o Color spec (qint8)
- \o Alpha value (quint16)
- \o Red value (quint16)
- \o Green value (quint16)
- \o Blue value (quint16)
- \o Pad value (quint16)
- \endlist
- \row \o QCursor
- \o \list
- \o Shape ID (qint16)
- \o If shape is BitmapCursor: The bitmap (QPixmap), mask (QPixmap), and hot spot (QPoint)
- \endlist
- \row \o QDate
- \o \list
- \o Julian day (quint32)
- \endlist
- \row \o QDateTime
- \o \list
- \o Date (QDate)
- \o Time (QTime)
- \o 0 for Qt::LocalTime, 1 for Qt::UTC (quint8)
- \endlist
- \row \o QFont
- \o \list
- \o The family (QString)
- \o The point size (qint16)
- \o The style hint (quint8)
- \o The char set (quint8)
- \o The weight (quint8)
- \o The font bits (quint8)
- \endlist
- \row \o QHash<Key, T>
- \o \list
- \o The number of items (quint32)
- \o For all items, the key (Key) and value (T)
- \endlist
- \row \o QIcon
- \o \list
- \o The number of pixmap entries (quint32)
- \o For all pixmap entries:
- \list
- \o The pixmap (QPixmap)
- \o The file name (QString)
- \o The pixmap size (QSize)
- \o The \l{QIcon::Mode}{mode} (quint32)
- \o The \l{QIcon::State}{state} (quint32)
- \endlist
- \endlist
- \row \o QImage
- \o \list
- \o If the image is null a "null image" marker is saved;
- otherwise the image is saved in PNG or BMP format (depending
- on the stream version). If you want control of the format,
- stream the image into a QBuffer (using QImageIO) and stream
- that.
- \endlist
- \row \o QKeySequence
- \o \list
- \o A QList<int>, where each integer is a key in the key sequence
- \endlist
- \row \o QLinkedList<T>
- \o \list
- \o The number of items (quint32)
- \o The items (T)
- \endlist
- \row \o QList<T>
- \o \list
- \o The number of items (quint32)
- \o The items (T)
- \endlist
- \row \o QMap<Key, T>
- \o \list
- \o The number of items (quint32)
- \o For all items, the key (Key) and value (T)
- \endlist
- \row \o QMatrix
- \o \list
- \o m11 (double)
- \o m12 (double)
- \o m21 (double)
- \o m22 (double)
- \o dx (double)
- \o dy (double)
- \endlist
- \row \o QPair<T1, T2>
- \o \list
- \o first (T1)
- \o second (T2)
- \endlist
- \row \o QPalette
- \o The disabled, active, and inactive color groups, each of which consists
- of the following:
- \list
- \o foreground (QBrush)
- \o button (QBrush)
- \o light (QBrush)
- \o midlight (QBrush)
- \o dark (QBrush)
- \o mid (QBrush)
- \o text (QBrush)
- \o brightText (QBrush)
- \o buttonText (QBrush)
- \o base (QBrush)
- \o background (QBrush)
- \o shadow (QBrush)
- \o highlight (QBrush)
- \o highlightedText (QBrush)
- \o link (QBrush)
- \o linkVisited (QBrush)
- \endlist
- \row \o QPen
- \o \list
- \o The pen styles (quint8)
- \o The pen width (quint16)
- \o The pen color (QColor)
- \endlist
- \row \o QPicture
- \o \list
- \o The size of the picture data (quint32)
- \o The raw bytes of picture data (char)
- \endlist
- \row \o QPixmap
- \o \list
- \o Save it as a PNG image.
- \endlist
- \row \o QPoint
- \o \list
- \o The x coordinate (qint32)
- \o The y coordinate (qint32)
- \endlist
- \row \o QRect
- \o \list
- \o left (qint32)
- \o top (qint32)
- \o right (qint32)
- \o bottom (qint32)
- \endlist
- \row \o QRegExp
- \o \list
- \o The regexp pattern (QString)
- \o Case sensitivity (quint8)
- \o Regular expression syntax (quint8)
- \o Minimal matching (quint8)
- \endlist
- \row \o QRegion
- \o \list
- \o The size of the data, i.e. 8 + 16 * (number of rectangles) (quint32)
- \o 10 (qint32)
- \o The number of rectangles (quint32)
- \o The rectangles in sequential order (QRect)
- \endlist
- \row \o QSize
- \o \list
- \o width (qint32)
- \o height (qint32)
- \endlist
- \row \o QString
- \o \list
- \o If the string is null: 0xFFFFFFFF (quint32)
- \o Otherwise: The string length in bytes (quint32) followed by the data in UTF-16
- \endlist
- \row \o QTime
- \o \list
- \o Milliseconds since midnight (quint32)
- \endlist
- \row \o QUrl
- \o \list
- \o Holds an URL (QString)
- \endlist
- \row \o QVariant
- \o \list
- \o The type of the data (quint32)
- \o The null flag (qint8)
- \o The data of the specified type
- \endlist
- \row \o QVector<T>
- \o \list
- \o The number of items (quint32)
- \o The items (T)
- \endlist
- \endtable
-*/
diff --git a/doc/src/debug.qdoc b/doc/src/debug.qdoc
deleted file mode 100644
index 6f48d3c..0000000
--- a/doc/src/debug.qdoc
+++ /dev/null
@@ -1,256 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Qt Debugging Techniques
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \page debug.html
- \title Debugging Techniques
- \ingroup buildsystem
-
- Here we present some useful hints to help you with debugging your
- Qt-based software.
-
- \tableofcontents
-
- \section1 Configuring Qt for Debugging
-
- When \l{Installation}{configuring Qt for installation}, it is possible
- to ensure that it is built to include debug symbols that can make it
- easier to track bugs in applications and libraries. However, on some
- platforms, building Qt in debug mode will cause applications to be larger
- than desirable.
-
- \section2 Debugging in Mac OS X and Xcode
-
- \section3 Debugging With/Without Frameworks
-
- The basic stuff you need to know about debug libraries and
- frameworks is found at developer.apple.com in:
- \l{http://developer.apple.com/technotes/tn2004/tn2124.html#SECDEBUGLIB}
- {Apple Technicle Note TN2124} Qt follows that.
-
- When you build Qt, frameworks are built by default, and inside the
- framework you will find both a release and a debug version (e.g.,
- QtCore and QtCore_debug). If you pass the \c{-no-framework} flag
- when you build Qt, two dylibs are built for each Qt library (e.g.,
- libQtCore.4.dylib and libQtCore_debug.4.dylib).
-
- What happens when you link depends on whether you use frameworks
- or not. We don't see a compelling reason to recommend one over the
- other.
-
- \section4 With Frameworks:
-
- Since the release and debug libraries are inside the framework,
- the app is simply linked against the framework. Then when you run
- in the debugger, you will get either the release version or the
- debug version, depending on whether you set \c{DYLD_IMAGE_SUFFIX}.
- If you don't set it, you get the release version by default (i.e.,
- non _debug). If you set \c{DYLD_IMAGE_SUFFIX=_debug}, you get the
- debug version.
-
- \section4 Without Frameworks:
-
- When you tell \e{qmake} to generate a Makefile with the debug
- config, it will link against the _debug version of the libraries
- and generate debug symbols for the app. Running this program in
- GDB will then work like running GDB on other platforms, and you
- will be able to trace inside Qt.
-
- \section3 Debug Symbols and Size
-
- The amount of space taken up by debug symbols generated by GCC can
- be excessively large. However, with the release of Xcode 2.3 it is
- now possible to use Dwarf symbols which take up a significantly
- smaller amount of space. To enable this feature when configuring
- Qt, pass the \c{-dwarf-2} option to the configure script.
-
- This is not enabled by default because previous versions of Xcode
- will not work with the compiler flag used to implement this
- feature. Mac OS X 10.5 will use dwarf-2 symbols by default.
-
- dwarf-2 symbols contain references to source code, so the size of
- the final debug application should compare favorably to a release
- build.
-
- \omit
- Although it is not necessary to build Qt with debug symbols to use the
- other techniques described in this document, certain features are only
- available when Qt is configured for debugging.
- \endomit
-
- \section1 Command Line Options Recognized by Qt
-
- When you run a Qt application, you can specify several
- command-line options that can help with debugging. These are
- recognized by QApplication.
-
- \table
- \header \o Option \o Description
- \row \o \c -nograb
- \o The application should never grab \link QWidget::grabMouse()
- the mouse\endlink or \link QWidget::grabKeyboard() the
- keyboard \endlink. This option is set by default when the
- program is running in the \c gdb debugger under Linux.
- \row \o \c -dograb
- \o Ignore any implicit or explicit \c{-nograb}. \c -dograb wins over
- \c -nograb even when \c -nograb is last on the command line.
- \row \o \c -sync
- \o Runs the application in X synchronous mode. Synchronous mode
- forces the X server to perform each X client request
- immediately and not use buffer optimization. It makes the
- program easier to debug and often much slower. The \c -sync
- option is only valid for the X11 version of Qt.
- \endtable
-
- \section1 Warning and Debugging Messages
-
- Qt includes four global functions for writing out warning and debug
- text. You can use them for the following purposes:
-
- \list
- \o qDebug() is used for writing custom debug output.
- \o qWarning() is used to report warnings and recoverable errors in
- your application.
- \o qCritical() is used for writing critical error mesages and
- reporting system errors.
- \o qFatal() is used for writing fatal error messages shortly before exiting.
- \endlist
-
- If you include the <QtDebug> header file, the \c qDebug() function
- can also be used as an output stream. For example:
-
- \snippet doc/src/snippets/code/doc_src_debug.qdoc 0
-
- The Qt implementation of these functions prints the text to the
- \c stderr output under Unix/X11 and Mac OS X. With Windows, if it
- is a console application, the text is sent to console; otherwise, it
- is sent to the debugger. You can take over these functions by
- installing a message handler using qInstallMsgHandler().
-
- If the \c QT_FATAL_WARNINGS environment variable is set,
- qWarning() exits after printing the warning message. This makes
- it easy to obtain a backtrace in the debugger.
-
- Both qDebug() and qWarning() are debugging tools. They can be
- compiled away by defining \c QT_NO_DEBUG_OUTPUT and \c
- QT_NO_WARNING_OUTPUT during compilation.
-
- The debugging functions QObject::dumpObjectTree() and
- QObject::dumpObjectInfo() are often useful when an application
- looks or acts strangely. More useful if you use \l{QObject::setObjectName()}{object names}
- than not, but often useful even without names.
-
- \section1 Providing Support for the qDebug() Stream Operator
-
- You can implement the stream operator used by qDebug() to provide
- debugging support for your classes. The class that implements the
- stream is \c QDebug. The functions you need to know about in \c
- QDebug are \c space() and \c nospace(). They both return a debug
- stream; the difference between them is whether a space is inserted
- between each item. Here is an example for a class that represents
- a 2D coordinate.
-
- \snippet doc/src/snippets/qdebug/qdebugsnippet.cpp 0
-
- Integration of custom types with Qt's meta-object system is covered
- in more depth in the \l{Creating Custom Qt Types} document.
-
- \section1 Debugging Macros
-
- The header file \c <QtGlobal> contains some debugging macros and
- \c{#define}s.
-
- Three important macros are:
- \list
- \o \l{Q_ASSERT()}{Q_ASSERT}(cond), where \c cond is a boolean
- expression, writes the warning "ASSERT: '\e{cond}' in file xyz.cpp, line
- 234" and exits if \c cond is false.
- \o \l{Q_ASSERT_X()}{Q_ASSERT_X}(cond, where, what), where \c cond is a
- boolean expression, \c where a location, and \c what a message,
- writes the warning: "ASSERT failure in \c{where}: '\c{what}', file xyz.cpp, line 234"
- and exits if \c cond is false.
- \o \l{Q_CHECK_PTR()}{Q_CHECK_PTR}(ptr), where \c ptr is a pointer.
- Writes the warning "In file xyz.cpp, line 234: Out of memory" and
- exits if \c ptr is 0.
- \endlist
-
- These macros are useful for detecting program errors, e.g. like this:
-
- \snippet doc/src/snippets/code/doc_src_debug.qdoc 1
-
- Q_ASSERT(), Q_ASSERT_X(), and Q_CHECK_PTR() expand to nothing if
- \c QT_NO_DEBUG is defined during compilation. For this reason,
- the arguments to these macro should not have any side-effects.
- Here is an incorrect usage of Q_CHECK_PTR():
-
- \snippet doc/src/snippets/code/doc_src_debug.qdoc 2
-
- If this code is compiled with \c QT_NO_DEBUG defined, the code in
- the Q_CHECK_PTR() expression is not executed and \e alloc returns
- an unitialized pointer.
-
- The Qt library contains hundreds of internal checks that will
- print warning messages when a programming error is detected. We
- therefore recommend that you use a debug version of Qt when
- developing Qt-based software.
-
- \section1 Common Bugs
-
- There is one bug that is so common that it deserves mention here:
- If you include the Q_OBJECT macro in a class declaration and
- run \link moc.html the meta-object compiler\endlink (\c{moc}),
- but forget to link the \c{moc}-generated object code into your
- executable, you will get very confusing error messages. Any link
- error complaining about a lack of \c{vtbl}, \c{_vtbl}, \c{__vtbl}
- or similar is likely to be a result of this problem.
-*/
diff --git a/doc/src/demos.qdoc b/doc/src/demos.qdoc
deleted file mode 100644
index 6db5b07..0000000
--- a/doc/src/demos.qdoc
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page demos.html
- \title Qt Demonstrations
- \brief Information about the demonstration programs provided with Qt.
- \ingroup howto
-
- This is the list of demonstrations in Qt's \c demos directory.
- These are larger and more complicated programs than the
- \l{Qt Examples} and are used to highlight certain features of
- Qt. You can launch any of these programs from the
- \l{Examples and Demos Launcher} application.
-
- If you are new to Qt, and want to start developing applications,
- you should probably start by going through the \l{Tutorials}.
-
- \section1 Painting
-
- \list
- \o \l{demos/composition}{Composition Modes} demonstrates the range of
- composition modes available with Qt.
- \o \l{demos/deform}{Vector Deformation} demonstrates effects that are made
- possible with a vector-oriented paint engine.
- \o \l{demos/gradients}{Gradients} shows the different types of gradients
- that are available in Qt.
- \o \l{demos/pathstroke}{Path Stroking} shows Qt's built-in dash patterns
- and shows how custom patterns can be used to extend the range of
- available patterns.
- \o \l{demos/affine}{Affine Transformations} demonstrates the different
- affine transformations that can be used to influence painting operations.
- \o \l{demos/arthurplugin}{Arthur Plugin} shows the widgets from the
- other painting demos packaged as a custom widget plugin for \QD.
- \endlist
-
- \section1 Item Views
-
- \list
- \o \l{demos/interview}{Interview} shows the same model and selection being
- shared between three different views.
- \o \l{demos/spreadsheet}{Spreadsheet} demonstrates the use of a table view
- as a spreadsheet, using custom delegates to render each item according to
- the type of data it contains.
- \endlist
-
- \section1 SQL
-
- \list
- \o \l{demos/books}{Books} shows how Qt's SQL support and model/view integration
- enables the user to modify the contents of a database without requiring
- knowledge of SQL.
- \o \l{demos/sqlbrowser}{SQL Browser} demonstrates a console for executing SQL
- statements on a live database and provides a data browser for interactively
- visualizing the results.
- \endlist
-
- \section1 Rich Text
-
- \list
- \o \l{demos/textedit}{Text Edit} shows Qt's rich text editing features and provides
- an environment for experimenting with them.
- \endlist
-
- \section1 Main Window
-
- \list
- \o \l{demos/mainwindow}{Main Window} shows Qt's extensive support for main window
- features, such as tool bars, dock windows, and menus.
- \o \l{demos/macmainwindow}{Mac Main Window} shows how to create main window applications that has
- the same appearance as other Mac OS X applications.
- \endlist
-
- \section1 Graphics View
-
- \list
- \o \l{demos/chip}{40000 Chips} uses the
- \l{The Graphics View Framework}{Graphics View} framework to efficiently
- display a large number of individual graphical items on a scrolling canvas,
- highlighting features such as rotation, zooming, level of detail control,
- and item selection.
- \o \l{demos/embeddeddialogs}{Embedded Dialogs} showcases Qt 4.4's \e{Widgets on
- the Canvas} feature by embedding a multitude of fully-working dialogs into a
- scene.
- \o \l{demos/boxes}{Boxes} showcases Qt's OpenGL support and the
- integration with the Graphics View framework.
- \endlist
-
- \section1 Tools
-
- \list
- \o \l{demos/undo}{Undo Framework} demonstrates how Qt's
- \l{Overview of Qt's Undo Framework}{undo framework} is used to
- provide advanced undo/redo functionality.
- \endlist
-
- \section1 QtWebKit
-
- \list
- \o \l{Web Browser} demonstrates how Qt's \l{QtWebKit Module}{WebKit module}
- can be used to implement a small Web browser.
- \endlist
-
- \section1 Phonon
-
- \list
- \o \l{demos/mediaplayer}{Media Player} demonstrates how the \l{Phonon Module} can be
- used to implement a basic media player application.
- \endlist
-
- \note The Phonon demos are currently not available for the MinGW platform.
-
-*/
diff --git a/doc/src/qtdemo.qdoc b/doc/src/demos/qtdemo.qdoc
index 314fa21..314fa21 100644
--- a/doc/src/qtdemo.qdoc
+++ b/doc/src/demos/qtdemo.qdoc
diff --git a/doc/src/demos/sub-attaq.qdoc b/doc/src/demos/sub-attaq.qdoc
new file mode 100644
index 0000000..2d9e9cc
--- /dev/null
+++ b/doc/src/demos/sub-attaq.qdoc
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/sub-attaq
+ \title Sub-Attaq
+
+ This demo shows Qt's ability to combine \l{The Animation Framework}{the animation framework}
+ and \l{The State Machine Framework}{the state machine framework} to create a game.
+
+ \image sub-attaq-demo.png
+
+ The purpose of the game is to destroy all submarines to win the current level.
+ The boat can be controlled using left and right keys. To fire a bomb you can press
+ up and down keys.
+*/
diff --git a/doc/src/deployment.qdoc b/doc/src/deployment.qdoc
deleted file mode 100644
index fa3ed3e..0000000
--- a/doc/src/deployment.qdoc
+++ /dev/null
@@ -1,1476 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \group deployment
- \title Deploying Qt Applications
- \ingroup buildsystem
-
- Deploying an Qt application does not require any C++
- programming. All you need to do is to build Qt and your
- application in release mode, following the procedures described in
- this documentation. We will demonstrate the procedures in terms of
- deploying the \l {tools/plugandpaint}{Plug & Paint} application
- that is provided in Qt's examples directory.
-
- \section1 Static vs. Shared Libraries
-
- There are two ways of deploying an application:
-
- \list
- \o Static Linking
- \o Shared Libraries (Frameworks on Mac)
- \endlist
-
- Static linking results in a stand-alone executable. The advantage
- is that you will only have a few files to deploy. The
- disadvantages are that the executables are large and with no
- flexibility (i.e a new version of the application, or of Qt, will
- require that the deployment process is repeated), and that you
- cannot deploy plugins.
-
- To deploy plugin-based applications, you can use the shared
- library approach. Shared libraries also provide smaller, more
- flexible executables. For example, using the shared library
- approach, the user is able to independently upgrade the Qt library
- used by the application.
-
- Another reason why you might want to use the shared library
- approach, is if you want to use the same Qt libraries for a family
- of applications. In fact, if you download the binary installation
- of Qt, you get Qt as a shared library.
-
- The disadvantage with the shared library approach is that you
- will get more files to deploy. For more information, see
- \l{sharedlibrary.html}{Creating Shared Libraries}.
-
- \section1 Deploying Qt's Libraries
-
- \table
- \header
- \o {4,1} Qt's Libraries
- \row
- \o \l {QtAssistant}
- \o \l {QAxContainer}
- \o \l {QAxServer}
- \o \l {QtCore}
- \row
- \o \l {QtDBus}
- \o \l {QtDesigner}
- \o \l {QtGui}
- \o \l {QtHelp}
- \row
- \o \l {QtNetwork}
- \o \l {QtOpenGL}
- \o \l {QtScript}
- \o \l {QtScriptTools}
- \row
- \o \l {QtSql}
- \o \l {QtSvg}
- \o \l {QtWebKit}
- \o \l {QtXml}
- \row
- \o \l {QtXmlPatterns}
- \o \l {Phonon Module}{Phonon}
- \o \l {Qt3Support}
- \endtable
-
- Since Qt is not a system library, it has to be redistributed along
- with your application; the minimum is to redistribute the run-time
- of the libraries used by the application. Using static linking,
- however, the Qt run-time is compiled into the executable.
-
- In particular, you will need to deploy Qt plugins, such as
- JPEG support or SQL drivers. For more information about plugins,
- see the \l {plugins-howto.html}{How to Create Qt Plugins}
- documentation.
-
- When deploying an application using the shared library approach
- you must ensure that the Qt libraries will use the correct path to
- find the Qt plugins, documentation, translation etc. To do this you
- can use a \c qt.conf file. For more information, see the \l {Using
- qt.conf} documentation.
-
- Depending on configuration, compiler specific libraries must be
- redistributed as well. For more information, see the platform
- specific Application Dependencies sections: \l
- {deployment-x11.html#application-dependencies}{X11}, \l
- {deployment-windows.html#application-dependencies}{Windows}, \l
- {deployment-mac.html#application-dependencies}{Mac}.
-
- \section1 Licensing
-
- Some of Qt's libraries are based on third party libraries that are
- not licensed using the same dual-license model as Qt. As a result,
- care must be taken when deploying applications that use these
- libraries, particularly when the application is statically linked
- to them.
-
- The following table contains an inexhaustive summary of the issues
- you should be aware of.
-
- \table
- \header \o Qt Library \o Dependency
- \o Licensing Issue
- \row \o QtHelp \o CLucene
- \o The version of clucene distributed with Qt is licensed
- under the GNU LGPL version 2.1 or later. This has implications for
- developers of closed source applications. Please see
- \l{QtHelp Module#License Information}{the QtHelp module documentation}
- for more information.
-
- \row \o QtNetwork \o OpenSSL
- \o Some configurations of QtNetwork use OpenSSL at run-time. Deployment
- of OpenSSL libraries is subject to both licensing and export restrictions.
- More information can be found in the \l{Secure Sockets Layer (SSL) Classes}
- documentation.
-
- \row \o QtWebKit \o WebKit
- \o WebKit is licensed under the GNU LGPL version 2 or later.
- This has implications for developers of closed source applications.
- Please see \l{QtWebKit Module#License Information}{the QtWebKit module
- documentation} for more information.
-
- \row \o \l{Phonon Module}{Phonon} \o Phonon
- \o Phonon relies on the native multimedia engines on different platforms.
- Phonon itself is licensed under the GNU LGPL version 2. Please see
- \l{Phonon Module#License Information}{the Phonon module documentation}
- for more information on licensing and the
- \l{Phonon Overview#Backends}{Phonon Overview} for details of the backends
- in use on different platforms.
- \endtable
-
- \section1 Platform-Specific Notes
-
- The procedure of deploying Qt applications is different for the
- various platforms:
-
- \list
- \o \l{Deploying an Application on X11 Platforms}{Qt for X11 Platforms}
- \o \l{Deploying an Application on Windows}{Qt for Windows}
- \o \l{Deploying an Application on Mac OS X}{Qt for Mac OS X}
- \o \l{Deploying Qt for Embedded Linux Applications}{Qt for Embedded Linux}
- \endlist
-
- \sa Installation {Window System Specific Notes}
-*/
-
-/*!
- \page deployment-x11.html
- \contentspage Deploying Qt Applications
-
- \title Deploying an Application on X11 Platforms
- \ingroup deployment
-
- Due to the proliferation of Unix systems (commercial Unices, Linux
- distributions, etc.), deployment on Unix is a complex
- topic. Before we start, be aware that programs compiled for one
- Unix flavor will probably not run on a different Unix system. For
- example, unless you use a cross-compiler, you cannot compile your
- application on Irix and distribute it on AIX.
-
- Contents:
-
- \tableofcontents
-
- This documentation will describe how to determine which files you
- should include in your distribution, and how to make sure that the
- application will find them at run-time. We will demonstrate the
- procedures in terms of deploying the \l {tools/plugandpaint}{Plug
- & Paint} application that is provided in Qt's examples directory.
-
- \section1 Static Linking
-
- Static linking is often the safest and easiest way to distribute
- an application on Unix since it relieves you from the task of
- distributing the Qt libraries and ensuring that they are located
- in the default search path for libraries on the target system.
-
- \section2 Building Qt Statically
-
- To use this approach, you must start by installing a static version
- of the Qt library:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 0
-
- We specify the prefix so that we do not overwrite the existing Qt
- installation. The example above only builds the Qt libraries,
- i.e. the examples and Qt Designer will not be built. When \c make
- is done, you will find the Qt libraries in the \c /path/to/Qt/lib
- directory.
-
- When linking your application against static Qt libraries, note
- that you might need to add more libraries to the \c LIBS line in
- your project file. For more information, see the \l {Application
- Dependencies} section.
-
- \section2 Linking the Application to the Static Version of Qt
-
- Once Qt is built statically, the next step is to regenerate the
- makefile and rebuild the application. First, we must go into the
- directory that contains the application:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 1
-
- Now run qmake to create a new makefile for the application, and do
- a clean build to create the statically linked executable:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 2
-
- You probably want to link against the release libraries, and you
- can specify this when invoking \c qmake. Note that we must set the
- path to the static Qt that we just built.
-
- To check that the application really links statically with Qt, run
- the \c ldd tool (available on most Unices):
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 3
-
- Verify that the Qt libraries are not mentioned in the output.
-
- Now, provided that everything compiled and linked without any
- errors, we should have a \c plugandpaint file that is ready for
- deployment. One easy way to check that the application really can
- be run stand-alone is to copy it to a machine that doesn't have Qt
- or any Qt applications installed, and run it on that machine.
-
- Remember that if your application depends on compiler specific
- libraries, these must still be redistributed along with your
- application. For more information, see the \l {Application
- Dependencies} section.
-
- The \l {tools/plugandpaint}{Plug & Paint} example consists of
- several components: The core application (\l
- {tools/plugandpaint}{Plug & Paint}), and the \l
- {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
- {tools/plugandpaintplugins/extrafilters}{Extra Filters}
- plugins. Since we cannot deploy plugins using the static linking
- approach, the executable we have prepared so far is
- incomplete. The application will run, but the functionality will
- be disabled due to the missing plugins. To deploy plugin-based
- applications we should use the shared library approach.
-
- \section1 Shared Libraries
-
- We have two challenges when deploying the \l
- {tools/plugandpaint}{Plug & Paint} application using the shared
- libraries approach: The Qt runtime has to be correctly
- redistributed along with the application executable, and the
- plugins have to be installed in the correct location on the target
- system so that the application can find them.
-
- \section2 Building Qt as a Shared Library
-
- We assume that you already have installed Qt as a shared library,
- which is the default when installing Qt, in the \c /path/to/Qt
- directory. For more information on how to build Qt, see the \l
- {Installation} documentation.
-
- \section2 Linking the Application to Qt as a Shared Library
-
- After ensuring that Qt is built as a shared library, we can build
- the \l {tools/plugandpaint}{Plug & Paint} application. First, we
- must go into the directory that contains the application:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 4
-
- Now run qmake to create a new makefile for the application, and do
- a clean build to create the dynamically linked executable:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 5
-
- This builds the core application, the following will build the
- plugins:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 6
-
- If everything compiled and linked without any errors, we will get
- a \c plugandpaint executable and the \c libpnp_basictools.so and
- \c libpnp_extrafilters.so plugin files.
-
- \section2 Creating the Application Package
-
- There is no standard package management on Unix, so the method we
- present below is a generic solution. See the documentation for
- your target system for information on how to create a package.
-
- To deploy the application, we must make sure that we copy the
- relevant Qt libraries (corresponding to the Qt modules used in the
- application) as well as the executable to the same
- directory. Remember that if your application depends on compiler
- specific libraries, these must also be redistributed along with
- your application. For more information, see the \l {Application
- Dependencies} section.
-
- We'll cover the plugins shortly, but the main issue with shared
- libraries is that you must ensure that the dynamic linker will
- find the Qt libraries. Unless told otherwise, the dynamic linker
- doesn't search the directory where your application resides. There
- are many ways to solve this:
-
- \list
- \o You can install the Qt libraries in one of the system
- library paths (e.g. \c /usr/lib on most systems).
-
- \o You can pass a predetermined path to the \c -rpath command-line
- option when linking the application. This will tell the dynamic
- linker to look in this directory when starting your application.
-
- \o You can write a startup script for your application, where you
- modify the dynamic linker configuration (e.g. adding your
- application's directory to the \c LD_LIBRARY_PATH environment
- variable. \note If your application will be running with "Set
- user ID on execution," and if it will be owned by root, then
- LD_LIBRARY_PATH will be ignored on some platforms. In this
- case, use of the LD_LIBRARY_PATH approach is not an option).
-
- \endlist
-
- The disadvantage of the first approach is that the user must have
- super user privileges. The disadvantage of the second approach is
- that the user may not have privileges to install into the
- predetemined path. In either case, the users don't have the option
- of installing to their home directory. We recommend using the
- third approach since it is the most flexible. For example, a \c
- plugandpaint.sh script will look like this:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 7
-
- By running this script instead of the executable, you are sure
- that the Qt libraries will be found by the dynamic linker. Note
- that you only have to rename the script to use it with other
- applications.
-
- When looking for plugins, the application searches in a plugins
- subdirectory inside the directory of the application
- executable. Either you have to manually copy the plugins into the
- \c plugins directory, or you can set the \c DESTDIR in the
- plugins' project files:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 8
-
- An archive distributing all the Qt libraries, and all the plugins,
- required to run the \l {tools/plugandpaint}{Plug & Paint}
- application, would have to include the following files:
-
- \table 100%
- \header
- \o Component \o {2, 1} File Name
- \row
- \o The executable
- \o {2, 1} \c plugandpaint
- \row
- \o The script to run the executable
- \o {2, 1} \c plugandpaint.sh
- \row
- \o The Basic Tools plugin
- \o {2, 1} \c plugins\libpnp_basictools.so
- \row
- \o The ExtraFilters plugin
- \o {2, 1} \c plugins\libpnp_extrafilters.so
- \row
- \o The Qt Core module
- \o {2, 1} \c libQtCore.so.4
- \row
- \o The Qt GUI module
- \o {2, 1} \c libQtGui.so.4
- \endtable
-
- On most systems, the extension for shared libraries is \c .so. A
- notable exception is HP-UX, which uses \c .sl.
-
- Remember that if your application depends on compiler specific
- libraries, these must still be redistributed along with your
- application. For more information, see the \l {Application
- Dependencies} section.
-
- To verify that the application now can be successfully deployed,
- you can extract this archive on a machine without Qt and without
- any compiler installed, and try to run it, i.e. run the \c
- plugandpaint.sh script.
-
- An alternative to putting the plugins in the \c plugins
- subdirectory is to add a custom search path when you start your
- application using QApplication::addLibraryPath() or
- QApplication::setLibraryPaths().
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 9
-
- \section1 Application Dependencies
-
- \section2 Additional Libraries
-
- To find out which libraries your application depends on, run the
- \c ldd tool (available on most Unices):
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 10
-
- This will list all the shared library dependencies for your
- application. Depending on configuration, these libraries must be
- redistributed along with your application. In particular, the
- standard C++ library must be redistributed if you're compiling
- your application with a compiler that is binary incompatible with
- the system compiler. When possible, the safest solution is to link
- against these libraries statically.
-
- You will probably want to link dynamically with the regular X11
- libraries, since some implementations will try to open other
- shared libraries with \c dlopen(), and if this fails, the X11
- library might cause your application to crash.
-
- It's also worth mentioning that Qt will look for certain X11
- extensions, such as Xinerama and Xrandr, and possibly pull them
- in, including all the libraries that they link against. If you
- can't guarantee the presence of a certain extension, the safest
- approach is to disable it when configuring Qt (e.g. \c {./configure
- -no-xrandr}).
-
- FontConfig and FreeType are other examples of libraries that
- aren't always available or that aren't always binary
- compatible. As strange as it may sound, some software vendors have
- had success by compiling their software on very old machines and
- have been very careful not to upgrade any of the software running
- on them.
-
- When linking your application against the static Qt libraries, you
- must explicitly link with the dependent libraries mentioned
- above. Do this by adding them to the \c LIBS variable in your
- project file.
-
- \section2 Qt Plugins
-
- Your application may also depend on one or more Qt plugins, such
- as the JPEG image format plugin or a SQL driver plugin. Be sure
- to distribute any Qt plugins that you need with your application,
- and note that each type of plugin should be located within a
- specific subdirectory (such as \c imageformats or \c sqldrivers)
- within your distribution directory, as described below.
-
- \note If you are deploying an application that uses QtWebKit to display
- HTML pages from the World Wide Web, you should include all text codec
- plugins to support as many HTML encodings possible.
-
- The search path for Qt plugins (as well as a few other paths) is
- hard-coded into the QtCore library. By default, the first plugin
- search path will be hard-coded as \c /path/to/Qt/plugins. As
- mentioned above, using pre-determined paths has certain
- disadvantages, so you need to examine various alternatives to make
- sure that the Qt plugins are found:
-
- \list
-
- \o \l{qt-conf.html}{Using \c qt.conf}. This is the recommended
- approach since it provides the most flexibility.
-
- \o Using QApplication::addLibraryPath() or
- QApplication::setLibraryPaths().
-
- \o Using a third party installation utility or the target system's
- package manager to change the hard-coded paths in the QtCore
- library.
-
- \endlist
-
- The \l{How to Create Qt Plugins} document outlines the issues you
- need to pay attention to when building and deploying plugins for
- Qt applications.
-*/
-
-/*!
- \page deployment-windows.html
- \contentspage Deploying Qt Applications
-
- \title Deploying an Application on Windows
- \ingroup deployment
-
- This documentation will describe how to determine which files you
- should include in your distribution, and how to make sure that the
- application will find them at run-time. We will demonstrate the
- procedures in terms of deploying the \l {tools/plugandpaint}{Plug
- & Paint} application that is provided in Qt's examples directory.
-
- Contents:
-
- \tableofcontents
-
- \section1 Static Linking
-
- If you want to keep things simple by only having a few files to
- deploy, i.e. a stand-alone executable with the associated compiler
- specific DLLs, then you must build everything statically.
-
- \section2 Building Qt Statically
-
- Before we can build our application we must make sure that Qt is
- built statically. To do this, go to a command prompt and type the
- following:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 11
-
- Remember to specify any other options you need, such as data base
- drivers, as arguments to \c configure. Once \c configure has
- finished, type the following:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 12
-
- This will build Qt statically. Note that unlike with a dynamic build,
- building Qt statically will result in libraries without version numbers;
- e.g. \c QtCore4.lib will be \c QtCore.lib. Also, we have used \c nmake
- in all the examples, but if you use MinGW you must use
- \c mingw32-make instead.
-
- \note If you later need to reconfigure and rebuild Qt from the
- same location, ensure that all traces of the previous configuration are
- removed by entering the build directory and typing \c{nmake distclean}
- before running \c configure again.
-
- \section2 Linking the Application to the Static Version of Qt
-
- Once Qt has finished building we can build the \l
- {tools/plugandpaint}{Plug & Paint} application. First we must go
- into the directory that contains the application:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 13
-
- We must then run \c qmake to create a new makefile for the
- application, and do a clean build to create the statically linked
- executable:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 14
-
- You probably want to link against the release libraries, and you
- can specify this when invoking \c qmake. Now, provided that
- everything compiled and linked without any errors, we should have
- a \c plugandpaint.exe file that is ready for deployment. One easy
- way to check that the application really can be run stand-alone is
- to copy it to a machine that doesn't have Qt or any Qt
- applications installed, and run it on that machine.
-
- Remember that if your application depends on compiler specific
- libraries, these must still be redistributed along with your
- application. You can check which libraries your application is
- linking against by using the \c depends tool. For more
- information, see the \l {Application Dependencies} section.
-
- The \l {tools/plugandpaint}{Plug & Paint} example consists of
- several components: The application itself (\l
- {tools/plugandpaint}{Plug & Paint}), and the \l
- {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
- {tools/plugandpaintplugins/extrafilters}{Extra Filters}
- plugins. Since we cannot deploy plugins using the static linking
- approach, the application we have prepared is incomplete. It will
- run, but the functionality will be disabled due to the missing
- plugins. To deploy plugin-based applications we should use the
- shared library approach.
-
- \section1 Shared Libraries
-
- We have two challenges when deploying the \l
- {tools/plugandpaint}{Plug & Paint} application using the shared
- libraries approach: The Qt runtime has to be correctly
- redistributed along with the application executable, and the
- plugins have to be installed in the correct location on the target
- system so that the application can find them.
-
- \section2 Building Qt as a Shared Library
-
- We assume that you already have installed Qt as a shared library,
- which is the default when installing Qt, in the \c C:\path\to\Qt
- directory. For more information on how to build Qt, see the \l
- {Installation} documentation.
-
- \section2 Linking the Application to Qt as a Shared Library
-
- After ensuring that Qt is built as a shared library, we can build
- the \l {tools/plugandpaint}{Plug & Paint} application. First, we
- must go into the directory that contains the application:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 15
-
- Now run \c qmake to create a new makefile for the application, and
- do a clean build to create the dynamically linked executable:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 16
-
- This builds the core application, the following will build the
- plugins:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 17
-
- If everything compiled and linked without any errors, we will get
- a \c plugandpaint.exe executable and the \c pnp_basictools.dll and
- \c pnp_extrafilters.dll plugin files.
-
- \section2 Creating the Application Package
-
- To deploy the application, we must make sure that we copy the
- relevant Qt DLL (corresponding to the Qt modules used in
- the application) as well as the executable to the same directory
- in the \c release subdirectory.
-
- Remember that if your application depends on compiler specific
- libraries, these must be redistributed along with your
- application. You can check which libraries your application is
- linking against by using the \c depends tool. For more
- information, see the \l {Application Dependencies} section.
-
- We'll cover the plugins shortly, but first we'll check that the
- application will work in a deployed environment: Either copy the
- executable and the Qt DLLs to a machine that doesn't have Qt
- or any Qt applications installed, or if you want to test on the
- build machine, ensure that the machine doesn't have Qt in its
- environment.
-
- If the application starts without any problems, then we have
- successfully made a dynamically linked version of the \l
- {tools/plugandpaint}{Plug & Paint} application. But the
- application's functionality will still be missing since we have
- not yet deployed the associated plugins.
-
- Plugins work differently to normal DLLs, so we can't just
- copy them into the same directory as our application's executable
- as we did with the Qt DLLs. When looking for plugins, the
- application searches in a \c plugins subdirectory inside the
- directory of the application executable.
-
- So to make the plugins available to our application, we have to
- create the \c plugins subdirectory and copy over the relevant DLLs:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 18
-
- An archive distributing all the Qt DLLs and application
- specific plugins required to run the \l {tools/plugandpaint}{Plug
- & Paint} application, would have to include the following files:
-
- \table 100%
- \header
- \o Component \o {2, 1} File Name
- \row
- \o The executable
- \o {2, 1} \c plugandpaint.exe
- \row
- \o The Basic Tools plugin
- \o {2, 1} \c plugins\pnp_basictools.dll
- \row
- \o The ExtraFilters plugin
- \o {2, 1} \c plugins\pnp_extrafilters.dll
- \row
- \o The Qt Core module
- \o {2, 1} \c qtcore4.dll
- \row
- \o The Qt GUI module
- \o {2, 1} \c qtgui4.dll
- \endtable
-
- In addition, the archive must contain the following compiler
- specific libraries depending on your version of Visual Studio:
-
- \table 100%
- \header
- \o \o VC++ 6.0 \o VC++ 7.1 (2003) \o VC++ 8.0 (2005)
- \row
- \o The C run-time
- \o \c msvcrt.dll
- \o \c msvcr71.dll
- \o \c msvcr80.dll
- \row
- \o The C++ run-time
- \o \c msvcp60.dll
- \o \c msvcp71.dll
- \o \c msvcp80.dll
- \endtable
-
- To verify that the application now can be successfully deployed,
- you can extract this archive on a machine without Qt and without
- any compiler installed, and try to run it.
-
- An alternative to putting the plugins in the plugins subdirectory
- is to add a custom search path when you start your application
- using QApplication::addLibraryPath() or
- QApplication::setLibraryPaths().
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 19
-
- One benefit of using plugins is that they can easily be made
- available to a whole family of applications.
-
- It's often most convenient to add the path in the application's \c
- main() function, right after the QApplication object is
- created. Once the path is added, the application will search it
- for plugins, in addition to looking in the \c plugins subdirectory
- in the application's own directory. Any number of additional paths
- can be added.
-
- \section2 Visual Studio 2005 Onwards
-
- When deploying an application compiled with Visual Studio 2005 onwards,
- there are some additional steps to be taken.
-
- First, we need to copy the manifest file created when linking the
- application. This manifest file contains information about the
- application's dependencies on side-by-side assemblies, such as the runtime
- libraries.
-
- The manifest file needs to be copied into the \bold same folder as the
- application executable. You do not need to copy the manifest files for
- shared libraries (DLLs), since they are not used.
-
- If the shared library has dependencies that are different from the
- application using it, the manifest file needs to be embedded into the DLL
- binary. Since Qt 4.1.3, the follwoing \c CONFIG options are available for
- embedding manifests:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 20
-
- To use the options, add
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 21
-
- to your .pro file. The \c embed_manifest_dll option is enabled by default.
-
- You can find more information about manifest files and side-by-side
- assemblies at the
- \l {http://msdn.microsoft.com/en-us/library/aa376307.aspx}{MSDN website}.
-
- There are two ways to include the run time libraries: by bundling them
- directly with your application or by installing them on the end-user's
- system.
-
- To bundle the run time libraries with your application, copy the directory
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 22
-
- into the folder where your executable is, so that you are including a
- \c Microsoft.VC80.CRT directory alongside your application's executable. If
- you are bundling the runtimes and need to deploy plugins as well, you have
- to remove the manifest from the plugins (embedded as a resource) by adding
- the following line to the \c{.pro} file of the plugins you are compiling:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 23
-
- \warning If you skip the step above, the plugins will not load on some
- systems.
-
- To install the runtime libraries on the end-user's system, you need to
- include the appropriate Visual C++ Redistributable Package (VCRedist)
- executable with your application and ensure that it is executed when the
- user installs your application.
-
- For example, on an 32-bit x86-based system, you would include the
- \l{http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE}{vcredist_x86.exe}
- executable. The \l{http://www.microsoft.com/downloads/details.aspx?familyid=526BF4A7-44E6-4A91-B328-A4594ADB70E5}{vcredist_IA64.exe}
- and \l{http://www.microsoft.com/downloads/details.aspx?familyid=90548130-4468-4BBC-9673-D6ACABD5D13B}{vcredist_x64.exe}
- executables provide the appropriate libraries for the IA64 and 64-bit x86
- architectures, respectively.
-
- \note The application you ship must be compiled with exactly the same
- compiler version against the same C runtime version. This prevents
- deploying errors caused by different versions of the C runtime libraries.
-
-
- \section1 Application Dependencies
-
- \section2 Additional Libraries
-
- Depending on configuration, compiler specific libraries must be
- redistributed along with your application. You can check which
- libraries your application is linking against by using the
- \l{Dependency Walker} tool. All you need to do is to run it like
- this:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 24
-
- This will provide a list of the libraries that your application
- depends on and other information.
-
- \image deployment-windows-depends.png
-
- When looking at the release build of the Plug & Paint executable
- (\c plugandpaint.exe) with the \c depends tool, the tool lists the
- following immediate dependencies to non-system libraries:
-
- \table 100%
- \header
- \o Qt
- \o VC++ 6.0
- \o VC++ 7.1 (2003)
- \o VC++ 8.0 (2005)
- \o MinGW
- \row
- \o \list
- \o QTCORE4.DLL - The QtCore runtime
- \o QTGUI4.DLL - The QtGui runtime
- \endlist
- \o \list
- \o MSVCRT.DLL - The C runtime
- \o MSVCP60.DLL - The C++ runtime (only when STL is installed)
- \endlist
- \o \list
- \o MSVCR71.DLL - The C runtime
- \o MSVCP71.DLL - The C++ runtime (only when STL is installed)
- \endlist
- \o \list
- \o MSVCR80.DLL - The C runtime
- \o MSVCP80.DLL - The C++ runtime (only when STL is installed)
- \endlist
- \o \list
- \o MINGWM10.DLL - The MinGW run-time
- \endlist
- \endtable
-
- When looking at the plugin DLLs the exact same dependencies
- are listed.
-
- \section2 Qt Plugins
-
- Your application may also depend on one or more Qt plugins, such
- as the JPEG image format plugin or a SQL driver plugin. Be sure
- to distribute any Qt plugins that you need with your application,
- and note that each type of plugin should be located within a
- specific subdirectory (such as \c imageformats or \c sqldrivers)
- within your distribution directory, as described below.
-
- \note If you are deploying an application that uses QtWebKit to display
- HTML pages from the World Wide Web, you should include all text codec
- plugins to support as many HTML encodings possible.
-
- The search path for Qt plugins is hard-coded into the QtCore library.
- By default, the plugins subdirectory of the Qt installation is the first
- plugin search path. However, pre-determined paths like the default one
- have certain disadvantages. For example, they may not exist on the target
- machine. For that reason, you need to examine various alternatives to make
- sure that the Qt plugins are found:
-
- \list
-
- \o \l{qt-conf.html}{Using \c qt.conf}. This approach is the recommended
- if you have executables in different places sharing the same plugins.
-
- \o Using QApplication::addLibraryPath() or
- QApplication::setLibraryPaths(). This approach is recommended if you only
- have one executable that will use the plugin.
-
- \o Using a third party installation utility to change the
- hard-coded paths in the QtCore library.
-
- \endlist
-
- If you add a custom path using QApplication::addLibraryPath it could
- look like this:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 54
-
- Then qApp->libraryPaths() would return something like this:
-
- "C:/customPath/plugins "
- "C:/Qt/%VERSION%/plugins"
- "E:/myApplication/directory/"
-
- The executable will look for the plugins in these directories and
- the same order as the QStringList returned by qApp->libraryPaths().
- The newly added path is prepended to the qApp->libraryPaths() which
- means that it will be searched through first. However, if you use
- qApp->setLibraryPaths(), you will be able to determend which paths
- and in which order they will be searched.
-
- The \l{How to Create Qt Plugins} document outlines the issues you
- need to pay attention to when building and deploying plugins for
- Qt applications.
-*/
-
-/*!
- \page deployment-mac.html
- \contentspage Deploying Qt Applications
-
- \title Deploying an Application on Mac OS X
- \ingroup deployment
-
- Starting with version 4.5, Qt now includes a \l {macdeploy}{deployment tool}
- that automates the prodecures described in this document.
-
- This documentation will describe how to create a bundle, and how
- to make sure that the application will find the resources it needs
- at run-time. We will demonstrate the procedures in terms of
- deploying the \l {tools/plugandpaint}{Plug & Paint} application
- that is provided in Qt's examples directory.
-
- \tableofcontents
-
- \section1 The Bundle
-
- On the Mac, a GUI application must be built and run from a
- bundle. A bundle is a directory structure that appears as a single
- entity when viewed in the Finder. A bundle for an application
- typcially contains the executable and all the resources it
- needs. See the image below:
-
- \image deployment-mac-bundlestructure.png
-
- The bundle provides many advantages to the user. One primary
- advantage is that, since it is a single entity, it allows for
- drag-and-drop installation. As a programmer you can access bundle
- information in your own code. This is specific to Mac OS X and
- beyond the scope of this document. More information about bundles
- is available on \l
- {http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFBundles/index.html}{Apple's Developer Website}.
-
- A Qt command line application on Mac OS X works similar to a
- command line application on Unix and Windows. You probably don't
- want to run it in a bundle: Add this to your application's .pro:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 26
-
- This will tell \c qmake not to put the executable inside a
- bundle. Please refer to the \l{Deploying an Application on
- X11 Platforms}{X11 deployment documentation} for information about how
- to deploy these "bundle-less" applications.
-
- \section1 Xcode
-
- We will only concern ourselves with command-line tools here. While
- it is possible to use Xcode for this, Xcode has changed enough
- between each version that it makes it difficult to document it
- perfectly for each version. A future version of this document may
- include more information for using Xcode in the deployment
- process.
-
- \section1 Static Linking
-
- If you want to keep things simple by only having a few files to
- deploy, then you must build everything statically.
-
- \section2 Building Qt Statically
-
- Start by installing a static version of the Qt library. Remember
- that you will not be able to use plugins and you must build in all
- the image formats, SQL drivers, etc..
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 27
-
- You can check the various options that are available by running \c
- configure -help.
-
- \section2 Linking the Application to the Static Version of Qt
-
- Once Qt is built statically, the next step is to regenerate the
- makefile and rebuild the application. First, we must go into the
- directory that contains the application:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 28
-
- Now run \c qmake to create a new makefile for the application, and do
- a clean build to create the statically linked executable:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 29
-
- You probably want to link against the release libraries, and you
- can specify this when invoking \c qmake. If you have Xcode Tools
- 1.5 or higher installed, you may want to take advantage of "dead
- code stripping" to reduce the size of your binary even more. You
- can do this by passing \c {LIBS+= -dead_strip} to \c qmake in
- addition to the \c {-config release} parameter. This doesn't have
- as large an effect if you are using GCC 4, since Qt will then have
- function visibility hints built-in, but if you use GCC 3.3, it
- could make a difference.
-
- Now, provided that everything compiled and linked without any
- errors, we should have a \c plugandpaint.app bundle that is ready
- for deployment. One easy way to check that the application really
- can be run stand-alone is to copy the bundle to a machine that
- doesn't have Qt or any Qt applications installed, and run the
- application on that machine.
-
- You can check what other libraries your application links to using
- the \c otool:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 30
-
- Here is what the output looks like for the static \l
- {tools/plugandpaint}{Plug & Paint}:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 31
-
- For more information, see the \l {Application Dependencies}
- section.
-
- If you see \e Qt libraries in the output, it probably
- means that you have both dynamic and static Qt libraries installed
- on your machine. The linker will always choose dynamic over
- static. There are two solutions: Either move your Qt dynamic
- libraries (\c .dylibs) away to another directory while you link
- the application and then move them back, or edit the \c Makefile
- and replace link lines for the Qt libraries with the absolute path
- to the static libraries. For example, replace
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 32
-
- with
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 33
-
- The \l {tools/plugandpaint}{Plug & Paint} example consists of
- several components: The core application (\l
- {tools/plugandpaint}{Plug & Paint}), and the \l
- {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
- {tools/plugandpaintplugins/extrafilters}{Extra Filters}
- plugins. Since we cannot deploy plugins using the static linking
- approach, the bundle we have prepared so far is incomplete. The
- application will run, but the functionality will be disabled due
- to the missing plugins. To deploy plugin-based applications we
- should use the framework approach.
-
- \section1 Frameworks
-
- We have two challenges when deploying the \l
- {tools/plugandpaint}{Plug & Paint} application using frameworks:
- The Qt runtime has to be correctly redistributed along with the
- application bundle, and the plugins have to be installed in the
- correct location so that the application can find them.
-
- When distributing Qt with your application using frameworks, you
- have two options: You can either distribute Qt as a private
- framework within your application bundle, or you can distribute Qt
- as a standard framework (alternatively use the Qt frameworks in
- the installed binary). These two approaches are essentially the
- same. The latter option is good if you have many Qt applications
- and you would prefer to save memory. The former is good if you
- have Qt built in a special way, or want to make sure the framework
- is there. It just comes down to where you place the Qt frameworks.
-
- \section2 Building Qt as Frameworks
-
- We assume that you already have installed Qt as frameworks, which
- is the default when installing Qt, in the /path/to/Qt
- directory. For more information on how to build Qt, see the \l
- Installation documentation.
-
- When installing, the identification name of the frameworks will
- also be set. The identification name is what the dynamic linker
- (\c dyld) uses to find the libraries for your application.
-
- \section2 Linking the Application to Qt as Frameworks
-
- After ensuring that Qt is built as frameworks, we can build the \l
- {tools/plugandpaint}{Plug & Paint} application. First, we must go
- into the directory that contains the application:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 34
-
- Now run qmake to create a new makefile for the application, and do
- a clean build to create the dynamically linked executable:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 35
-
- This builds the core application, the following will build the
- plugins:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 36
-
- Now run the \c otool for the Qt frameworks, for example Qt Gui:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 37
-
- You will get the following output:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 38
-
- For the Qt frameworks, the first line (i.e. \c
- {path/to/Qt/lib/QtGui.framework/Versions/4/QtGui (compatibility
- version 4.0.0, current version 4.0.1)}) becomes the framework's
- identification name which is used by the dynamic linker (\c dyld).
-
- But when you are deploying the application, your users may not
- have the Qt frameworks installed in the specified location. For
- that reason, you must either provide the frameworks in an agreed
- upon location, or store the frameworks in the bundle itself.
- Regardless of which solution you choose, you must make sure that
- the frameworks return the proper identification name for
- themselves, and that the application will look for these
- names. Luckily we can control this with the \c install_name_tool
- command-line tool.
-
- The \c install_name_tool works in two modes, \c -id and \c
- -change. The \c -id mode is for libraries and frameworks, and
- allows us to specify a new identification name. We use the \c
- -change mode to change the paths in the application.
-
- Let's test this out by copying the Qt frameworks into the Plug &
- Paint bundle. Looking at \c otool's output for the bundle, we can
- see that we must copy both the QtCore and QtGui frameworks into
- the bundle. We will assume that we are in the directory where we
- built the bundle.
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 39
-
- First we create a \c Frameworks directory inside the bundle. This
- follows the Mac OS X application convention. We then copy the
- frameworks into the new directory. Since frameworks contain
- symbolic links, and we want to preserve them, we use the \c -R
- option.
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 40
-
- Then we run \c install_name_tool to set the identification names
- for the frameworks. The first argument after \c -id is the new
- name, and the second argument is the framework which
- identification we wish to change. The text \c @executable_path is
- a special \c dyld variable telling \c dyld to start looking where
- the executable is located. The new names specifies that these
- frameworks will be located "one directory up and over" in the \c
- Frameworks directory.
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 41
-
- Now, the dynamic linker knows where to look for QtCore and
- QtGui. Then we must make the application aware of the library
- locations as well using \c install_name_tool's \c -change mode.
- This basically comes down to string replacement, to match the
- identification names that we set for the frameworks.
-
- Finally, since the QtGui framework depends on QtCore, we must
- remember to change the reference for QtGui:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 42
-
- After all this we can run \c otool again and see that the
- application will look in the right locations.
-
- Of course, the thing that makes the \l {tools/plugandpaint}{Plug &
- Paint} example interesting are its plugins. The basic steps we
- need to follow with plugins are:
-
- \list
- \o Put the plugins inside the bundle
- \o Make sure that the plugins use the correct library using the
- \c install_name_tool
- \o Make sure that the application knows where to get the plugins
- \endlist
-
- While we can put the plugins anywhere we want in the bundle, the
- best location to put them is under Contents/Plugins. When we built
- the Plug & Paint plugins, the \c DESTDIR variable in their \c .pro
- file put the plugins' \c .dylib files in a \c plugins subdirectory
- in the \c plugandpaint directory. So, in this example, all we need
- to do is move this directory:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 43
-
- If we run \c otool on for example the \l
- {tools/plugandpaintplugins/basictools}{Basic Tools} plugin's \c
- .dylib file we get the following information.
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 44
-
- Then we can see that the plugin links to the Qt frameworks it was
- built against. Since we want the plugins to use the framework in
- the application bundle we change them the same way as we did for
- the application. For example for the Basic Tools plugin:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 45
-
-
- We must also modify the code in \c
- tools/plugandpaint/mainwindow.cpp to \l {QDir::cdUp()}{cdUp()} one
- directory since the plugins live in the bundle. Add the following
- code to the \c mainwindow.cpp file:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 46
-
- \table
- \row
- \o \inlineimage deployment-mac-application.png
- \o
- The additional code in \c tools/plugandpaint/mainwindow.cpp also
- enables us to view the plugins in the Finder, as shown to the left.
-
- We can also add plugins extending Qt, for example adding SQL
- drivers or image formats. We just need to follow the directory
- structure outlined in plugin documentation, and make sure they are
- included in the QCoreApplication::libraryPaths(). Let's quickly do
- this with the image formats, following the approach from above.
-
- Copy Qt's image format plugins into the bundle:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 47
-
- Use \c install_name_tool to link the plugins to the frameworks in
- the bundle:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 48
-
- Then we update the source code in \c tools/plugandpaint/main.cpp
- to look for the new plugins. After constructing the
- QApplication, we add the following code:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 49
-
- First, we tell the application to only look for plugins in this
- directory. In our case, this is what we want since we only want to
- look for the plugins that we distribute with the bundle. If we
- were part of a bigger Qt installation we could have used
- QCoreApplication::addLibraryPath() instead.
-
- \endtable
-
- \warning When deploying plugins, and thus make changes to the
- source code, the default identification names are reset when
- rebuilding the application, and you must repeat the process of
- making your application link to the Qt frameworks in the bundle
- using \c install_name_tool.
-
- Now you should be able to move the application to another Mac OS X
- machine and run it without Qt installed. Alternatively, you can
- move your frameworks that live outside of the bundle to another
- directory and see if the application still runs.
-
- If you store the frameworks in another location than in the
- bundle, the technique of linking your application is similar; you
- must make sure that the application and the frameworks agree where
- to be looking for the Qt libraries as well as the plugins.
-
- \section2 Creating the Application Package
-
- When you are done linking your application to Qt, either
- statically or as frameworks, the application is ready to be
- distributed. Apple provides a fair bit of information about how to
- do this and instead of repeating it here, we recommend that you
- consult their \l
- {http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/index.html}{software delivery}
- documentation.
-
- Although the process of deploying an application do have some
- pitfalls, once you know the various issues you can easily create
- packages that all your Mac OS X users will enjoy.
-
- \section1 Application Dependencies
-
- \section2 Qt Plugins
-
- Your application may also depend on one or more Qt plugins, such
- as the JPEG image format plugin or a SQL driver plugin. Be sure
- to distribute any Qt plugins that you need with your application,
- and note that each type of plugin should be located within a
- specific subdirectory (such as \c imageformats or \c sqldrivers)
- within your distribution directory, as described below.
-
- \note If you are deploying an application that uses QtWebKit to display
- HTML pages from the World Wide Web, you should include all text codec
- plugins to support as many HTML encodings possible.
-
- The search path for Qt plugins (as well as a few other paths) is
- hard-coded into the QtCore library. By default, the first plugin
- search path will be hard-coded as \c /path/to/Qt/plugins. But
- using pre-determined paths has certain disadvantages. For example,
- they may not exist on the target machine. For that reason you need
- to examine various alternatives to make sure that the Qt plugins
- are found:
-
- \list
-
- \o \l{qt-conf.html}{Using \c qt.conf}. This is the recommended
- approach since it provides the most flexibility.
-
- \o Using QApplication::addLibraryPath() or
- QApplication::setLibraryPaths().
-
- \o Using a third party installation utility to change the
- hard-coded paths in the QtCore library.
-
- \endlist
-
- The \l{How to Create Qt Plugins} document outlines the issues you
- need to pay attention to when building and deploying plugins for
- Qt applications.
-
- \section2 Additional Libraries
-
- You can check which libraries your application is linking against
- by using the \c otool tool. To use \c otool, all you need to do is
- to run it like this:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 50
-
- Unlike the deployment processes on \l {Deploying an Application on
- X11 Platforms}{X11} and \l {Deploying an Application on
- Windows}{Windows}, compiler specific libraries rarely have to
- be redistributed along with your application. But since Qt can be
- configured, built, and installed in several ways on Mac OS X,
- there are also several ways to deploy applications. Typically your
- goals help determine how you are going to deploy the
- application. The last sections describe a couple of things to keep
- in mind when you are deploying your application.
-
- \section2 Mac OS X Version Dependencies
-
- Qt 4.2 has been designed to be built and deployed on Mac OS X 10.3
- up until the current version as of this writing, Mac OS X 10.4 and
- all their minor releases. Qt achieves this by using "weak
- linking." This means that Qt tests if a function added in newer
- versions of Mac OS X is available on the computer it is running on
- before it uses it. This results in getting access to newer
- features when running on newer versions of OS X while still
- remaining compatible on older versions.
-
- For more information about cross development issues on Mac OS X,
- see \l
- {http://developer.apple.com/documentation/DeveloperTools/Conceptual/cross_development/index.html}{Apple's Developer Website}.
-
- Since the linker is set to be compatible with all OS X version, you have to
- change the \c MACOSX_DEPLOYMENT_TARGET environment variable to get weak
- linking to work for your application. You can add:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51
-
- to your .pro file and qmake will take care of this for you.
-
- However, there is a bit of a wrinkle to keep in mind when your are
- deploying. Mac OS X 10.4 ("Tiger") ships GCC 4.0 as its default
- compiler. This is also the GCC compiler we use for building the
- binary Qt package. If you use GCC 4.0 to build your application,
- it will link against a dynamic libstdc++ that is only available on
- Mac OS X 10.4 and Mac OS X 10.3.9. The application will refuse to
- run on older versions of the operating system.
-
- For more information about C++ runtime environment, see \l
- {http://developer.apple.com/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/index.html}{Apple's Developer Website}
-
- If you want to deploy to versions of Mac OS X earlier than 10.3.9,
- you must build with GCC 3.3 which is the default on Mac OS X
- 10.3. GCC 3.3 is also available on the Mac OS X 10.4 "Xcode Tools"
- CD and as a download for earlier versions of Mac OS X from Apple
- (\l {https://connect.apple.com/}{connect.apple.com}). You can use
- Apple's \c gcc_select(1) command line tool to switch the default
- complier on your system.
-
- \section3 Deploying Phonon Applications on Mac OS X
-
- \list
- \o If you build your Phonon application on Tiger, it will work on
- Tiger, Leopard and Panther.
- \o If you build your application on Leopard, it will \bold not work
- on Panther unless you rename the libraries with the following command
- after you have built your application:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51a
-
- This command must be invoked in the directory where
- \c{libphonon_qt7.dylib} is located, usually in
- \c{yourapp.app/Contents/plugins/phonon_backend/}.
- \o The \l {macdeploy}{deployment tool} will perform this step for you.
-
- \o If you are using Leopard, but would like to build your application
- against Tiger, you can use:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51b
- \endlist
-
- \section2 Architecture Dependencies
-
- The Qt for Mac OS X libraries, tools, and examples can be built "universal"
- (i.e. they run natively on both Intel and PowerPC machines). This
- is accomplished by passing \c -universal on the \c configure line
- of the source package, and requires that you use GCC 4.0.x. On
- PowerPC hardware you will need to pass the universal SDK as a
- command line argument to the Qt configure command. For example:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 52
-
- From 4.1.1 the Qt binary package is already universal.
-
- If you want to create a binary that runs on older versions of
- PowerPC and x86, it is possible to build Qt for the PowerPC using
- GCC 3.3, and for x86 one using GCC 4.0, and use Apple's \c lipo(1)
- tool to stitch them together. This is beyond the scope of this
- document and is not something we have tried, but Apple documents
- it on their \l
- {http://developer.apple.com/documentation/}{developer website}.
-
- Once you have a universal Qt, \a qmake will generate makefiles
- that will build for its host architecture by default. If you want
- to build for a specific architecture, you can control this with
- the \c CONFIG line in your \c .pro file. Use \c CONFIG+=ppc for
- PowerPC, and \c CONFIG+=x86 for x86. If you desire both, simply
- add both to the \c CONFIG line. PowerPC users also need an
- SDK. For example:
-
- \snippet doc/src/snippets/code/doc_src_deployment.qdoc 53
-
- Besides \c lipo, you can also check your binaries with the \c file(1)
- command line tool or the Finder.
-
- \section1 The Mac Deployment Tool
- \target macdeploy
- The Mac deployment tool can be found in QTDIR/bin/macdeployqt. It is
- designed to automate the process of creating a deployable
- application bundle that contains the Qt libraries as private
- frameworks.
-
- The mac deployment tool also deploys the Qt plugins, according
- to the following rules:
- \list
- \o Debug versions of the plugins are not deployed.
- \o The designer plugins are not deployed.
- \o The Image format plugins are always deployed.
- \o SQL driver plugins are deployed if the application uses the QtSql module.
- \o Script plugins are deployed if the application uses the QtScript module.
- \o The Phonon backend plugin is deployed if the application uses the \l{Phonon Module} {Phonon} module.
- \o The svg icon plugin is deployed if the application uses the QtSvg module.
- \o The accessibility plugin is always deployed.
- \o Accessibility for Qt3Support is deployed if the application uses the Qt3Support module.
- \endlist
-
- macdeployqt supports the following options:
- \list
- \o -no-plugins: Skip plugin deployment
- \o -dmg : Create a .dmg disk image
- \o -no-strip : Don't run 'strip' on the binaries
- \endlist
-*/
diff --git a/doc/src/deployment/deployment-plugins.qdoc b/doc/src/deployment/deployment-plugins.qdoc
new file mode 100644
index 0000000..2b9125b
--- /dev/null
+++ b/doc/src/deployment/deployment-plugins.qdoc
@@ -0,0 +1,236 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page deployment-plugins.html
+ \title Deploying Plugins
+ \brief A guide to plugins-specific aspects of deploying Qt and Qt Application
+
+ This document explains how to deploy plugin libraries that Qt or
+ your application should load at runtime. If you use
+ \l{How to Create Qt Plugins#Static Plugins}{static plugins}, then the
+ plugin code is already part of your application executable, and no
+ separate deployment steps are required.
+
+ \tableofcontents
+
+ \section1 The Plugin Directory
+
+ When the application is run, Qt will first treat the application's
+ executable directory as the \c{pluginsbase}. For example if the
+ application is in \c{C:\Program Files\MyApp} and has a style plugin,
+ Qt will look in \c{C:\Program Files\MyApp\styles}. (See
+ QCoreApplication::applicationDirPath() for how to find out where
+ the application's executable is.) Qt will also look in the
+ directory specified by
+ QLibraryInfo::location(QLibraryInfo::PluginsPath), which typically
+ is located in \c QTDIR/plugins (where \c QTDIR is the directory
+ where Qt is installed). If you want Qt to look in additional
+ places you can add as many paths as you need with calls to
+ QCoreApplication::addLibraryPath(). And if you want to set your
+ own path or paths you can use QCoreApplication::setLibraryPaths().
+ You can also use a \c qt.conf file to override the hard-coded
+ paths that are compiled into the Qt library. For more information,
+ see the \l {Using qt.conf} documentation. Yet another possibility
+ is to set the \c QT_PLUGIN_PATH environment variable before running
+ the application. If set, Qt will look for plugins in the
+ paths (separated by the system path separator) specified in the variable.
+
+ \section1 Loading and Verifying Plugins Dynamically
+
+ When loading plugins, the Qt library does some sanity checking to
+ determine whether or not the plugin can be loaded and used. This
+ provides the ability to have multiple versions and configurations of
+ the Qt library installed side by side.
+
+ \list
+ \o Plugins linked with a Qt library that has a higher version number
+ will not be loaded by a library with a lower version number.
+
+ \br
+ \bold{Example:} Qt 4.3.0 will \e{not} load a plugin built with Qt 4.3.1.
+
+ \o Plugins linked with a Qt library that has a lower major version
+ number will not be loaded by a library with a higher major version
+ number.
+
+ \br
+ \bold{Example:} Qt 4.3.1 will \e{not} load a plugin built with Qt 3.3.1.
+ \br
+ \bold{Example:} Qt 4.3.1 will load plugins built with Qt 4.3.0 and Qt 4.2.3.
+
+ \o The Qt library and all plugins are built using a \e {build
+ key}. The build key in the Qt library is examined against the build
+ key in the plugin, and if they match, the plugin is loaded. If the
+ build keys do not match, then the Qt library refuses to load the
+ plugin.
+
+ \br \bold{Rationale:} See the \l{#The Build Key}{The Build Key} section below.
+ \endlist
+
+ When building plugins to extend an application, it is important to ensure
+ that the plugin is configured in the same way as the application. This means
+ that if the application was built in release mode, plugins should be built
+ in release mode, too.
+
+ If you configure Qt to be built in both debug and release modes,
+ but only build applications in release mode, you need to ensure that your
+ plugins are also built in release mode. By default, if a debug build of Qt is
+ available, plugins will \e only be built in debug mode. To force the
+ plugins to be built in release mode, add the following line to the plugin's
+ project file:
+
+ \snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 3
+
+ This will ensure that the plugin is compatible with the version of the library
+ used in the application.
+
+ \section2 The Build Key
+
+ When loading plugins, Qt checks the build key of each plugin against its
+ own configuration to ensure that only compatible plugins are loaded; any
+ plugins that are configured differently are not loaded.
+
+ The build key contains the following information:
+ \list
+ \o Architecture, operating system and compiler.
+
+ \e {Rationale:}
+ In cases where different versions of the same compiler do not
+ produce binary compatible code, the version of the compiler is
+ also present in the build key.
+
+ \o Configuration of the Qt library. The configuration is a list
+ of the missing features that affect the available API in the
+ library.
+
+ \e {Rationale:}
+ Two different configurations of the same version of
+ the Qt library are not binary compatible. The Qt library that
+ loads the plugin uses the list of (missing) features to
+ determine if the plugin is binary compatible.
+
+ \e {Note:} There are cases where a plugin can use features that are
+ available in two different configurations. However, the
+ developer writing plugins would need to know which features are
+ in use, both in their plugin and internally by the utility
+ classes in Qt. The Qt library would require complex feature
+ and dependency queries and verification when loading plugins.
+ Requiring this would place an unnecessary burden on the developer, and
+ increase the overhead of loading a plugin. To reduce both
+ development time and application runtime costs, a simple string
+ comparision of the build keys is used.
+
+ \o Optionally, an extra string may be specified on the configure
+ script command line.
+
+ \e {Rationale:}
+ When distributing binaries of the Qt library with an
+ application, this provides a way for developers to write
+ plugins that can only be loaded by the library with which the
+ plugins were linked.
+ \endlist
+
+ For debugging purposes, it is possible to override the run-time build key
+ checks by configuring Qt with the \c QT_NO_PLUGIN_CHECK preprocessor macro
+ defined.
+
+ \section1 The Plugin Cache
+
+ In order to speed up loading and validation of plugins, some of
+ the information that is collected when plugins are loaded is cached
+ through QSettings. This includes information about whether or not
+ a plugin was successfully loaded, so that subsequent load operations
+ don't try to load an invalid plugin. However, if the "last modified"
+ timestamp of a plugin has changed, the plugin's cache entry is
+ invalidated and the plugin is reloaded regardless of the values in
+ the cache entry, and the cache entry itself is updated with the new
+ result.
+
+ This also means that the timestamp must be updated each time the
+ plugin or any dependent resources (such as a shared library) is
+ updated, since the dependent resources might influence the result
+ of loading a plugin.
+
+ Sometimes, when developing plugins, it is necessary to remove entries
+ from the plugin cache. Since Qt uses QSettings to manage the plugin
+ cache, the locations of plugins are platform-dependent; see
+ \l{QSettings#Platform-Specific Notes}{the QSettings documentation}
+ for more information about each platform.
+
+ For example, on Windows the entries are stored in the registry, and the
+ paths for each plugin will typically begin with either of these two strings:
+
+ \snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 6
+
+ \section1 Debugging Plugins
+
+ There are a number of issues that may prevent correctly-written plugins from
+ working with the applications that are designed to use them. Many of these
+ are related to differences in the way that plugins and applications have been
+ built, often arising from separate build systems and processes.
+
+ The following table contains descriptions of the common causes of problems
+ developers experience when creating plugins:
+
+ \table
+ \header \o Problem \o Cause \o Solution
+ \row \o Plugins sliently fail to load even when opened directly by the
+ application. \QD shows the plugin libraries in its
+ \gui{Help|About Plugins} dialog, but no plugins are listed under each
+ of them.
+ \o The application and its plugins are built in different modes.
+ \o Either share the same build information or build the plugins in both
+ debug and release modes by appending the \c debug_and_release to
+ the \l{qmake Variable Reference#CONFIG}{CONFIG} variable in each of
+ their project files.
+ \row \o A valid plugin that replaces an invalid (or broken) plugin fails to load.
+ \o The entry for the plugin in the plugin cache indicates that the original
+ plugin could not be loaded, causing Qt to ignore the replacement.
+ \o Either ensure that the plugin's timestamp is updated, or delete the
+ entry in the \l{#The Plugin Cache}{plugin cache}.
+ \endtable
+
+ You can also use the \c QT_DEBUG_PLUGINS environment variable to obtain
+ diagnostic information from Qt about each plugin it tries to load. Set this
+ variable to a non-zero value in the environment from which your application is
+ launched.
+*/
diff --git a/doc/src/deployment/deployment.qdoc b/doc/src/deployment/deployment.qdoc
new file mode 100644
index 0000000..2acc69b
--- /dev/null
+++ b/doc/src/deployment/deployment.qdoc
@@ -0,0 +1,1474 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page deployment.html
+ \title Deploying Qt Applications
+
+ Deploying an Qt application does not require any C++
+ programming. All you need to do is to build Qt and your
+ application in release mode, following the procedures described in
+ this documentation. We will demonstrate the procedures in terms of
+ deploying the \l {tools/plugandpaint}{Plug & Paint} application
+ that is provided in Qt's examples directory.
+
+ \section1 Static vs. Shared Libraries
+
+ There are two ways of deploying an application:
+
+ \list
+ \o Static Linking
+ \o Shared Libraries (Frameworks on Mac)
+ \endlist
+
+ Static linking results in a stand-alone executable. The advantage
+ is that you will only have a few files to deploy. The
+ disadvantages are that the executables are large and with no
+ flexibility (i.e a new version of the application, or of Qt, will
+ require that the deployment process is repeated), and that you
+ cannot deploy plugins.
+
+ To deploy plugin-based applications, you can use the shared
+ library approach. Shared libraries also provide smaller, more
+ flexible executables. For example, using the shared library
+ approach, the user is able to independently upgrade the Qt library
+ used by the application.
+
+ Another reason why you might want to use the shared library
+ approach, is if you want to use the same Qt libraries for a family
+ of applications. In fact, if you download the binary installation
+ of Qt, you get Qt as a shared library.
+
+ The disadvantage with the shared library approach is that you
+ will get more files to deploy. For more information, see
+ \l{sharedlibrary.html}{Creating Shared Libraries}.
+
+ \section1 Deploying Qt's Libraries
+
+ \table
+ \header
+ \o {4,1} Qt's Libraries
+ \row
+ \o \l {QtAssistant}
+ \o \l {QAxContainer}
+ \o \l {QAxServer}
+ \o \l {QtCore}
+ \row
+ \o \l {QtDBus}
+ \o \l {QtDesigner}
+ \o \l {QtGui}
+ \o \l {QtHelp}
+ \row
+ \o \l {QtNetwork}
+ \o \l {QtOpenGL}
+ \o \l {QtScript}
+ \o \l {QtScriptTools}
+ \row
+ \o \l {QtSql}
+ \o \l {QtSvg}
+ \o \l {QtWebKit}
+ \o \l {QtXml}
+ \row
+ \o \l {QtXmlPatterns}
+ \o \l {Phonon Module}{Phonon}
+ \o \l {Qt3Support}
+ \endtable
+
+ Since Qt is not a system library, it has to be redistributed along
+ with your application; the minimum is to redistribute the run-time
+ of the libraries used by the application. Using static linking,
+ however, the Qt run-time is compiled into the executable.
+
+ In particular, you will need to deploy Qt plugins, such as
+ JPEG support or SQL drivers. For more information about plugins,
+ see the \l {plugins-howto.html}{How to Create Qt Plugins}
+ documentation.
+
+ When deploying an application using the shared library approach
+ you must ensure that the Qt libraries will use the correct path to
+ find the Qt plugins, documentation, translation etc. To do this you
+ can use a \c qt.conf file. For more information, see the \l {Using
+ qt.conf} documentation.
+
+ Depending on configuration, compiler specific libraries must be
+ redistributed as well. For more information, see the platform
+ specific Application Dependencies sections: \l
+ {deployment-x11.html#application-dependencies}{X11}, \l
+ {deployment-windows.html#application-dependencies}{Windows}, \l
+ {deployment-mac.html#application-dependencies}{Mac}.
+
+ \section1 Licensing
+
+ Some of Qt's libraries are based on third party libraries that are
+ not licensed using the same dual-license model as Qt. As a result,
+ care must be taken when deploying applications that use these
+ libraries, particularly when the application is statically linked
+ to them.
+
+ The following table contains an inexhaustive summary of the issues
+ you should be aware of.
+
+ \table
+ \header \o Qt Library \o Dependency
+ \o Licensing Issue
+ \row \o QtHelp \o CLucene
+ \o The version of clucene distributed with Qt is licensed
+ under the GNU LGPL version 2.1 or later. This has implications for
+ developers of closed source applications. Please see
+ \l{QtHelp Module#License Information}{the QtHelp module documentation}
+ for more information.
+
+ \row \o QtNetwork \o OpenSSL
+ \o Some configurations of QtNetwork use OpenSSL at run-time. Deployment
+ of OpenSSL libraries is subject to both licensing and export restrictions.
+ More information can be found in the \l{Secure Sockets Layer (SSL) Classes}
+ documentation.
+
+ \row \o QtWebKit \o WebKit
+ \o WebKit is licensed under the GNU LGPL version 2 or later.
+ This has implications for developers of closed source applications.
+ Please see \l{QtWebKit Module#License Information}{the QtWebKit module
+ documentation} for more information.
+
+ \row \o \l{Phonon Module}{Phonon} \o Phonon
+ \o Phonon relies on the native multimedia engines on different platforms.
+ Phonon itself is licensed under the GNU LGPL version 2. Please see
+ \l{Phonon Module#License Information}{the Phonon module documentation}
+ for more information on licensing and the
+ \l{Phonon Overview#Backends}{Phonon Overview} for details of the backends
+ in use on different platforms.
+ \endtable
+
+ \section1 Platform-Specific Notes
+
+ The procedure of deploying Qt applications is different for the
+ various platforms:
+
+ \list
+ \o \l{Deploying an Application on X11 Platforms}{Qt for X11 Platforms}
+ \o \l{Deploying an Application on Windows}{Qt for Windows}
+ \o \l{Deploying an Application on Mac OS X}{Qt for Mac OS X}
+ \o \l{Deploying Qt for Embedded Linux Applications}{Qt for Embedded Linux}
+ \endlist
+
+ \sa Installation {Platform-Specific Documentation}
+*/
+
+/*!
+ \page deployment-x11.html
+ \contentspage Deploying Qt Applications
+
+ \title Deploying an Application on X11 Platforms
+
+ Due to the proliferation of Unix systems (commercial Unices, Linux
+ distributions, etc.), deployment on Unix is a complex
+ topic. Before we start, be aware that programs compiled for one
+ Unix flavor will probably not run on a different Unix system. For
+ example, unless you use a cross-compiler, you cannot compile your
+ application on Irix and distribute it on AIX.
+
+ Contents:
+
+ \tableofcontents
+
+ This documentation will describe how to determine which files you
+ should include in your distribution, and how to make sure that the
+ application will find them at run-time. We will demonstrate the
+ procedures in terms of deploying the \l {tools/plugandpaint}{Plug
+ & Paint} application that is provided in Qt's examples directory.
+
+ \section1 Static Linking
+
+ Static linking is often the safest and easiest way to distribute
+ an application on Unix since it relieves you from the task of
+ distributing the Qt libraries and ensuring that they are located
+ in the default search path for libraries on the target system.
+
+ \section2 Building Qt Statically
+
+ To use this approach, you must start by installing a static version
+ of the Qt library:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 0
+
+ We specify the prefix so that we do not overwrite the existing Qt
+ installation. The example above only builds the Qt libraries,
+ i.e. the examples and Qt Designer will not be built. When \c make
+ is done, you will find the Qt libraries in the \c /path/to/Qt/lib
+ directory.
+
+ When linking your application against static Qt libraries, note
+ that you might need to add more libraries to the \c LIBS line in
+ your project file. For more information, see the \l {Application
+ Dependencies} section.
+
+ \section2 Linking the Application to the Static Version of Qt
+
+ Once Qt is built statically, the next step is to regenerate the
+ makefile and rebuild the application. First, we must go into the
+ directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 1
+
+ Now run qmake to create a new makefile for the application, and do
+ a clean build to create the statically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 2
+
+ You probably want to link against the release libraries, and you
+ can specify this when invoking \c qmake. Note that we must set the
+ path to the static Qt that we just built.
+
+ To check that the application really links statically with Qt, run
+ the \c ldd tool (available on most Unices):
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 3
+
+ Verify that the Qt libraries are not mentioned in the output.
+
+ Now, provided that everything compiled and linked without any
+ errors, we should have a \c plugandpaint file that is ready for
+ deployment. One easy way to check that the application really can
+ be run stand-alone is to copy it to a machine that doesn't have Qt
+ or any Qt applications installed, and run it on that machine.
+
+ Remember that if your application depends on compiler specific
+ libraries, these must still be redistributed along with your
+ application. For more information, see the \l {Application
+ Dependencies} section.
+
+ The \l {tools/plugandpaint}{Plug & Paint} example consists of
+ several components: The core application (\l
+ {tools/plugandpaint}{Plug & Paint}), and the \l
+ {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
+ {tools/plugandpaintplugins/extrafilters}{Extra Filters}
+ plugins. Since we cannot deploy plugins using the static linking
+ approach, the executable we have prepared so far is
+ incomplete. The application will run, but the functionality will
+ be disabled due to the missing plugins. To deploy plugin-based
+ applications we should use the shared library approach.
+
+ \section1 Shared Libraries
+
+ We have two challenges when deploying the \l
+ {tools/plugandpaint}{Plug & Paint} application using the shared
+ libraries approach: The Qt runtime has to be correctly
+ redistributed along with the application executable, and the
+ plugins have to be installed in the correct location on the target
+ system so that the application can find them.
+
+ \section2 Building Qt as a Shared Library
+
+ We assume that you already have installed Qt as a shared library,
+ which is the default when installing Qt, in the \c /path/to/Qt
+ directory. For more information on how to build Qt, see the \l
+ {Installation} documentation.
+
+ \section2 Linking the Application to Qt as a Shared Library
+
+ After ensuring that Qt is built as a shared library, we can build
+ the \l {tools/plugandpaint}{Plug & Paint} application. First, we
+ must go into the directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 4
+
+ Now run qmake to create a new makefile for the application, and do
+ a clean build to create the dynamically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 5
+
+ This builds the core application, the following will build the
+ plugins:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 6
+
+ If everything compiled and linked without any errors, we will get
+ a \c plugandpaint executable and the \c libpnp_basictools.so and
+ \c libpnp_extrafilters.so plugin files.
+
+ \section2 Creating the Application Package
+
+ There is no standard package management on Unix, so the method we
+ present below is a generic solution. See the documentation for
+ your target system for information on how to create a package.
+
+ To deploy the application, we must make sure that we copy the
+ relevant Qt libraries (corresponding to the Qt modules used in the
+ application) as well as the executable to the same
+ directory. Remember that if your application depends on compiler
+ specific libraries, these must also be redistributed along with
+ your application. For more information, see the \l {Application
+ Dependencies} section.
+
+ We'll cover the plugins shortly, but the main issue with shared
+ libraries is that you must ensure that the dynamic linker will
+ find the Qt libraries. Unless told otherwise, the dynamic linker
+ doesn't search the directory where your application resides. There
+ are many ways to solve this:
+
+ \list
+ \o You can install the Qt libraries in one of the system
+ library paths (e.g. \c /usr/lib on most systems).
+
+ \o You can pass a predetermined path to the \c -rpath command-line
+ option when linking the application. This will tell the dynamic
+ linker to look in this directory when starting your application.
+
+ \o You can write a startup script for your application, where you
+ modify the dynamic linker configuration (e.g. adding your
+ application's directory to the \c LD_LIBRARY_PATH environment
+ variable. \note If your application will be running with "Set
+ user ID on execution," and if it will be owned by root, then
+ LD_LIBRARY_PATH will be ignored on some platforms. In this
+ case, use of the LD_LIBRARY_PATH approach is not an option).
+
+ \endlist
+
+ The disadvantage of the first approach is that the user must have
+ super user privileges. The disadvantage of the second approach is
+ that the user may not have privileges to install into the
+ predetemined path. In either case, the users don't have the option
+ of installing to their home directory. We recommend using the
+ third approach since it is the most flexible. For example, a \c
+ plugandpaint.sh script will look like this:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 7
+
+ By running this script instead of the executable, you are sure
+ that the Qt libraries will be found by the dynamic linker. Note
+ that you only have to rename the script to use it with other
+ applications.
+
+ When looking for plugins, the application searches in a plugins
+ subdirectory inside the directory of the application
+ executable. Either you have to manually copy the plugins into the
+ \c plugins directory, or you can set the \c DESTDIR in the
+ plugins' project files:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 8
+
+ An archive distributing all the Qt libraries, and all the plugins,
+ required to run the \l {tools/plugandpaint}{Plug & Paint}
+ application, would have to include the following files:
+
+ \table 100%
+ \header
+ \o Component \o {2, 1} File Name
+ \row
+ \o The executable
+ \o {2, 1} \c plugandpaint
+ \row
+ \o The script to run the executable
+ \o {2, 1} \c plugandpaint.sh
+ \row
+ \o The Basic Tools plugin
+ \o {2, 1} \c plugins\libpnp_basictools.so
+ \row
+ \o The ExtraFilters plugin
+ \o {2, 1} \c plugins\libpnp_extrafilters.so
+ \row
+ \o The Qt Core module
+ \o {2, 1} \c libQtCore.so.4
+ \row
+ \o The Qt GUI module
+ \o {2, 1} \c libQtGui.so.4
+ \endtable
+
+ On most systems, the extension for shared libraries is \c .so. A
+ notable exception is HP-UX, which uses \c .sl.
+
+ Remember that if your application depends on compiler specific
+ libraries, these must still be redistributed along with your
+ application. For more information, see the \l {Application
+ Dependencies} section.
+
+ To verify that the application now can be successfully deployed,
+ you can extract this archive on a machine without Qt and without
+ any compiler installed, and try to run it, i.e. run the \c
+ plugandpaint.sh script.
+
+ An alternative to putting the plugins in the \c plugins
+ subdirectory is to add a custom search path when you start your
+ application using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths().
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 9
+
+ \section1 Application Dependencies
+
+ \section2 Additional Libraries
+
+ To find out which libraries your application depends on, run the
+ \c ldd tool (available on most Unices):
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 10
+
+ This will list all the shared library dependencies for your
+ application. Depending on configuration, these libraries must be
+ redistributed along with your application. In particular, the
+ standard C++ library must be redistributed if you're compiling
+ your application with a compiler that is binary incompatible with
+ the system compiler. When possible, the safest solution is to link
+ against these libraries statically.
+
+ You will probably want to link dynamically with the regular X11
+ libraries, since some implementations will try to open other
+ shared libraries with \c dlopen(), and if this fails, the X11
+ library might cause your application to crash.
+
+ It's also worth mentioning that Qt will look for certain X11
+ extensions, such as Xinerama and Xrandr, and possibly pull them
+ in, including all the libraries that they link against. If you
+ can't guarantee the presence of a certain extension, the safest
+ approach is to disable it when configuring Qt (e.g. \c {./configure
+ -no-xrandr}).
+
+ FontConfig and FreeType are other examples of libraries that
+ aren't always available or that aren't always binary
+ compatible. As strange as it may sound, some software vendors have
+ had success by compiling their software on very old machines and
+ have been very careful not to upgrade any of the software running
+ on them.
+
+ When linking your application against the static Qt libraries, you
+ must explicitly link with the dependent libraries mentioned
+ above. Do this by adding them to the \c LIBS variable in your
+ project file.
+
+ \section2 Qt Plugins
+
+ Your application may also depend on one or more Qt plugins, such
+ as the JPEG image format plugin or a SQL driver plugin. Be sure
+ to distribute any Qt plugins that you need with your application,
+ and note that each type of plugin should be located within a
+ specific subdirectory (such as \c imageformats or \c sqldrivers)
+ within your distribution directory, as described below.
+
+ \note If you are deploying an application that uses QtWebKit to display
+ HTML pages from the World Wide Web, you should include all text codec
+ plugins to support as many HTML encodings possible.
+
+ The search path for Qt plugins (as well as a few other paths) is
+ hard-coded into the QtCore library. By default, the first plugin
+ search path will be hard-coded as \c /path/to/Qt/plugins. As
+ mentioned above, using pre-determined paths has certain
+ disadvantages, so you need to examine various alternatives to make
+ sure that the Qt plugins are found:
+
+ \list
+
+ \o \l{qt-conf.html}{Using \c qt.conf}. This is the recommended
+ approach since it provides the most flexibility.
+
+ \o Using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths().
+
+ \o Using a third party installation utility or the target system's
+ package manager to change the hard-coded paths in the QtCore
+ library.
+
+ \endlist
+
+ The \l{How to Create Qt Plugins} document outlines the issues you
+ need to pay attention to when building and deploying plugins for
+ Qt applications.
+*/
+
+/*!
+ \page deployment-windows.html
+ \contentspage Deploying Qt Applications
+
+ \title Deploying an Application on Windows
+
+ This documentation will describe how to determine which files you
+ should include in your distribution, and how to make sure that the
+ application will find them at run-time. We will demonstrate the
+ procedures in terms of deploying the \l {tools/plugandpaint}{Plug
+ & Paint} application that is provided in Qt's examples directory.
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 Static Linking
+
+ If you want to keep things simple by only having a few files to
+ deploy, i.e. a stand-alone executable with the associated compiler
+ specific DLLs, then you must build everything statically.
+
+ \section2 Building Qt Statically
+
+ Before we can build our application we must make sure that Qt is
+ built statically. To do this, go to a command prompt and type the
+ following:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 11
+
+ Remember to specify any other options you need, such as data base
+ drivers, as arguments to \c configure. Once \c configure has
+ finished, type the following:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 12
+
+ This will build Qt statically. Note that unlike with a dynamic build,
+ building Qt statically will result in libraries without version numbers;
+ e.g. \c QtCore4.lib will be \c QtCore.lib. Also, we have used \c nmake
+ in all the examples, but if you use MinGW you must use
+ \c mingw32-make instead.
+
+ \note If you later need to reconfigure and rebuild Qt from the
+ same location, ensure that all traces of the previous configuration are
+ removed by entering the build directory and typing \c{nmake distclean}
+ before running \c configure again.
+
+ \section2 Linking the Application to the Static Version of Qt
+
+ Once Qt has finished building we can build the \l
+ {tools/plugandpaint}{Plug & Paint} application. First we must go
+ into the directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 13
+
+ We must then run \c qmake to create a new makefile for the
+ application, and do a clean build to create the statically linked
+ executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 14
+
+ You probably want to link against the release libraries, and you
+ can specify this when invoking \c qmake. Now, provided that
+ everything compiled and linked without any errors, we should have
+ a \c plugandpaint.exe file that is ready for deployment. One easy
+ way to check that the application really can be run stand-alone is
+ to copy it to a machine that doesn't have Qt or any Qt
+ applications installed, and run it on that machine.
+
+ Remember that if your application depends on compiler specific
+ libraries, these must still be redistributed along with your
+ application. You can check which libraries your application is
+ linking against by using the \c depends tool. For more
+ information, see the \l {Application Dependencies} section.
+
+ The \l {tools/plugandpaint}{Plug & Paint} example consists of
+ several components: The application itself (\l
+ {tools/plugandpaint}{Plug & Paint}), and the \l
+ {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
+ {tools/plugandpaintplugins/extrafilters}{Extra Filters}
+ plugins. Since we cannot deploy plugins using the static linking
+ approach, the application we have prepared is incomplete. It will
+ run, but the functionality will be disabled due to the missing
+ plugins. To deploy plugin-based applications we should use the
+ shared library approach.
+
+ \section1 Shared Libraries
+
+ We have two challenges when deploying the \l
+ {tools/plugandpaint}{Plug & Paint} application using the shared
+ libraries approach: The Qt runtime has to be correctly
+ redistributed along with the application executable, and the
+ plugins have to be installed in the correct location on the target
+ system so that the application can find them.
+
+ \section2 Building Qt as a Shared Library
+
+ We assume that you already have installed Qt as a shared library,
+ which is the default when installing Qt, in the \c C:\path\to\Qt
+ directory. For more information on how to build Qt, see the \l
+ {Installation} documentation.
+
+ \section2 Linking the Application to Qt as a Shared Library
+
+ After ensuring that Qt is built as a shared library, we can build
+ the \l {tools/plugandpaint}{Plug & Paint} application. First, we
+ must go into the directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 15
+
+ Now run \c qmake to create a new makefile for the application, and
+ do a clean build to create the dynamically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 16
+
+ This builds the core application, the following will build the
+ plugins:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 17
+
+ If everything compiled and linked without any errors, we will get
+ a \c plugandpaint.exe executable and the \c pnp_basictools.dll and
+ \c pnp_extrafilters.dll plugin files.
+
+ \section2 Creating the Application Package
+
+ To deploy the application, we must make sure that we copy the
+ relevant Qt DLL (corresponding to the Qt modules used in
+ the application) as well as the executable to the same directory
+ in the \c release subdirectory.
+
+ Remember that if your application depends on compiler specific
+ libraries, these must be redistributed along with your
+ application. You can check which libraries your application is
+ linking against by using the \c depends tool. For more
+ information, see the \l {Application Dependencies} section.
+
+ We'll cover the plugins shortly, but first we'll check that the
+ application will work in a deployed environment: Either copy the
+ executable and the Qt DLLs to a machine that doesn't have Qt
+ or any Qt applications installed, or if you want to test on the
+ build machine, ensure that the machine doesn't have Qt in its
+ environment.
+
+ If the application starts without any problems, then we have
+ successfully made a dynamically linked version of the \l
+ {tools/plugandpaint}{Plug & Paint} application. But the
+ application's functionality will still be missing since we have
+ not yet deployed the associated plugins.
+
+ Plugins work differently to normal DLLs, so we can't just
+ copy them into the same directory as our application's executable
+ as we did with the Qt DLLs. When looking for plugins, the
+ application searches in a \c plugins subdirectory inside the
+ directory of the application executable.
+
+ So to make the plugins available to our application, we have to
+ create the \c plugins subdirectory and copy over the relevant DLLs:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 18
+
+ An archive distributing all the Qt DLLs and application
+ specific plugins required to run the \l {tools/plugandpaint}{Plug
+ & Paint} application, would have to include the following files:
+
+ \table 100%
+ \header
+ \o Component \o {2, 1} File Name
+ \row
+ \o The executable
+ \o {2, 1} \c plugandpaint.exe
+ \row
+ \o The Basic Tools plugin
+ \o {2, 1} \c plugins\pnp_basictools.dll
+ \row
+ \o The ExtraFilters plugin
+ \o {2, 1} \c plugins\pnp_extrafilters.dll
+ \row
+ \o The Qt Core module
+ \o {2, 1} \c qtcore4.dll
+ \row
+ \o The Qt GUI module
+ \o {2, 1} \c qtgui4.dll
+ \endtable
+
+ In addition, the archive must contain the following compiler
+ specific libraries depending on your version of Visual Studio:
+
+ \table 100%
+ \header
+ \o \o VC++ 6.0 \o VC++ 7.1 (2003) \o VC++ 8.0 (2005) \o VC++ 9.0 (2008)
+ \row
+ \o The C run-time
+ \o \c msvcrt.dll
+ \o \c msvcr71.dll
+ \o \c msvcr80.dll
+ \o \c msvcr90.dll
+ \row
+ \o The C++ run-time
+ \o \c msvcp60.dll
+ \o \c msvcp71.dll
+ \o \c msvcp80.dll
+ \o \c msvcp90.dll
+ \endtable
+
+ To verify that the application now can be successfully deployed,
+ you can extract this archive on a machine without Qt and without
+ any compiler installed, and try to run it.
+
+ An alternative to putting the plugins in the plugins subdirectory
+ is to add a custom search path when you start your application
+ using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths().
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 19
+
+ One benefit of using plugins is that they can easily be made
+ available to a whole family of applications.
+
+ It's often most convenient to add the path in the application's \c
+ main() function, right after the QApplication object is
+ created. Once the path is added, the application will search it
+ for plugins, in addition to looking in the \c plugins subdirectory
+ in the application's own directory. Any number of additional paths
+ can be added.
+
+ \section2 Visual Studio 2005 Onwards
+
+ When deploying an application compiled with Visual Studio 2005 onwards,
+ there are some additional steps to be taken.
+
+ First, we need to copy the manifest file created when linking the
+ application. This manifest file contains information about the
+ application's dependencies on side-by-side assemblies, such as the runtime
+ libraries.
+
+ The manifest file needs to be copied into the \bold same folder as the
+ application executable. You do not need to copy the manifest files for
+ shared libraries (DLLs), since they are not used.
+
+ If the shared library has dependencies that are different from the
+ application using it, the manifest file needs to be embedded into the DLL
+ binary. Since Qt 4.1.3, the follwoing \c CONFIG options are available for
+ embedding manifests:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 20
+
+ To use the options, add
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 21
+
+ to your .pro file. The \c embed_manifest_dll option is enabled by default.
+
+ You can find more information about manifest files and side-by-side
+ assemblies at the
+ \l {http://msdn.microsoft.com/en-us/library/aa376307.aspx}{MSDN website}.
+
+ There are two ways to include the run time libraries: by bundling them
+ directly with your application or by installing them on the end-user's
+ system.
+
+ To bundle the run time libraries with your application, copy the directory
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 22
+
+ into the folder where your executable is, so that you are including a
+ \c Microsoft.VC80.CRT directory alongside your application's executable. If
+ you are bundling the runtimes and need to deploy plugins as well, you have
+ to remove the manifest from the plugins (embedded as a resource) by adding
+ the following line to the \c{.pro} file of the plugins you are compiling:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 23
+
+ \warning If you skip the step above, the plugins will not load on some
+ systems.
+
+ To install the runtime libraries on the end-user's system, you need to
+ include the appropriate Visual C++ Redistributable Package (VCRedist)
+ executable with your application and ensure that it is executed when the
+ user installs your application.
+
+ For example, on an 32-bit x86-based system, you would include the
+ \l{http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE}{vcredist_x86.exe}
+ executable. The \l{http://www.microsoft.com/downloads/details.aspx?familyid=526BF4A7-44E6-4A91-B328-A4594ADB70E5}{vcredist_IA64.exe}
+ and \l{http://www.microsoft.com/downloads/details.aspx?familyid=90548130-4468-4BBC-9673-D6ACABD5D13B}{vcredist_x64.exe}
+ executables provide the appropriate libraries for the IA64 and 64-bit x86
+ architectures, respectively.
+
+ \note The application you ship must be compiled with exactly the same
+ compiler version against the same C runtime version. This prevents
+ deploying errors caused by different versions of the C runtime libraries.
+
+
+ \section1 Application Dependencies
+
+ \section2 Additional Libraries
+
+ Depending on configuration, compiler specific libraries must be
+ redistributed along with your application. You can check which
+ libraries your application is linking against by using the
+ \l{Dependency Walker} tool. All you need to do is to run it like
+ this:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 24
+
+ This will provide a list of the libraries that your application
+ depends on and other information.
+
+ \image deployment-windows-depends.png
+
+ When looking at the release build of the Plug & Paint executable
+ (\c plugandpaint.exe) with the \c depends tool, the tool lists the
+ following immediate dependencies to non-system libraries:
+
+ \table 100%
+ \header
+ \o Qt
+ \o VC++ 6.0
+ \o VC++ 7.1 (2003)
+ \o VC++ 8.0 (2005)
+ \o MinGW
+ \row
+ \o \list
+ \o QTCORE4.DLL - The QtCore runtime
+ \o QTGUI4.DLL - The QtGui runtime
+ \endlist
+ \o \list
+ \o MSVCRT.DLL - The C runtime
+ \o MSVCP60.DLL - The C++ runtime (only when STL is installed)
+ \endlist
+ \o \list
+ \o MSVCR71.DLL - The C runtime
+ \o MSVCP71.DLL - The C++ runtime (only when STL is installed)
+ \endlist
+ \o \list
+ \o MSVCR80.DLL - The C runtime
+ \o MSVCP80.DLL - The C++ runtime (only when STL is installed)
+ \endlist
+ \o \list
+ \o MINGWM10.DLL - The MinGW run-time
+ \endlist
+ \endtable
+
+ When looking at the plugin DLLs the exact same dependencies
+ are listed.
+
+ \section2 Qt Plugins
+
+ Your application may also depend on one or more Qt plugins, such
+ as the JPEG image format plugin or a SQL driver plugin. Be sure
+ to distribute any Qt plugins that you need with your application,
+ and note that each type of plugin should be located within a
+ specific subdirectory (such as \c imageformats or \c sqldrivers)
+ within your distribution directory, as described below.
+
+ \note If you are deploying an application that uses QtWebKit to display
+ HTML pages from the World Wide Web, you should include all text codec
+ plugins to support as many HTML encodings possible.
+
+ The search path for Qt plugins is hard-coded into the QtCore library.
+ By default, the plugins subdirectory of the Qt installation is the first
+ plugin search path. However, pre-determined paths like the default one
+ have certain disadvantages. For example, they may not exist on the target
+ machine. For that reason, you need to examine various alternatives to make
+ sure that the Qt plugins are found:
+
+ \list
+
+ \o \l{qt-conf.html}{Using \c qt.conf}. This approach is the recommended
+ if you have executables in different places sharing the same plugins.
+
+ \o Using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths(). This approach is recommended if you only
+ have one executable that will use the plugin.
+
+ \o Using a third party installation utility to change the
+ hard-coded paths in the QtCore library.
+
+ \endlist
+
+ If you add a custom path using QApplication::addLibraryPath it could
+ look like this:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 54
+
+ Then qApp->libraryPaths() would return something like this:
+
+ "C:/customPath/plugins "
+ "C:/Qt/%VERSION%/plugins"
+ "E:/myApplication/directory/"
+
+ The executable will look for the plugins in these directories and
+ the same order as the QStringList returned by qApp->libraryPaths().
+ The newly added path is prepended to the qApp->libraryPaths() which
+ means that it will be searched through first. However, if you use
+ qApp->setLibraryPaths(), you will be able to determend which paths
+ and in which order they will be searched.
+
+ The \l{How to Create Qt Plugins} document outlines the issues you
+ need to pay attention to when building and deploying plugins for
+ Qt applications.
+
+ \section1 Related Third Party Resources
+
+ \list
+ \o \l{http://silmor.de/29}{Cross compiling Qt/Win Apps on Linux} covers the
+ process of cross-compiling Windows applications on Linux.
+ \o \l{http://divided-mind.blogspot.com/2007/09/cross-compiling-qt4win-on-linux.html}
+ {Cross-compiling Qt4/Win on Linux} provides another Linux-to-Windows
+ cross-compilation guide.
+ \endlist
+*/
+
+/*!
+ \page deployment-mac.html
+ \contentspage Deploying Qt Applications
+
+ \title Deploying an Application on Mac OS X
+
+ Starting with version 4.5, Qt now includes a \l {macdeploy}{deployment tool}
+ that automates the prodecures described in this document.
+
+ This documentation will describe how to create a bundle, and how
+ to make sure that the application will find the resources it needs
+ at run-time. We will demonstrate the procedures in terms of
+ deploying the \l {tools/plugandpaint}{Plug & Paint} application
+ that is provided in Qt's examples directory.
+
+ \tableofcontents
+
+ \section1 The Bundle
+
+ On the Mac, a GUI application must be built and run from a
+ bundle. A bundle is a directory structure that appears as a single
+ entity when viewed in the Finder. A bundle for an application
+ typcially contains the executable and all the resources it
+ needs. See the image below:
+
+ \image deployment-mac-bundlestructure.png
+
+ The bundle provides many advantages to the user. One primary
+ advantage is that, since it is a single entity, it allows for
+ drag-and-drop installation. As a programmer you can access bundle
+ information in your own code. This is specific to Mac OS X and
+ beyond the scope of this document. More information about bundles
+ is available on \l
+ {http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFBundles/index.html}{Apple's Developer Website}.
+
+ A Qt command line application on Mac OS X works similar to a
+ command line application on Unix and Windows. You probably don't
+ want to run it in a bundle: Add this to your application's .pro:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 26
+
+ This will tell \c qmake not to put the executable inside a
+ bundle. Please refer to the \l{Deploying an Application on
+ X11 Platforms}{X11 deployment documentation} for information about how
+ to deploy these "bundle-less" applications.
+
+ \section1 Xcode
+
+ We will only concern ourselves with command-line tools here. While
+ it is possible to use Xcode for this, Xcode has changed enough
+ between each version that it makes it difficult to document it
+ perfectly for each version. A future version of this document may
+ include more information for using Xcode in the deployment
+ process.
+
+ \section1 Static Linking
+
+ If you want to keep things simple by only having a few files to
+ deploy, then you must build everything statically.
+
+ \section2 Building Qt Statically
+
+ Start by installing a static version of the Qt library. Remember
+ that you will not be able to use plugins and you must build in all
+ the image formats, SQL drivers, etc..
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 27
+
+ You can check the various options that are available by running \c
+ configure -help.
+
+ \section2 Linking the Application to the Static Version of Qt
+
+ Once Qt is built statically, the next step is to regenerate the
+ makefile and rebuild the application. First, we must go into the
+ directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 28
+
+ Now run \c qmake to create a new makefile for the application, and do
+ a clean build to create the statically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 29
+
+ You probably want to link against the release libraries, and you
+ can specify this when invoking \c qmake. If you have Xcode Tools
+ 1.5 or higher installed, you may want to take advantage of "dead
+ code stripping" to reduce the size of your binary even more. You
+ can do this by passing \c {LIBS+= -dead_strip} to \c qmake in
+ addition to the \c {-config release} parameter. This doesn't have
+ as large an effect if you are using GCC 4, since Qt will then have
+ function visibility hints built-in, but if you use GCC 3.3, it
+ could make a difference.
+
+ Now, provided that everything compiled and linked without any
+ errors, we should have a \c plugandpaint.app bundle that is ready
+ for deployment. One easy way to check that the application really
+ can be run stand-alone is to copy the bundle to a machine that
+ doesn't have Qt or any Qt applications installed, and run the
+ application on that machine.
+
+ You can check what other libraries your application links to using
+ the \c otool:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 30
+
+ Here is what the output looks like for the static \l
+ {tools/plugandpaint}{Plug & Paint}:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 31
+
+ For more information, see the \l {Application Dependencies}
+ section.
+
+ If you see \e Qt libraries in the output, it probably
+ means that you have both dynamic and static Qt libraries installed
+ on your machine. The linker will always choose dynamic over
+ static. There are two solutions: Either move your Qt dynamic
+ libraries (\c .dylibs) away to another directory while you link
+ the application and then move them back, or edit the \c Makefile
+ and replace link lines for the Qt libraries with the absolute path
+ to the static libraries. For example, replace
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 32
+
+ with
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 33
+
+ The \l {tools/plugandpaint}{Plug & Paint} example consists of
+ several components: The core application (\l
+ {tools/plugandpaint}{Plug & Paint}), and the \l
+ {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
+ {tools/plugandpaintplugins/extrafilters}{Extra Filters}
+ plugins. Since we cannot deploy plugins using the static linking
+ approach, the bundle we have prepared so far is incomplete. The
+ application will run, but the functionality will be disabled due
+ to the missing plugins. To deploy plugin-based applications we
+ should use the framework approach.
+
+ \section1 Frameworks
+
+ We have two challenges when deploying the \l
+ {tools/plugandpaint}{Plug & Paint} application using frameworks:
+ The Qt runtime has to be correctly redistributed along with the
+ application bundle, and the plugins have to be installed in the
+ correct location so that the application can find them.
+
+ When distributing Qt with your application using frameworks, you
+ have two options: You can either distribute Qt as a private
+ framework within your application bundle, or you can distribute Qt
+ as a standard framework (alternatively use the Qt frameworks in
+ the installed binary). These two approaches are essentially the
+ same. The latter option is good if you have many Qt applications
+ and you would prefer to save memory. The former is good if you
+ have Qt built in a special way, or want to make sure the framework
+ is there. It just comes down to where you place the Qt frameworks.
+
+ \section2 Building Qt as Frameworks
+
+ We assume that you already have installed Qt as frameworks, which
+ is the default when installing Qt, in the /path/to/Qt
+ directory. For more information on how to build Qt, see the \l
+ Installation documentation.
+
+ When installing, the identification name of the frameworks will
+ also be set. The identification name is what the dynamic linker
+ (\c dyld) uses to find the libraries for your application.
+
+ \section2 Linking the Application to Qt as Frameworks
+
+ After ensuring that Qt is built as frameworks, we can build the \l
+ {tools/plugandpaint}{Plug & Paint} application. First, we must go
+ into the directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 34
+
+ Now run qmake to create a new makefile for the application, and do
+ a clean build to create the dynamically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 35
+
+ This builds the core application, the following will build the
+ plugins:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 36
+
+ Now run the \c otool for the Qt frameworks, for example Qt Gui:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 37
+
+ You will get the following output:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 38
+
+ For the Qt frameworks, the first line (i.e. \c
+ {path/to/Qt/lib/QtGui.framework/Versions/4/QtGui (compatibility
+ version 4.0.0, current version 4.0.1)}) becomes the framework's
+ identification name which is used by the dynamic linker (\c dyld).
+
+ But when you are deploying the application, your users may not
+ have the Qt frameworks installed in the specified location. For
+ that reason, you must either provide the frameworks in an agreed
+ upon location, or store the frameworks in the bundle itself.
+ Regardless of which solution you choose, you must make sure that
+ the frameworks return the proper identification name for
+ themselves, and that the application will look for these
+ names. Luckily we can control this with the \c install_name_tool
+ command-line tool.
+
+ The \c install_name_tool works in two modes, \c -id and \c
+ -change. The \c -id mode is for libraries and frameworks, and
+ allows us to specify a new identification name. We use the \c
+ -change mode to change the paths in the application.
+
+ Let's test this out by copying the Qt frameworks into the Plug &
+ Paint bundle. Looking at \c otool's output for the bundle, we can
+ see that we must copy both the QtCore and QtGui frameworks into
+ the bundle. We will assume that we are in the directory where we
+ built the bundle.
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 39
+
+ First we create a \c Frameworks directory inside the bundle. This
+ follows the Mac OS X application convention. We then copy the
+ frameworks into the new directory. Since frameworks contain
+ symbolic links, and we want to preserve them, we use the \c -R
+ option.
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 40
+
+ Then we run \c install_name_tool to set the identification names
+ for the frameworks. The first argument after \c -id is the new
+ name, and the second argument is the framework which
+ identification we wish to change. The text \c @executable_path is
+ a special \c dyld variable telling \c dyld to start looking where
+ the executable is located. The new names specifies that these
+ frameworks will be located "one directory up and over" in the \c
+ Frameworks directory.
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 41
+
+ Now, the dynamic linker knows where to look for QtCore and
+ QtGui. Then we must make the application aware of the library
+ locations as well using \c install_name_tool's \c -change mode.
+ This basically comes down to string replacement, to match the
+ identification names that we set for the frameworks.
+
+ Finally, since the QtGui framework depends on QtCore, we must
+ remember to change the reference for QtGui:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 42
+
+ After all this we can run \c otool again and see that the
+ application will look in the right locations.
+
+ Of course, the thing that makes the \l {tools/plugandpaint}{Plug &
+ Paint} example interesting are its plugins. The basic steps we
+ need to follow with plugins are:
+
+ \list
+ \o Put the plugins inside the bundle
+ \o Make sure that the plugins use the correct library using the
+ \c install_name_tool
+ \o Make sure that the application knows where to get the plugins
+ \endlist
+
+ While we can put the plugins anywhere we want in the bundle, the
+ best location to put them is under Contents/Plugins. When we built
+ the Plug & Paint plugins, the \c DESTDIR variable in their \c .pro
+ file put the plugins' \c .dylib files in a \c plugins subdirectory
+ in the \c plugandpaint directory. So, in this example, all we need
+ to do is move this directory:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 43
+
+ If we run \c otool on for example the \l
+ {tools/plugandpaintplugins/basictools}{Basic Tools} plugin's \c
+ .dylib file we get the following information.
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 44
+
+ Then we can see that the plugin links to the Qt frameworks it was
+ built against. Since we want the plugins to use the framework in
+ the application bundle we change them the same way as we did for
+ the application. For example for the Basic Tools plugin:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 45
+
+
+ We must also modify the code in \c
+ tools/plugandpaint/mainwindow.cpp to \l {QDir::cdUp()}{cdUp()} one
+ directory since the plugins live in the bundle. Add the following
+ code to the \c mainwindow.cpp file:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 46
+
+ \table
+ \row
+ \o \inlineimage deployment-mac-application.png
+ \o
+ The additional code in \c tools/plugandpaint/mainwindow.cpp also
+ enables us to view the plugins in the Finder, as shown to the left.
+
+ We can also add plugins extending Qt, for example adding SQL
+ drivers or image formats. We just need to follow the directory
+ structure outlined in plugin documentation, and make sure they are
+ included in the QCoreApplication::libraryPaths(). Let's quickly do
+ this with the image formats, following the approach from above.
+
+ Copy Qt's image format plugins into the bundle:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 47
+
+ Use \c install_name_tool to link the plugins to the frameworks in
+ the bundle:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 48
+
+ Then we update the source code in \c tools/plugandpaint/main.cpp
+ to look for the new plugins. After constructing the
+ QApplication, we add the following code:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 49
+
+ First, we tell the application to only look for plugins in this
+ directory. In our case, this is what we want since we only want to
+ look for the plugins that we distribute with the bundle. If we
+ were part of a bigger Qt installation we could have used
+ QCoreApplication::addLibraryPath() instead.
+
+ \endtable
+
+ \warning When deploying plugins, and thus make changes to the
+ source code, the default identification names are reset when
+ rebuilding the application, and you must repeat the process of
+ making your application link to the Qt frameworks in the bundle
+ using \c install_name_tool.
+
+ Now you should be able to move the application to another Mac OS X
+ machine and run it without Qt installed. Alternatively, you can
+ move your frameworks that live outside of the bundle to another
+ directory and see if the application still runs.
+
+ If you store the frameworks in another location than in the
+ bundle, the technique of linking your application is similar; you
+ must make sure that the application and the frameworks agree where
+ to be looking for the Qt libraries as well as the plugins.
+
+ \section2 Creating the Application Package
+
+ When you are done linking your application to Qt, either
+ statically or as frameworks, the application is ready to be
+ distributed. Apple provides a fair bit of information about how to
+ do this and instead of repeating it here, we recommend that you
+ consult their \l
+ {http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/index.html}{software delivery}
+ documentation.
+
+ Although the process of deploying an application do have some
+ pitfalls, once you know the various issues you can easily create
+ packages that all your Mac OS X users will enjoy.
+
+ \section1 Application Dependencies
+
+ \section2 Qt Plugins
+
+ Your application may also depend on one or more Qt plugins, such
+ as the JPEG image format plugin or a SQL driver plugin. Be sure
+ to distribute any Qt plugins that you need with your application,
+ and note that each type of plugin should be located within a
+ specific subdirectory (such as \c imageformats or \c sqldrivers)
+ within your distribution directory, as described below.
+
+ \note If you are deploying an application that uses QtWebKit to display
+ HTML pages from the World Wide Web, you should include all text codec
+ plugins to support as many HTML encodings possible.
+
+ The search path for Qt plugins (as well as a few other paths) is
+ hard-coded into the QtCore library. By default, the first plugin
+ search path will be hard-coded as \c /path/to/Qt/plugins. But
+ using pre-determined paths has certain disadvantages. For example,
+ they may not exist on the target machine. For that reason you need
+ to examine various alternatives to make sure that the Qt plugins
+ are found:
+
+ \list
+
+ \o \l{qt-conf.html}{Using \c qt.conf}. This is the recommended
+ approach since it provides the most flexibility.
+
+ \o Using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths().
+
+ \o Using a third party installation utility to change the
+ hard-coded paths in the QtCore library.
+
+ \endlist
+
+ The \l{How to Create Qt Plugins} document outlines the issues you
+ need to pay attention to when building and deploying plugins for
+ Qt applications.
+
+ \section2 Additional Libraries
+
+ You can check which libraries your application is linking against
+ by using the \c otool tool. To use \c otool, all you need to do is
+ to run it like this:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 50
+
+ Unlike the deployment processes on \l {Deploying an Application on
+ X11 Platforms}{X11} and \l {Deploying an Application on
+ Windows}{Windows}, compiler specific libraries rarely have to
+ be redistributed along with your application. But since Qt can be
+ configured, built, and installed in several ways on Mac OS X,
+ there are also several ways to deploy applications. Typically your
+ goals help determine how you are going to deploy the
+ application. The last sections describe a couple of things to keep
+ in mind when you are deploying your application.
+
+ \section2 Mac OS X Version Dependencies
+
+ Qt 4.2 has been designed to be built and deployed on Mac OS X 10.3
+ up until the current version as of this writing, Mac OS X 10.4 and
+ all their minor releases. Qt achieves this by using "weak
+ linking." This means that Qt tests if a function added in newer
+ versions of Mac OS X is available on the computer it is running on
+ before it uses it. This results in getting access to newer
+ features when running on newer versions of OS X while still
+ remaining compatible on older versions.
+
+ For more information about cross development issues on Mac OS X,
+ see \l
+ {http://developer.apple.com/documentation/DeveloperTools/Conceptual/cross_development/index.html}{Apple's Developer Website}.
+
+ Since the linker is set to be compatible with all OS X version, you have to
+ change the \c MACOSX_DEPLOYMENT_TARGET environment variable to get weak
+ linking to work for your application. You can add:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51
+
+ to your .pro file and qmake will take care of this for you.
+
+ However, there is a bit of a wrinkle to keep in mind when your are
+ deploying. Mac OS X 10.4 ("Tiger") ships GCC 4.0 as its default
+ compiler. This is also the GCC compiler we use for building the
+ binary Qt package. If you use GCC 4.0 to build your application,
+ it will link against a dynamic libstdc++ that is only available on
+ Mac OS X 10.4 and Mac OS X 10.3.9. The application will refuse to
+ run on older versions of the operating system.
+
+ For more information about C++ runtime environment, see \l
+ {http://developer.apple.com/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/index.html}{Apple's Developer Website}
+
+ If you want to deploy to versions of Mac OS X earlier than 10.3.9,
+ you must build with GCC 3.3 which is the default on Mac OS X
+ 10.3. GCC 3.3 is also available on the Mac OS X 10.4 "Xcode Tools"
+ CD and as a download for earlier versions of Mac OS X from Apple
+ (\l {https://connect.apple.com/}{connect.apple.com}). You can use
+ Apple's \c gcc_select(1) command line tool to switch the default
+ complier on your system.
+
+ \section3 Deploying Phonon Applications on Mac OS X
+
+ \list
+ \o If you build your Phonon application on Tiger, it will work on
+ Tiger, Leopard and Panther.
+ \o If you build your application on Leopard, it will \bold not work
+ on Panther unless you rename the libraries with the following command
+ after you have built your application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51a
+
+ This command must be invoked in the directory where
+ \c{libphonon_qt7.dylib} is located, usually in
+ \c{yourapp.app/Contents/plugins/phonon_backend/}.
+ \o The \l {macdeploy}{deployment tool} will perform this step for you.
+
+ \o If you are using Leopard, but would like to build your application
+ against Tiger, you can use:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51b
+ \endlist
+
+ \section2 Architecture Dependencies
+
+ The Qt for Mac OS X libraries, tools, and examples can be built "universal"
+ (i.e. they run natively on both Intel and PowerPC machines). This
+ is accomplished by passing \c -universal on the \c configure line
+ of the source package, and requires that you use GCC 4.0.x. On
+ PowerPC hardware you will need to pass the universal SDK as a
+ command line argument to the Qt configure command. For example:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 52
+
+ From 4.1.1 the Qt binary package is already universal.
+
+ If you want to create a binary that runs on older versions of
+ PowerPC and x86, it is possible to build Qt for the PowerPC using
+ GCC 3.3, and for x86 one using GCC 4.0, and use Apple's \c lipo(1)
+ tool to stitch them together. This is beyond the scope of this
+ document and is not something we have tried, but Apple documents
+ it on their \l
+ {http://developer.apple.com/documentation/}{developer website}.
+
+ Once you have a universal Qt, \a qmake will generate makefiles
+ that will build for its host architecture by default. If you want
+ to build for a specific architecture, you can control this with
+ the \c CONFIG line in your \c .pro file. Use \c CONFIG+=ppc for
+ PowerPC, and \c CONFIG+=x86 for x86. If you desire both, simply
+ add both to the \c CONFIG line. PowerPC users also need an
+ SDK. For example:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 53
+
+ Besides \c lipo, you can also check your binaries with the \c file(1)
+ command line tool or the Finder.
+
+ \section1 The Mac Deployment Tool
+ \target macdeploy
+ The Mac deployment tool can be found in QTDIR/bin/macdeployqt. It is
+ designed to automate the process of creating a deployable
+ application bundle that contains the Qt libraries as private
+ frameworks.
+
+ The mac deployment tool also deploys the Qt plugins, according
+ to the following rules:
+ \list
+ \o Debug versions of the plugins are not deployed.
+ \o The designer plugins are not deployed.
+ \o The Image format plugins are always deployed.
+ \o SQL driver plugins are deployed if the application uses the QtSql module.
+ \o Script plugins are deployed if the application uses the QtScript module.
+ \o The Phonon backend plugin is deployed if the application uses the \l{Phonon Module} {Phonon} module.
+ \o The svg icon plugin is deployed if the application uses the QtSvg module.
+ \o The accessibility plugin is always deployed.
+ \o Accessibility for Qt3Support is deployed if the application uses the Qt3Support module.
+ \endlist
+
+ macdeployqt supports the following options:
+ \list
+ \o -no-plugins: Skip plugin deployment
+ \o -dmg : Create a .dmg disk image
+ \o -no-strip : Don't run 'strip' on the binaries
+ \endlist
+*/
diff --git a/doc/src/deployment/qt-conf.qdoc b/doc/src/deployment/qt-conf.qdoc
new file mode 100644
index 0000000..31a399f
--- /dev/null
+++ b/doc/src/deployment/qt-conf.qdoc
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-conf.html
+
+ \title Using qt.conf
+
+ The \c qt.conf file overrides the hard-coded paths that are
+ compiled into the Qt library. These paths are accessible using the
+ QLibraryInfo class. Without \c qt.conf, the functions in
+ QLibraryInfo return these hard-coded paths; otherwise they return
+ the paths as specified in \c qt.conf.
+
+ Without \c qt.conf, the Qt libraries will use the hard-coded paths
+ to look for plugins, translations, and so on. These paths may not
+ exist on the target system, or they may not be
+ accesssible. Because of this, you need \c qt.conf to make the Qt
+ libraries look elsewhere.
+
+ QLibraryInfo will load \c qt.conf from one of the following locations:
+
+ \list 1
+
+ \o \c :/qt/etc/qt.conf using the resource system
+
+ \o on Mac OS X, in the Resource directory inside the appliction
+ bundle, for example \c assistant.app/Contents/Resources/qt.conf
+
+ \o in the directory containing the application executable, i.e.
+ QCoreApplication::applicationDirPath() + QDir::separator() + "qt.conf"
+
+ \endlist
+
+ The \c qt.conf file is an INI text file, as described in the \l
+ {QSettings::Format}{QSettings} documentation. The file should have
+ a \c Paths group which contains the entries that correspond to
+ each value of the QLibraryInfo::LibraryLocation enum. See the
+ QLibraryInfo documentation for details on the meaning of the
+ various locations.
+
+ \table
+
+ \header \o Entry \o Default Value
+
+ \row \o Prefix \o QCoreApplication::applicationDirPath()
+ \row \o Documentation \o \c doc
+ \row \o Headers \o \c include
+ \row \o Libraries \o \c lib
+ \row \o Binaries \o \c bin
+ \row \o Plugins \o \c plugins
+ \row \o Data \o \c .
+ \row \o Translations \o \c translations
+ \row \o Settings \o \c .
+ \row \o Examples \o \c .
+ \row \o Demos \o \c .
+
+ \endtable
+
+ Absolute paths are used as specified in the \c qt.conf file. All
+ paths are relative to the \c Prefix. On Windows and X11, the \c
+ Prefix is relative to the directory containing the application
+ executable (QCoreApplication::applicationDirPath()). On Mac OS X,
+ the \c Prefix is relative to the \c Contents in the application
+ bundle. For example, \c application.app/Contents/plugins/ is the
+ default location for loading Qt plugins. Note that the plugins
+ need to be placed in specific sub-directories under the
+ \c{plugins} directory (see \l{How to Create Qt Plugins} for
+ details).
+
+ For example, a \c qt.conf file could contain the following:
+
+ \snippet doc/src/snippets/code/doc_src_qt-conf.qdoc 0
+
+ Subgroups of the \c Paths group may be used to specify locations
+ for specific versions of the Qt libraries. Such subgroups are of
+ the form \c Paths/x.y.z, where x is the major version of the Qt
+ libraries, y the minor, and z the patch level. The subgroup that
+ most closely matches the current Qt version is used. If no
+ subgroup matches, the \c Paths group is used as the fallback. The
+ minor and patch level values may be omitted, in which case they
+ default to zero.
+
+ For example, given the following groups:
+
+ \snippet doc/src/snippets/code/doc_src_qt-conf.qdoc 1
+
+ The current version will be matched as shown:
+
+ \list
+ \o 4.0.1 matches \c Paths/4
+ \o 4.1.5 matches \c Paths/4.1
+ \o 4.6.3 matches \c Paths/4.2.5
+ \o 5.0.0 matches \c Paths
+ \o 6.0.2 matches \c Paths/6
+ \endlist
+*/
diff --git a/doc/src/qtconfig.qdoc b/doc/src/deployment/qtconfig.qdoc
index c90061f..c90061f 100644
--- a/doc/src/qtconfig.qdoc
+++ b/doc/src/deployment/qtconfig.qdoc
diff --git a/doc/src/designer-manual.qdoc b/doc/src/designer-manual.qdoc
deleted file mode 100644
index eabde74..0000000
--- a/doc/src/designer-manual.qdoc
+++ /dev/null
@@ -1,2742 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page designer-manual.html
-
- \title Qt Designer Manual
- \ingroup qttools
- \keyword Qt Designer
-
- \QD is Qt's tool for designing and building graphical user
- interfaces (GUIs) from Qt components. You can compose and customize your
- widgets or dialogs in a what-you-see-is-what-you-get (WYSIWYG) manner, and
- test them using different styles and resolutions.
-
- Widgets and forms created with \QD integrated seamlessly with programmed
- code, using Qt's signals and slots mechanism, that lets you easily assign
- behavior to graphical elements. All properties set in \QD can be changed
- dynamically within the code. Furthermore, features like widget promotion
- and custom plugins allow you to use your own components with \QD.
-
- If you are new to \QD, you can take a look at the
- \l{Getting To Know Qt Designer} document. For a quick tutorial on how to
- use \QD, refer to \l{A Quick Start to Qt Designer}.
-
- Qt Designer 4.5 boasts a long list of improvements. For a detailed list of
- what is new, refer \l{What's New in Qt Designer 4.5}.
-
- \image designer-multiple-screenshot.png
-
- For more information on using \QD, you can take a look at the following
- links:
-
- \list
- \o \l{Qt Designer's Editing Modes}
- \list
- \o \l{Qt Designer's Widget Editing Mode}{Widget Editing Mode}
- \o \l{Qt Designer's Signals and Slots Editing Mode}
- {Signals and Slots Editing Mode}
- \o \l{Qt Designer's Buddy Editing Mode}
- {Buddy Editing Mode}
- \o \l{Qt Designer's Tab Order Editing Mode}
- {Tab Order Editing Mode}
- \endlist
- \o \l{Using Layouts in Qt Designer}
- \o \l{Saving, Previewing and Printing Forms in Qt Designer}
- \o \l{Using Containers in Qt Designer}
- \o \l{Creating Main Windows in Qt Designer}
- \o \l{Editing Resources with Qt Designer}
- \o \l{Using Stylesheets with Qt Designer}
- \o \l{Using a Designer .ui File in Your Application}
- \endlist
-
- For advanced usage of \QD, you can refer to these links:
-
- \list
- \o \l{Customizing Qt Designer Forms}
- \o \l{Using Custom Widgets with Qt Designer}
- \o \l{Creating Custom Widgets for Qt Designer}
- \o \l{Creating Custom Widget Extensions}
- \o \l{Qt Designer's UI File Format}
- \endlist
-
-
- \section1 Legal Notices
-
- Some source code in \QD is licensed under specific highly permissive
- licenses from the original authors. We gratefully acknowledges
- these contributions to \QD and all users of \QD should also acknowledge
- these contributions and quote the following license statements in an
- appendix to the documentation.
-
- \list
- \i \l{Implementation of the Recursive Shadow Casting Algorithm in Qt Designer}
- \endlist
-*/
-
-
-
-/*!
- \page designer-whats-new.html
- \contentspage {Qt Designer Manual}{Contents}
-
-
- \title What's New in Qt Designer 4.5
-
- \section1 General Changes
-
-
- \table
- \header
- \i Widget Filter Box
- \i Widget Morphing
- \i Disambiguation Field
- \row
- \i \inlineimage designer-widget-filter.png
- \i \inlineimage designer-widget-morph.png
- \i \inlineimage designer-disambiguation.png
- \endtable
-
- \list 1
- \i Displaying only icons in the \gui{Widget Box}: It is now possible
- for the \gui{Widget Box} to display icons only. Simply select
- \gui{Icon View} from the context menu.
- \i Filter for \gui{Widget Box}: A filter is now provided to quickly
- locate the widget you need. If you use a particular widget
- frequently, you can always add it to the
- \l{Getting to Know Qt Designer#WidgetBox}{scratch pad}.
- \i Support for QButtonGroup: It is available via the context
- menu of a selection of QAbstractButton objects.
- \i Improved support for item widgets: The item widgets' (e.g.,
- QListWidget, QTableWidget, and QTreeWidget) contents dialogs have
- been improved. You can now add translation comments and also modify
- the header properties.
- \i Widget morphing: A widget can now be morphed from one type to
- another with its layout and properties preserved. To begin, click
- on your widget and select \gui{Morph into} from the context menu.
- \i Disambiguation field: The property editor now shows this extra
- field under the \gui{accessibleDescription} property. This field
- has been introduced to aid translators in the case of two source
- texts being the same but used for different purposes. For example,
- a dialog could have two \gui{Add} buttons for two different
- reasons. \note To maintain compatibility, comments in \c{.ui} files
- created prior to Qt 4.5 will be listed in the \gui{Disambiguation}
- field.
- \endlist
-
-
-
- \section1 Improved Shortcuts for the Editing Mode
-
- \list
- \i The \key{Shift+Click} key combination now selects the ancestor for
- nested layouts. This iterates from one ancestor to the other.
-
- \i The \key{Ctrl} key is now used to toggle and copy drag. Previously
- this was done with the \key{Shift} key but is now changed to
- conform to standards.
-
- \i The left mouse button does rubber band selection for form windows;
- the middle mouse button does rubber band selection everywhere.
- \endlist
-
-
- \section1 Layouts
- \list
- \i It is now possible to switch a widget's layout without breaking it
- first. Simply select the existing layout and change it to another
- type using the context menu or the layout buttons on the toolbar.
-
- \i To quickly populate a \gui{Form Layout}, you can now use the
- \gui{Add form layout row...} item available in the context menu or
- double-click on the red layout.
- \endlist
-
-
- \section1 Support for Embedded Design
-
- \table
- \header
- \i Comboboxes to Select a Device Profile
- \row
- \i \inlineimage designer-embedded-preview.png
- \endtable
-
- It is now possible to specify embedded device profiles, e.g., Style, Font,
- Screen DPI, resolution, default font, etc., in \gui{Preferences}. These
- settings will affect the \gui{Form Editor}. The profiles will also be
- visible with \gui{Preview}.
-
-
- \section1 Related Classes
-
- \list
- \i QUiLoader \mdash forms loaded with this class will now react to
- QEvent::LanguageChange if QUiLoader::setLanguageChangeEnabled() or
- QUiLoader::isLanguageChangeEnabled() is set to true.
-
- \i QDesignerCustomWidgetInterface \mdash the
- \l{QDesignerCustomWidgetInterface::}{domXml()} function now has new
- attributes for its \c{<ui>} element. These attributes are
- \c{language} and \c{displayname}. The \c{language} element can be
- one of the following "", "c++", "jambi". If this element is
- specified, it must match the language in which Designer is running.
- Otherwise, this element will not be available. The \c{displayname}
- element represents the name that will be displayed in the
- \gui{Widget Box}. Previously this was hardcoded to be the class
- name.
-
- \i QWizard \mdash QWizard's page now has a string \c{id} attribute that
- can be used to fill in enumeration values to be used by the
- \c{uic}. However, this attribute has no effect on QUiLoader.
- \endlist
-*/
-
-
-/*!
- \page designer-to-know.html
- \contentspage {Qt Designer Manual}{Contents}
-
-
- \title Getting to Know Qt Designer
-
- \tableofcontents
-
- \image designer-screenshot.png
-
- \section1 Launching Designer
-
- The way that you launch \QD depends on your platform:
-
- \list
- \i On Windows, click the Start button, under the \gui Programs submenu,
- open the \gui{Qt 4} submenu and click \gui Designer.
- \i On Unix or Linux, you might find a \QD icon on the desktop
- background or in the desktop start menu under the \gui Programming
- or \gui Development submenus. You can launch \QD from this icon.
- Alternatively, you can type \c{designer} in a terminal window.
- \i On Mac OS X, double click on \QD in \gui Finder.
- \endlist
-
- \section1 The User Interface
-
- When used as a standalone application, \QD's user interface can be
- configured to provide either a multi-window user interface (the default
- mode), or it can be used in docked window mode. When used from within an
- integrated development environment (IDE) only the multi-window user
- interface is available. You can switch modes in the \gui Preferences dialog
- from the \gui Edit menu.
-
- In multi-window mode, you can arrange each of the tool windows to suit your
- working style. The main window consists of a menu bar, a tool bar, and a
- widget box that contains the widgets you can use to create your user
- interface.
-
- \target MainWindow
- \table
- \row
- \i \inlineimage designer-main-window.png
- \i \bold{Qt Designer's Main Window}
-
- The menu bar provides all the standard actions for managing forms,
- using the clipboard, and accessing application-specific help.
- The current editing mode, the tool windows, and the forms in use can
- also be accessed via the menu bar.
-
- The tool bar displays common actions that are used when editing a form.
- These are also available via the main menu.
-
- The widget box provides common widgets and layouts that are used to
- design components. These are grouped into categories that reflect their
- uses or features.
- \endtable
-
- Most features of \QD are accessible via the menu bar, the tool bar, or the
- widget box. Some features are also available through context menus that can
- be opened over the form windows. On most platforms, the right mouse is used
- to open context menus.
-
- \target WidgetBox
- \table
- \row
- \i \inlineimage designer-widget-box.png
- \i \bold{Qt Designer's Widget Box}
-
- The widget box provides a selection of standard Qt widgets, layouts,
- and other objects that can be used to create user interfaces on forms.
- Each of the categories in the widget box contain widgets with similar
- uses or related features.
-
- \note Since Qt 4.4, new widgets have been included, e.g.,
- QPlainTextEdit, QCommandLinkButton, QScrollArea, QMdiArea, and
- QWebView.
-
- You can display all of the available objects in a category by clicking
- on the handle next to the category label. When in
- \l{Qt Designer's Widget Editing Mode}{Widget Editing
- Mode}, you can add objects to a form by dragging the appropriate items
- from the widget box onto the form, and dropping them in the required
- locations.
-
- \QD provides a scratch pad feature that allows you to collect
- frequently used objects in a separate category. The scratch pad
- category can be filled with any widget currently displayed in a form
- by dragging them from the form and dropping them onto the widget box.
- These widgets can be used in the same way as any other widgets, but
- they can also contain child widgets. Open a context menu over a widget
- to change its name or remove it from the scratch pad.
- \endtable
-
-
- \section1 The Concept of Layouts in Qt
-
- A layout is used to arrange and manage the elements that make up a user
- interface. Qt provides a number of classes to automatically handle layouts
- -- QHBoxLayout, QVBoxLayout, QGridLayout, and QFormLayout. These classes
- solve the challenge of laying out widgets automatically, providing a user
- interface that behaves predictably. Fortunately knowledge of the layout
- classes is not required to arrange widgets with \QD. Instead, select one of
- the \gui{Lay Out Horizontally}, \gui{Lay Out in a Grid}, etc., options from
- the context menu.
-
- Each Qt widget has a recommended size, known as \l{QWidget::}{sizeHint()}.
- The layout manager will attempt to resize a widget to meet its size hint.
- In some cases, there is no need to have a different size. For example, the
- height of a QLineEdit is always a fixed value, depending on font size and
- style. In other cases, you may require the size to change, e.g., the width
- of a QLineEdit or the width and height of item view widgets. This is where
- the widget size constraints -- \l{QWidget::minimumSize()}{minimumSize} and
- \l{QWidget::maximumSize()}{maximumSize} constraints come into play. These
- are properties you can set in the property editor. For example, to override
- the default \l{QWidget::}{sizeHint()}, simply set
- \l{QWidget::minimumSize()}{minimumSize} and \l{QWidget::maximumSize()}
- {maximumSize} to the same value. Alternatively, to use the current size as
- a size constraint value, choose one of the \gui{Size Constraint} options
- from the widget's context menu. The layout will then ensure that those
- constraints are met. To control the size of your widgets via code, you can
- reimplement \l{QWidget::}{sizeHint()} in your code.
-
- The screenshot below shows the breakdown of a basic user interface designed
- using a grid. The coordinates on the screenshot show the position of each
- widget within the grid.
-
- \image addressbook-tutorial-part3-labeled-layout.png
-
- \note Inside the grid, the QPushButton objects are actually nested. The
- buttons on the right are first placed in a QVBoxLayout; the buttons at the
- bottom are first placed in a QHBoxLayout. Finally, they are put into
- coordinates (1,2) and (3,1) of the QGridLayout.
-
- To visualize, imagine the layout as a box that shrinks as much as possible,
- attempting to \e squeeze your widgets in a neat arrangement, and, at the
- same time, maximize the use of available space.
-
- Qt's layouts help when you:
-
- \list 1
- \i Resize the user face to fit different window sizes.
- \i Resize elements within the user interface to suit different
- localizations.
- \i Arrange elements to adhere to layout guidelines for different
- platforms.
- \endlist
-
- So, you no longer have to worry about rearranging widgets for different
- platforms, settings, and languages.
-
- The example below shows how different localizations can affect the user
- interface. When a localization requires more space for longer text strings
- the Qt layout automatically scales to accommodate this, while ensuring that
- the user interface looks presentable and still matches the platform
- guidelines.
-
- \table
- \header
- \i A Dialog in English
- \i A Dialog in French
- \row
- \i \image designer-english-dialog.png
- \i \image designer-french-dialog.png
- \endtable
-
- The process of laying out widgets consists of creating the layout hierarchy
- while setting as few widget size constraints as possible.
-
- For a more technical perspective on Qt's layout classes, refer to the
- \l{Layout Classes} document.
-*/
-
-
-/*!
- \page designer-quick-start.html
- \contentspage {Qt Designer Manual}{Contents}
-
-
- \title A Quick Start to Qt Designer
-
- Using \QD involves \bold four basic steps:
-
- \list 1
- \o Choose your form and objects
- \o Lay the objects out on the form
- \o Connect the signals to the slots
- \o Preview the form
- \endlist
-
- \image rgbController-screenshot.png
-
- Suppose you would like to design a small widget (see screenshot above) that
- contains the controls needed to manipulate Red, Green and Blue (RGB) values
- -- a type of widget that can be seen everywhere in image manipulation
- programs.
-
- \table
- \row
- \i \inlineimage designer-choosing-form.png
- \i \bold{Choosing a Form}
-
- You start by choosing \gui Widget from the \gui{New Form} dialog.
- \endtable
-
-
- \table
- \row
- \i \inlineimage rgbController-arrangement.png
- \i \bold{Placing Widgets on a Form}
-
- Drag three labels, three spin boxes and three vertical sliders on to your
- form. To change the label's default text, simply double-click on it. You
- can arrange them according to how you would like them to be laid out.
- \endtable
-
- To ensure that they are laid out exactly like this in your program, you
- need to place these widgets into a layout. We will do this in groups of
- three. Select the "RED" label. Then, hold down \key Ctrl while you select
- its corresponding spin box and slider. In the \gui{Form} menu, select
- \gui{Lay Out in a Grid}.
-
- \table
- \row
- \i \inlineimage rgbController-form-gridLayout.png
- \i \inlineimage rgbController-selectForLayout.png
- \endtable
-
-
- Repeat the step for the other two labels along with their corresponding
- spin boxes and sliders as well.
-
- The next step is to combine all three layouts into one \bold{main layout}.
- The main layout is the top level widget's (in this case, the QWidget)
- layout. It is important that your top level widget has a layout; otherwise,
- the widgets on your window will not resize when your window is resized. To
- set the layout, \gui{Right click} anywhere on your form, outside of the
- three separate layouts, and select \gui{Lay Out Horizontally}.
- Alternatively, you could also select \gui{Lay Out in a Grid} -- you will
- still see the same arrangement (shown below).
-
- \image rgbController-final-layout.png
-
- \note Main layouts cannot be seen on the form. To check if you have a main
- layout installed, try resizing your form; your widgets should resize
- accordingly. Alternatively, you can take a look at \QD's
- \gui{Object Inspector}. If your top level widget does not have a layout,
- you will see the broken layout icon next to it,
- \inlineimage rgbController-no-toplevel-layout.png
- .
-
- When you click on the slider and drag it to a certain value, you want the
- spin box to display the slider's position. To accomplish this behavior, you
- need to connect the slider's \l{QAbstractSlider::}{valueChanged()} signal
- to the spin box's \l{QSpinBox::}{setValue()} slot. You also need to make
- the reverse connections, e.g., connect the spin box's \l{QSpinBox::}
- {valueChanged()} signal to the slider's \l{QAbstractSlider::value()}
- {setValue()} slot.
-
- To do this, you have to switch to \gui{Edit Signals/Slots} mode, either by
- pressing \key{F4} or something \gui{Edit Signals/Slots} from the \gui{Edit}
- menu.
-
- \table
- \row
- \i \inlineimage rgbController-signalsAndSlots.png
- \i \bold{Connecting Signals to Slots}
-
- Click on the slider and drag the cursor towards the spin box. The
- \gui{Configure Connection} dialog, shown below, will pop up. Select the
- correct signal and slot and click \gui OK.
- \endtable
-
- \image rgbController-configure-connection1.png
-
- Repeat the step (in reverse order), clicking on the spin box and dragging
- the cursor towards the slider, to connect the spin box's
- \l{QSpinBox::}{valueChanged()} signal to the slider's
- \l{QAbstractSlider::value()}{setValue()} slot.
-
- You can use the screenshot below as a guide to selecting the correct signal
- and slot.
-
- \image rgbController-configure-connection2.png
-
- Now that you have successfully connected the objects for the "RED"
- component of the RGB Controller, do the same for the "GREEN" and "BLUE"
- components as well.
-
- Since RGB values range between 0 and 255, we need to limit the spin box
- and slider to that particular range.
-
- \table
- \row
- \i \inlineimage rgbController-property-editing.png
- \i \bold{Setting Widget Properties}
-
- Click on the first spin box. Within the \gui{Property Editor}, you will
- see \l{QSpinBox}'s properties. Enter "255" for the
- \l{QSpinBox::}{maximum} property. Then, click on the first vertical
- slider, you will see \l{QAbstractSlider}'s properties. Enter "255" for
- the \l{QAbstractSlider::}{maximum} property as well. Repeat this
- process for the remaining spin boxes and sliders.
- \endtable
-
- Now, we preview your form to see how it would look in your application -
- press \key{Ctrl + R} or select \gui Preview from the \gui Form menu. Try
- dragging the slider - the spin box will mirror its value too (and vice
- versa). Also, you can resize it to see how the layouts that are used to
- manage the child widgets, respond to different window sizes.
-*/
-
-
-/*!
- \page designer-editing-mode.html
- \previouspage Getting to Know Qt Designer
- \contentspage {Qt Designer Manual}{Contents}
- \nextpage Using Layouts in Qt Designer
-
- \title Qt Designer's Editing Modes
-
- \QD provides four editing modes: \l{Qt Designer's Widget Editing Mode}
- {Widget Editing Mode}, \l{Qt Designer's Signals and Slots Editing Mode}
- {Signals and Slots Editing Mode}, \l{Qt Designer's Buddy Editing Mode}
- {Buddy Editing Mode} and \l{Qt Designer's Tab Order Editing Mode}
- {Tab Order Editing Mode}. When working with \QD, you will always be in one
- of these four modes. To switch between modes, simply select it from the
- \gui{Edit} menu or the toolbar. The table below describes these modes in
- further detail.
-
- \table
- \header \i \i \bold{Editing Modes}
- \row
- \i \inlineimage designer-widget-tool.png
- \i In \l{Qt Designer's Widget Editing Mode}{Edit} mode, we can
- change the appearance of the form, add layouts, and edit the
- properties of each widget. To switch to this mode, press
- \key{F3}. This is \QD's default mode.
-
- \row
- \i \inlineimage designer-connection-tool.png
- \i In \l{Qt Designer's Signals and Slots Editing Mode}
- {Signals and Slots} mode, we can connect widgets together using
- Qt's signals and slots mechanism. To switch to this mode, press
- \key{F4}.
-
- \row
- \i \inlineimage designer-buddy-tool.png
- \i In \l{Qt Designer's Buddy Editing Mode}{Buddy Editing Mode},
- buddy widgets can be assigned to label widgets to help them
- handle keyboard focus correctly.
-
- \row
- \i \inlineimage designer-tab-order-tool.png
- \i In \l{Qt Designer's Tab Order Editing Mode}
- {Tab Order Editing Mode}, we can set the order in which widgets
- receive the keyboard focus.
- \endtable
-
-*/
-
-
-/*!
- \page designer-widget-mode.html
- \previouspage Qt Designer's Editing Modes
- \contentspage {Qt Designer Manual}{Contents}
- \nextpage Qt Designer's Signals and Slots Editing Mode
-
- \title Qt Designer's Widget Editing Mode
-
- \image designer-editing-mode.png
-
- In the Widget Editing Mode, objects can be dragged from the main window's
- widget box to a form, edited, resized, dragged around on the form, and even
- dragged between forms. Object properties can be modified interactively, so
- that changes can be seen immediately. The editing interface is intuitive
- for simple operations, yet it still supports Qt's powerful layout
- facilities.
-
-
- \tableofcontents
-
- To create and edit new forms, open the \gui File menu and select
- \gui{New Form...} or press \key{Ctrl+N}. Existing forms can also be edited
- by selecting \gui{Open Form...} from the \gui File menu or pressing
- \key{Ctrl+O}.
-
- At any point, you can save your form by selecting the \gui{Save From As...}
- option from the \gui File menu. The \c{.ui} files saved by \QD contain
- information about the objects used, and any details of signal and slot
- connections between them.
-
-
- \section1 Editing A Form
-
- By default, new forms are opened in widget editing mode. To switch to Edit
- mode from another mode, select \gui{Edit Widgets} from the \gui Edit menu
- or press the \key F3 key.
-
- Objects are added to the form by dragging them from the main widget box
- and dropping them in the desired location on the form. Once there, they
- can be moved around simply by dragging them, or using the cursor keys.
- Pressing the \key Ctrl key at the same time moves the selected widget
- pixel by pixel, while using the cursor keys alone make the selected widget
- snap to the grid when it is moved. Objects can be selected by clicking on
- them with the left mouse button. You can also use the \key Tab key to
- change the selection.
-
- ### Screenshot of widget box, again
-
- The widget box contains objects in a number of different categories, all of
- which can be placed on the form as required. The only objects that require
- a little more preparation are the \gui Container widgets. These are
- described in further detail in the \l{Using Containers in Qt Designer}
- chapter.
-
-
- \target SelectingObjects
- \table
- \row
- \i \inlineimage designer-selecting-widget.png
- \i \bold{Selecting Objects}
-
- Objects on the form are selected by clicking on them with the left
- mouse button. When an object is selected, resize handles are shown at
- each corner and the midpoint of each side, indicating that it can be
- resized.
-
- To select additional objects, hold down the \key Shift key and click on
- them. If more than one object is selected, the current object will be
- displayed with resize handles of a different color.
-
- To move a widget within a layout, hold down \key Shift and \key Control
- while dragging the widget. This extends the selection to the widget's
- parent layout.
-
- Alternatively, objects can be selected in the
- \l{The Object Inspector}{Object Inspector}.
- \endtable
-
- When a widget is selected, normal clipboard operations such as cut, copy,
- and paste can be performed on it. All of these operations can be done and
- undone, as necessary.
-
- The following shortcuts can be used:
-
- \target ShortcutsForEditing
- \table
- \header \i Action \i Shortcut \i Description
- \row
- \i Cut
- \i \key{Ctrl+X}
- \i Cuts the selected objects to the clipboard.
- \row
- \i Copy
- \i \key{Ctrl+C}
- \i Copies the selected objects to the clipboard.
- \row
- \i Paste
- \i \key{Ctrl+V}
- \i Pastes the objects in the clipboard onto the form.
- \row
- \i Delete
- \i \key Delete
- \i Deletes the selected objects.
- \row
- \i Clone object
- \i \key{Ctrl+drag} (leftmouse button)
- \i Makes a copy of the selected object or group of objects.
- \row
- \i Preview
- \i \key{Ctrl+R}
- \i Shows a preview of the form.
- \endtable
-
- All of the above actions (apart from cloning) can be accessed via both the
- \gui Edit menu and the form's context menu. These menus also provide
- funcitons for laying out objects as well as a \gui{Select All} function to
- select all the objects on the form.
-
- Widgets are not unique objects; you can make as many copies of them as you
- need. To quickly duplicate a widget, you can clone it by holding down the
- \key Ctrl key and dragging it. This allows widgets to be copied and placed
- on the form more quickly than with clipboard operations.
-
-
- \target DragAndDrop
- \table
- \row
- \i \inlineimage designer-dragging-onto-form.png
- \i \bold{Drag and Drop}
-
- \QD makes extensive use of the drag and drop facilities provided by Qt.
- Widgets can be dragged from the widget box and dropped onto the form.
-
- Widgets can also be "cloned" on the form: Holding down \key Ctrl and
- dragging the widget creates a copy of the widget that can be dragged to
- a new position.
-
- It is also possible to drop Widgets onto the \l {The Object Inspector}
- {Object Inspector} to handle nested layouts easily.
- \endtable
-
- \QD allows selections of objects to be copied, pasted, and dragged between
- forms. You can use this feature to create more than one copy of the same
- form, and experiment with different layouts in each of them.
-
-
- \section2 The Property Editor
-
- The Property Editor always displays properties of the currently selected
- object on the form. The available properties depend on the object being
- edited, but all of the widgets provided have common properties such as
- \l{QObject::}{objectName}, the object's internal name, and
- \l{QWidget::}{enabled}, the property that determines whether an
- object can be interacted with or not.
-
-
- \target EditingProperties
- \table
- \row
- \i \inlineimage designer-property-editor.png
- \i \bold{Editing Properties}
-
- The property editor uses standard Qt input widgets to manage the
- properties of jbects on the form. Textual properties are shown in line
- edits, integer properties are displayed in spinboxes, boolean
- properties are displayed in check boxes, and compound properties such
- as colors and sizes are presented in drop-down lists of input widgets.
-
- Modified properties are indicated with bold labels. To reset them, click
- the arrow button on the right.
-
- Changes in properties are applied to all selected objects that have the
- same property.
- \endtable
-
- Certain properties are treated specially by the property editor:
-
- \list
- \o Compound properties -- properties that are made up of more than one
- value -- are represented as nodes that can be expanded, allowing
- their values to be edited.
- \o Properties that contain a choice or selection of flags are edited
- via combo boxes with checkable items.
- \o Properties that allow access to rich data types, such as QPalette,
- are modified using dialogs that open when the properties are edited.
- QLabel and the widgets in the \gui Buttons section of the widget box
- have a \c text property that can also be edited by double-clicking
- on the widget or by pressing \gui F2. \QD interprets the backslash
- (\\) character specially, enabling newline (\\n) characters to be
- inserted into the text; the \\\\ character sequence is used to
- insert a single backslash into the text. A context menu can also be
- opened while editing, providing another way to insert special
- characters and newlines into the text.
- \endlist
-
-
- \section2 Dynamic Properties
-
- The property editor can also be used to add new
- \l{QObject#Dynamic Properties}{dynamic properties} to both standard Qt
- widgets and to forms themselves. Since Qt 4.4, dynamic properties are added
- and removed via the property editor's toolbar, shown below.
-
- \image designer-property-editor-toolbar.png
-
- To add a dynamic property, clcik on the \gui Add button
- \inlineimage designer-property-editor-add-dynamic.png
- . To remove it, click on the \gui Remove button
- \inlineimage designer-property-editor-remove-dynamic.png
- instead. You can also sort the properties alphabetically and change the
- color groups by clickinig on the \gui Configure button
- \inlineimage designer-property-editor-configure.png
- .
-
- \section2 The Object Inspector
- \table
- \row
- \i \inlineimage designer-object-inspector.png
- \i \bold{The Object Inspector}
-
- The \gui{Object Inspector} displays a hierarchical list of all the
- objects on the form that is currently being edited. To show the child
- objects of a container widget or a layout, click the handle next to the
- object label.
-
- Each object on a form can be selected by clicking on the corresponding
- item in the \gui{Object Inspector}. Right-clicking opens the form's
- context menu. These features can be useful if you have many overlapping
- objects. To locate an object in the \gui{Object Inspector}, use
- \key{Ctrl+F}.
-
- Since Qt 4.4, double-clicking on the object's name allows you to change
- the object's name with the in-place editor.
-
- Since Qt 4.5, the \gui{Object Inspector} displays the layout state of
- the containers. The broken layout icon ###ICON is displayed if there is
- something wrong with the layouts.
-
- \endtable
-*/
-
-
-/*!
- \page designer-layouts.html
- \previouspage Qt Designer's Widget Editing Mode
- \contentspage
- \nextpage Qt Designer's Signals and Slots Editing Mode
-
- \title Using Layouts in Qt Designer
-
- Before a form can be used, the objects on the form need to be placed into
- layouts. This ensures that the objects will be displayed properly when the
- form is previewed or used in an application. Placing objects in a layout
- also ensures that they will be resized correctly when the form is resized.
-
-
- \tableofcontents
-
- \section1 Applying and Breaking Layouts
-
- The simplest way to manage objects is to apply a layout to a group of
- existing objects. This is achieved by selecting the objects that you need
- to manage and applying one of the standard layouts using the main toolbar,
- the \gui Form menu, or the form's context menu.
-
- Once widgets have been inserted into a layout, it is not possible to move
- and resize them individually because the layout itself controls the
- geometry of each widget within it, taking account of the hints provided by
- spacers. Instead, you must either break the layout and adjust each object's
- geometry manually, or you can influence the widget's geometry by resizing
- the layout.
-
- To break the layout, press \key{Ctrl+0} or choose \gui{Break Layout} from
- the form's context menu, the \gui Form menu or the main toolbar. You can
- also add and remove spacers from the layout to influence the geometries of
- the widgets.
-
-
- \target InsertingObjectsIntoALayout
- \table
- \row
- \i \inlineimage designer-layout-inserting.png
- \i \bold{Inserting Objects into a Layout}
-
- Objects can be inserted into an existing layout by dragging them from
- their current positions and dropping them at the required location. A
- blue cursor is displayed in the layout as an object is dragged over
- it to indicate where the object will be added.
- \endtable
-
-
- \section2 Setting A Top Level Layout
-
- The form's top level layout can be set by clearing the slection (click the
- left mouse button on the form itself) and applying a layout. A top level
- layout is necessary to ensure that your widgets will resize correctly when
- its window is resized. To check if you have set a top level layout, preview
- your widget and attempt to resize the window by dragging the size grip.
-
- \table
- \row
- \i \inlineimage designer-set-layout.png
- \i \bold{Applying a Layout}
-
- To apply a layout, you can select your choice of layout from the
- toolbar shown on the left, or from the context menu shown below.
- \endtable
-
- \image designer-set-layout2.png
-
-
- \section2 Horizontal and Vertical Layouts
-
- The simplest way to arrange objects on a form is to place them in a
- horizontal or vertical layout. Horizontal layouts ensure that the widgets
- within are aligned horizontally; vertical layouts ensure that they are
- aligned vertically.
-
- Horizontal and vertical layouts can be combined and nested to any depth.
- However, if you need more control over the placement of objects, consider
- using the grid layout.
-
-
- \section3 The Grid Layout
-
- Complex form layouts can be created by placing objects in a grid layout.
- This kind of layout gives the form designer much more freedom to arrange
- widgets on the form, but can result in a much less flexible layout.
- However, for some kinds of form layout, a grid arrangement is much more
- suitable than a nested arrangement of horizontal and vertical layouts.
-
-
- \section3 Splitter Layouts
-
- Another common way to manage the layout of objects on a form is to place
- them in a splitter. These splitters arrange the objects horizontally or
- vertically in the same way as normal layouts, but also allow the user to
- adjust the amount of space allocated to each object.
-
- \image designer-splitter-layout.png
-
- Although QSplitter is a container widget, \QD treats splitter objects as
- layouts that are applied to existing widgets. To place a group of widgets
- into a splitter, select them
- \l{Qt Designer's Widget Editing Mode#SelectingObjects}{as described here}
- then apply the splitter layout by using the appropriate toolbar button,
- keyboard shortcut, or \gui{Lay out} context menu entry.
-
-
- \section3 The Form Layout
-
- Since Qt 4.4, another layout class has been included -- QFormLayout. This
- class manages widgets in a two-column form; the left column holds labels
- and the right column holds field widgets such as line edits, spin boxes,
- etc. The QFormLayout class adheres to various platform look and feel
- guidelines and supports wrapping for long rows.
-
- \image designer-form-layout.png
-
- The \c{.ui} file above results in the previews shown below.
-
- \table
- \header
- \i Windows XP
- \i Mac OS X
- \i Cleanlooks
- \row
- \i \inlineimage designer-form-layout-windowsXP.png
- \i \inlineimage designer-form-layout-macintosh.png
- \i \inlineimage designer-form-layout-cleanlooks.png
- \endtable
-
-
- \section2 Shortcut Keys
-
- In addition to the standard toolbar and context menu entries, there is also
- a set of keyboard shortcuts to apply layouts on widgets.
-
- \target LayoutShortcuts
- \table
- \header
- \i Layout
- \i Shortcut
- \i Description
- \row
- \i Horizontal
- \i \key{Ctrl+1}
- \i Places the selected objects in a horizontal layout.
- \row
- \i Vertical
- \i \key{Ctrl+2}
- \i Places the selected objects in a vertical layout.
- \row
- \i Grid
- \i \key{Ctrl+5}
- \i Places the selected objects in a grid layout.
- \row
- \i Form
- \i \key{Ctrl+6}
- \i Places the selected objects in a form layout.
- \row
- \i Horizontal splitter
- \i \key{Ctrl+3}
- \i Creates a horizontal splitter and places the selected objects
- inside it.
- \row
- \i Vertical splitter
- \i \key{Ctrl+4}
- \i Creates a vertical splitter and places the selected objects
- inside it.
- \row
- \i Adjust size
- \i \key{Ctrl+J}
- \i Adjusts the size of the layout to ensure that each child object
- has sufficient space to display its contents. See
- QWidget::adjustSize() for more information.
- \endtable
-
- \note \key{Ctrl+0} is used to break a layout.
-
-*/
-
-
-/*!
- \page designer-preview.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Using Layouts in Qt Designer
- \nextpage Qt Designer's Buddy Editing Mode
- \title Saving, Previewing and Printing Forms in Qt Designer
-
- Although \QD's forms are accurate representations of the components being
- edited, it is useful to preview the final appearance while editing. This
- feature can be activated by opening the \gui Form menu and selecting
- \gui Preview, or by pressing \key{Ctrl+R} when in the form.
-
- \image designer-dialog-preview.png
-
- The preview shows exactly what the final component will look like when used
- in an application.
-
- Since Qt 4.4, it is possible to preview forms with various skins - default
- skins, skins created with Qt Style Sheets or device skins. This feature
- simulates the effect of calling \c{QApplication::setStyleSheet()} in the
- application.
-
- To preview your form with skins, open the \gui Edit menu and select
- \gui{Preferences...}
-
- You will see the dialog shown below:
-
- \image designer-preview-style.png
-
- The \gui{Print/Preview Configuration} checkbox must be checked to activate
- previews of skins. You can select the styles provided from the \gui{Style}
- drop-down box.
-
- \image designer-preview-style-selection.png
-
- Alternatively, you can preview custom style sheet created with Qt Style
- Sheets. The figure below shows an example of Qt Style Sheet syntax and the
- corresponding output.
-
- \image designer-preview-stylesheet.png
-
- Another option would be to preview your form with device skins. A list of
- generic device skins are available in \QD, however, you may also use
- other QVFB skins with the \gui{Browse...} option.
-
- \image designer-preview-deviceskin-selection.png
-
-
- \section1 Viewing the Form's Code
-
- Since Qt 4.4, it is possible to view code generated by the User Interface
- Compiler (uic) for the \QD form.
-
- \image designer-form-viewcode.png
-
- Select \gui{View Code...} from the \gui{Form} menu and a dialog with the
- generated code will be displayed. The screenshot below is an example of
- code generated by the \c{uic}.
-
- \image designer-code-viewer.png
-
- \section1 Saving and Printing the Form
-
- Forms created in \QD can be saved to an image or printed.
-
- \table
- \row
- \i \inlineimage designer-file-menu.png
- \i \bold{Saving Forms}
-
- To save a form as an image, choose the \gui{Save Image...} option. The file
- will be saved in \c{.png} format.
-
- \bold{Printing Forms}
-
- To print a form, select the \gui{Print...} option.
-
- \endtable
-*/
-
-
-/*!
- \page designer-connection-mode.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Using Layouts in Qt Designer
- \nextpage Qt Designer's Buddy Editing Mode
-
-
- \title Qt Designer's Signals and Slots Editing Mode
-
- \image designer-connection-mode.png
-
- In \QD's signals and slots editing mode, you can connect objects in a form
- together using Qt's signals and slots mechanism. Both widgets and layouts
- can be connected via an intuitive connection interface, using the menu of
- compatible signals and slots provided by \QD. When a form is saved, all
- connections are preserved so that they will be ready for use when your
- project is built.
-
-
- \tableofcontents
-
- For more information on Qt's signals and sltos mechanism, refer to the
- \l{Signals and Slots} document.
-
-
- \section1 Connecting Objects
-
- To begin connecting objects, enter the signals and slots editing mode by
- opening the \gui Edit menu and selecting \gui{Edit Signals/Slots}, or by
- pressing the \key F4 key.
-
- All widgets and layouts on the form can be connected together. However,
- spacers just provide spacing hints to layouts, so they cannot be connected
- to other objects.
-
-
- \target HighlightedObjects
- \table
- \row
- \i \inlineimage designer-connection-highlight.png
- \i \bold{Highlighted Objects}
-
- When the cursor is over an object that can be used in a connection, the
- object will be highlighted.
- \endtable
-
- To make a connectionn, press the left mouse button and drag the cursor
- towards the object you want to connect it to. As you do this, a line will
- extend from the source object to the cursor. If the cursor is over another
- object on the form, the line will end with an arrow head that points to the
- destination object. This indicates that a connection will be made between
- the two objects when you release the mouse button.
-
- You can abandon the connection at any point while you are dragging the
- connection path by pressing \key{Esc}.
-
- \target MakingAConnection
- \table
- \row
- \i \inlineimage designer-connection-making.png
- \i \bold{Making a Connection}
-
- The connection path will change its shape as the cursor moves around
- the form. As it passes over objects, they are highlighted, indicating
- that they can be used in a signal and slot connection. Release the
- mouse button to make the connection.
- \endtable
-
- The \gui{Configure Connection} dialog (below) is displayed, showing signals
- from the source object and slots from the destination object that you can
- use.
-
- \image designer-connection-dialog.png
-
- To complete the connection, select a signal from the source object and a
- slot from the destination object, then click \key OK. Click \key Cancel if
- you wish to abandon the connection.
-
- \note If the \gui{Show all signals and slots} checkbox is selected, all
- available signals from the source object will be shown. Otherwise, the
- signals and slots inherited from QWidget will be hidden.
-
- You can make as many connections as you like between objects on the form;
- it is possible to connect signals from objects to slots in the form itself.
- As a result, the signal and slot connections in many dialogs can be
- completely configured from within \QD.
-
- \target ConnectingToTheForm
- \table
- \row
- \i \inlineimage designer-connection-to-form.png
- \i \bold{Connecting to a Form}
-
- To connect an object to the form itself, simply position the cursor
- over the form and release the mouse button. The end point of the
- connection changes to the electrical "ground" symbol.
- \endtable
-
-
- \section1 Editing and Deleting Connections
-
- By default, connection paths are created with two labels that show the
- signal and slot involved in the connection. These labels are usually
- oriented along the line of the connection. You can move them around inside
- their host widgets by dragging the red square at each end of the connection
- path.
-
- \target ConnectionEditor
- \table
- \row
- \i \inlineimage designer-connection-editor.png
- \i \bold{The Signal/Slot Editor}
-
- The signal and slot used in a connection can be changed after it has
- been set up. When a connection is configured, it becomes visible in
- \QD's signal and slot editor where it can be further edited. You can
- also edit signal/slot connections by double-clicking on the connection
- path or one of its labels to display the Connection Dialog.
- \endtable
-
- \target DeletingConnections
- \table
- \row
- \i \inlineimage designer-connection-editing.png
- \i \bold{Deleting Connections}
-
- The whole connection can be selected by clicking on any of its path
- segments. Once selected, a connection can be deleted with the
- \key Delete key, ensuring that it will not be set up in the \c{.ui}
- file.
- \endtable
-*/
-
-
-/*!
- \page designer-buddy-mode.html
- \contentspage{Qt Designer Manual}{Contents}
- \previouspage Qt Designer's Signals and Slots Editing Mode
- \nextpage Qt Designer's Tab Order Editing Mode
-
- \title Qt Designer's Buddy Editing Mode
-
- \image designer-buddy-mode.png
-
- One of the most useful basic features of Qt is the support for buddy
- widgets. A buddy widget accepts the input focus on behalf of a QLabel when
- the user types the label's shortcut key combination. The buddy concept is
- also used in Qt's \l{Model/View Programming}{model/view} framework.
-
-
- \section1 Linking Labels to Buddy Widgets
-
- To enter buddy editing mode, open the \gui Edit menu and select
- \gui{Edit Buddies}. This mode presents the widgets on the form in a similar
- way to \l{Qt Designer's Signals and Slots Editing Mode}{signals and slots
- editing mode} but in this mode, connections must start at label widgets.
- Ideally, you should connect each label widget that provides a shortcut with
- a suitable input widget, such as a QLineEdit.
-
-
- \target MakingBuddies
- \table
- \row
- \i \inlineimage designer-buddy-making.png
- \i \bold{Making Buddies}
-
- To define a buddy widget for a label, click on the label, drag the
- connection to another widget on the form, and release the mouse button.
- The connection shown indicates how input focus is passed to the buddy
- widget. You can use the form preview to test the connections between
- each label and its buddy.
- \endtable
-
-
- \section1 Removing Buddy Connections
-
- Only one buddy widget can be defined for each label. To change the buddy
- used, it is necessary to delete any existing buddy connection before you
- create a new one.
-
- Connections between labels and their buddy widgets can be deleted in the
- same way as signal-slot connections in signals and slots editing mode:
- Select the buddy connection by clicking on it and press the \key Delete
- key. This operation does not modify either the label or its buddy in any
- way.
-*/
-
-
-/*!
- \page designer-tab-order.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Qt Designer's Buddy Editing Mode
- \nextpage Using Containers in Qt Designer
-
- \title Qt Designer's Tab Order Editing Mode
-
- \image designer-tab-order-mode.png
-
- Many users expect to be able to navigate between widgets and controls
- using only the keyboard. Qt lets the user navigate between input widgets
- with the \key Tab and \key{Shift+Tab} keyboard shortcuts. The default
- \e{tab order} is based on the order in which widgets are constructed.
- Although this order may be sufficient for many users, it is often better
- to explicitly specify the tab order to make your application easier to
- use.
-
-
- \section1 Setting the Tab Order
-
- To enter tab order editing mode, open the \gui Edit menu and select
- \gui{Edit Tab Order}. In this mode, each input widget in the form is shown
- with a number indicating its position in the tab order. So, if the user
- gives the first input widget the input focus and then presses the tab key,
- the focus will move to the second input widget, and so on.
-
- The tab order is defined by clicking on each of the numbers in the correct
- order. The first number you click will change to red, indicating the
- currently edited position in the tab order chain. The widget associated
- with the number will become the first one in the tab order chain. Clicking
- on another widget will make it the second in the tab order, and so on.
-
- Repeat this process until you are satisfied with the tab order in the form
- -- you do not need to click every input widget if you see that the
- remaining widgets are already in the correct order. Numbers, for which you
- already set the order, change to green, while those which are not clicked
- yet, remain blue.
-
- If you make a mistake, simply double click outside of any number or choose
- \gui{Restart} from the form's context menu to start again. If you have many
- widgets on your form and would like to change the tab order in the middle or
- at the end of the tab order chain, you can edit it at any position. Press
- \key{Ctrl} and click the number from which you want to start.
- Alternatively, choose \gui{Start from Here} in the context menu.
-
-*/
-
-
-/*!
- \page designer-using-containers.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Qt Designer's Tab Order Editing Mode
- \nextpage Creating Main Windows in Qt Designer
-
-
- \title Using Containers in Qt Designer
-
- Container widgets provide high level control over groups of objects on a
- form. They can be used to perform a variety of functions, such as managing
- input widgets, providing paged and tabbed layouts, or just acting as
- decorative containers for other objects.
-
- \image designer-widget-morph.png
-
- \QD provides visual feedback to help you place objects inside your
- containers. When you drag an object from the widget box (or elsewhere) on
- the form, each container will be highlighted when the cursor is positioned
- over it. This indicates that you can drop the object inside, making it a
- child object of the container. This feedback is important because it is
- easy to place objects close to containers without actually placing them
- inside. Both widgets and spacers can be used inside containers.
-
- Stacked widgets, tab widgets, and toolboxes are handled specially in \QD.
- Norwally, when adding pages (tabs, pages, compartments) to these containers
- in your own code, you need to supply existing widgets, either as
- placeholders or containing child widgets. In \QD, these are automatically
- created for you, so you can add child objects to each page straight away.
-
- Each container typically allows its child objects to be arranged in one or
- more layouts. The type of layout management provided depends on each
- container, although setting the layout is usually just a matter of
- selecting the container by clicking it, and applying a layout. The table
- below shows a list of available containers.
-
- \table
- \row
- \i \inlineimage designer-containers-frame.png
- \i \bold Frames
-
- Frames are used to enclose and group widgets, as well as to provide
- decoration. They are used as the foundation for more complex
- containers, but they can also be used as placeholders in forms.
-
- The most important properties of frames are \c frameShape,
- \c frameShadow, \c lineWidth, and \c midLineWidth. These are described
- in more detail in the QFrame class description.
-
- \row
- \i \inlineimage designer-containers-groupbox.png
- \i \bold{Group Boxes}
-
- Group boxes are usually used to group together collections of
- checkboxes and radio buttons with similar purposes.
-
- Among the significant properties of group boxes are \c title, \c flat,
- \c checkable, and \c checked. These are demonstrated in the
- \l{widgets/groupbox}{Group Box} example, and described in the QGroupBox
- class documentation. Each group box can contain its own layout, and
- this is necessary if it contains other widgets. To add a layout to the
- group box, click inside it and apply the layout as usual.
-
- \row
- \i \inlineimage designer-containers-stackedwidget.png
- \i \bold{Stacked Widgets}
-
- Stacked widgets are collections of widgets in which only the topmost
- layer is visible. Control over the visible layer is usually managed by
- another widget, such as combobox, using signals and slots.
-
- \QD shows arrows in the top-right corner of the stack to allow you to
- see all the widgets in the stack when designing it. These arrows do not
- appear in the preview or in the final component. To navigate between
- pages in the stack, select the stacked widget and use the
- \gui{Next Page} and \gui{Previous Page} entries from the context menu.
- The \gui{Insert Page} and \gui{Delete Page} context menu options allow
- you to add and remove pages.
-
- \row
- \i \inlineimage designer-containers-tabwidget.png
- \i \bold{Tab Widgets}
-
- Tab widgets allow the developer to split up the contents of a widget
- into different labelled sections, only one of which is displayed at any
- given time. By default, the tab widget contains two tabs, and these can
- be deleted or renamed as required. You can also add additional tabs.
-
- To delete a tab:
- \list
- \o Click on its label to make it the current tab.
- \o Select the tab widget and open its context menu.
- \o Select \gui{Delete Page}.
- \endlist
-
- To add a new tab:
- \list
- \o Select the tab widget and open its context menu.
- \o Select \gui{Insert Page}.
- \o You can add a page before or after the \e current page. \QD
- will create a new widget for that particular tab and insert it
- into the tab widget.
- \o You can set the title of the current tab by changing the
- \c currentTabText property in the \gui{Property Editor}.
- \endlist
-
- \row
- \i \inlineimage designer-containers-toolbox.png
- \i \bold{ToolBox Widgets}
-
- Toolbox widgets provide a series of pages or compartments in a toolbox.
- They are handled in a way similar to stacked widgets.
-
- To rename a page in a toolbox, make the toolbox your current pange and
- change its \c currentItemText property from the \gui{Property Editor}.
-
- To add a new page, select \gui{Insert Page} from the toolbox widget's
- context menu. You can add the page before or after the current page.
-
- To delete a page, select \gui{Delete Page} from the toolbox widget's
- context menu.
-
- \row
- \i \inlineimage designer-containers-dockwidget.png
- \i \bold{Dock Widgets}
-
- Dock widgets are floating panels, often containing input widgets and
- more complex controls, that are either attached to the edges of the
- main window in "dock areas", or floated as independent tool windows.
-
- Although dock widgets can be added to any type of form, they are
- typically used with forms created from the
- \l{Creating Main Windows in Qt Designer}{main window template}.
-
- \endtable
-*/
-
-
-/*!
- \page designer-creating-mainwindows.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Using Containers in Qt Designer
- \nextpage Editing Resources with Qt Designer
-
- \title Creating Main Windows in Qt Designer
-
- \QD can be used to create user interfaces for different purposes, and
- it provides different kinds of form templates for each user interface. The
- main window template is used to create application windows with menu bars,
- toolbars, and dock widgets.
-
- \omit
- \image designer-mainwindow-example.png
- \endomit
-
- Create a new main window by opening the \gui File menu and selecting the
- \gui{New Form...} option, or by pressing \key{Ctrl+N}. Then, select the
- \gui{Main Window} template. This template provides a main application
- window containing a menu bar and a toolbar by default -- these can be
- removed if they are not required.
-
- If you remove the menu bar, a new one can be created by selecting the
- \gui{Create Menu Bar} option from the context menu, obtained by
- right-clicking within the main window form.
-
- An application can have only \bold one menu bar, but \bold several
- toolbars.
-
-
- \section1 Menus
-
- Menus are added to the menu bar by modifying the \gui{Type Here}
- placeholders. One of these is always present for editing purposes, and
- will not be displayed in the preview or in the finished window.
-
- Once created, the properties of a menu can be accessed using the
- \l{Qt Designer's Widget Editing Mode#The Property Editor}{Property Editor},
- and each menu can be accessed for this purpose via the
- \l{Qt Designer's Widget Editing Mode#The Object Inspector}{The Object Inspector}.
-
- Existing menus can be removed by opening a context menu over the label in
- the menu bar, and selecting \gui{Remove Menu 'menu_name'}.
-
-
- \target CreatingAMenu
- \table
- \row
- \i \inlineimage designer-creating-menu1.png
- \i \inlineimage designer-creating-menu2.png
- \i \bold{Creating a Menu}
-
- Double-click the placeholder item to begin editing. The menu text,
- displayed using a line edit, can be modified.
-
- \row
- \i \inlineimage designer-creating-menu3.png
- \i \inlineimage designer-creating-menu4.png
- \i Insert the required text for the new menu. Inserting an
- ampersand character (&) causes the letter following it to be
- used as a mnemonic for the menu.
-
- Press \key Return or \key Enter to accept the new text, or press
- \key Escape to reject it. You can undo the editing operation later if
- required.
- \endtable
-
- Menus can also be rearranged in the menu bar simply by dragging and
- dropping them in the preferred location. A vertical red line indicates the
- position where the menu will be inserted.
-
- Menus can contain any number of entries and separators, and can be nested
- to the required depth. Adding new entries to menus can be achieved by
- navigating the menu structure in the usual way.
-
- \target CreatingAMenuEntry
- \table
- \row
- \i \inlineimage designer-creating-menu-entry1.png
- \i \inlineimage designer-creating-menu-entry2.png
- \i \bold{Creating a Menu Entry}
-
- Double-click the \gui{new action} placeholder to begin editing, or
- double-click \gui{new separator} to insert a new separator line after
- the last entry in the menu.
-
- The menu entry's text is displayed using a line edit, and can be
- modified.
-
- \row
- \i \inlineimage designer-creating-menu-entry3.png
- \i \inlineimage designer-creating-menu-entry4.png
- \i Insert the required text for the new entry, optionally using
- the ampersand character (&) to mark the letter to use as a
- mnemonic for the entry.
-
- Press \key Return or \key Enter to accept the new text, or press
- \key Escape to reject it. The action created for this menu entry will
- be accessible via the \l{#TheActionEditor}{Action Editor}, and any
- associated keyboard shortcut can be set there.
- \endtable
-
- Just like with menus, entries can be moved around simply by dragging and
- dropping them in the preferred location. When an entry is dragged over a
- closed menu, the menu will open to allow it to be inserted there. Since
- menu entries are based on actions, they can also be dropped onto toolbars,
- where they will be displayed as toolbar buttons.
-
-
- \section1 Toolbars
-
-
- ### SCREENSHOT
-
- Toolbars ared added to a main window in a similar way to the menu bar:
- Select the \gui{Add Tool Bar} option from the form's context menu.
- Alternatively, if there is an existing toolbar in the main window, you can
- click the arrow on its right end to create a new toolbar.
-
- Toolbar buttons are created using the action system to populate each
- toolbar, rather than by using specific button widgets from the widget box.
- Since actions can be represented by menu entries and toolbar buttons, they
- can be moved between menus and toolbars. To share an action between a menu
- and a toolbar, drag its icon from the \l{#TheActionEditor}{Action Editor}
- to the toolbar rather than from the menu where its entry is located.
-
- New actions for menus and toolbars can be created in the
- \l{#TheActionEditor}{Action Editor}.
-
-
- \section1 Actions
-
- With the menu bar and the toolbars in place, it's time to populate them
- with action: \QD provides an action editor to simplify the creation and
- management of actions.
-
-
- \target TheActionEditor
- \table
- \row
- \i \inlineimage designer-action-editor.png
- \i \bold{The Action Editor}
-
- Enable the action editor by opening the \gui Tools menu, and switching
- on the \gui{Action Editor} option.
-
- The action editor allows you to create \gui New actions and \gui Delete
- actions. It also provides a search function, \gui Filter, using the
- action's text.
-
- \QD's action editor can be viewed in the classic \gui{Icon View} and
- \gui{Detailed View}. The screenshot below shows the action editor in
- \gui{Detailed View}. You can also copy and paste actions between menus,
- toolbars and forms.
- \endtable
-
- To create an action, use the action editor's \gui New button, which will
- then pop up an input dialog. Provide the new action with a \gui Text --
- this is the text that will appear in a menu entry and as the action's
- tooltip. The text is also automatically added to an "action" prefix,
- creating the action's \gui{Object Name}.
-
- In addition, the dialog provides the option of selecting an \gui Icon for
- the action, as well as removing the current icon.
-
- Once the action is created, it can be used wherever actions are applicable.
-
-
- \target AddingAnAction
- \table
- \row
- \i \inlineimage designer-adding-menu-action.png
- \i \inlineimage designer-adding-toolbar-action.png
- \i \bold{Adding an Action}
-
- To add an action to a menu or a toolbar, simply press the left mouse
- button over the action in the action editor, and drag it to the
- preferred location.
-
- \QD provides highlighted guide lines that tell you where the action
- will be added. Release the mouse button to add the action when you have
- found the right spot.
- \endtable
-
-
- \section1 Dock Widgets
-
- Since dock widgets are \l{Using Containers in Qt Designer}
- {container widgets}, they can be added to a form in the usuasl way. Once
- added to a form, dock widgets are not placed in any particular dock area by
- default; you need to set the \gui{docked} property to true for each widget
- and choose an appropriate value for its \gui{dockWidgetArea} property.
-
- \target AddingADockWidget
- \table
- \row
- \i \inlineimage designer-adding-dockwidget.png
- \i \bold{Adding a Dock Widget}
-
- To add a dock widget, simply drag one from the \gui Containers section
- of the widget box, and drop it onto the main form area. Just like other
- widgets, its properties can be modified with the \gui{Property Editor}.
-
- Dock widgets can be optionally floated as indpendent tool windows.
- Hence, it is useful to give them window titles by setting their
- \gui{windowTitle} property. This also helps to identify them on the
- form.
-
- \endtable
-*/
-
-
-/*!
- \page designer-resources.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Creating Main Windows in Qt Designer
- \nextpage Using Stylesheets with Qt Designer
-
- \title Editing Resources with Qt Designer
-
- \image designer-resources-editing.png
-
- \QD fully supports the \l{The Qt Resource System}{Qt Resource System},
- enabling resources to be specified together with forms as they are
- designed. To aid designers and developers manage resources for their
- applications, \QD's resource editor allows resources to be defined on a
- per-form basis. In other words, each form can have a separate resource
- file.
-
- \section1 Defining a Resource File
-
- To specify a resource file you must enable the resource editor by opening
- the \gui Tools menu, and switching on the \gui{Resource Browser} option.
-
- \target ResourceFiles
- \table
- \row
- \i \inlineimage designer-resource-browser.png
- \i \bold{Resource Files}
-
- Within the resource browser, you can open existing resource files or
- create new ones. Click the \gui{Edit Resources} button
- \inlineimage designer-edit-resources-button.png
- to edit your resources. To reload resources, click on the \gui Reload
- button
- \inlineimage designer-reload-resources-button.png
- .
- \endtable
-
-
- Once a resource file is loaded, you can create or remove entries in it
- using the given \gui{Add Files}
- \inlineimage designer-add-resource-entry-button.png
- and \gui{Remove Files}
- \inlineimage designer-remove-resource-entry-button.png
- buttons, and specify resources (e.g., images) using the \gui{Add Files}
- button
- \inlineimage designer-add-files-button.png
- . Note that these resources must reside within the current resource file's
- directory or one of its subdirectories.
-
-
- \target EditResource
- \table
- \row
- \i \inlineimage designer-edit-resource.png
- \i \bold{Editing Resource Files}
-
- Press the
- \inlineimage designer-add-resource-entry-button.png
- button to add a new resource entry to the file. Then use the
- \gui{Add Files} button
- \inlineimage designer-add-files-button.png
- to specify the resource.
-
- You can remove resources by selecting the corresponding entry in the
- resource editor, and pressing the
- \inlineimage designer-remove-resource-entry-button.png
- button.
- \endtable
-
-
- \section1 Using the Resources
-
- Once the resources are defined you can use them actively when composing
- your form. For example, you might want to create a tool button using an
- icon specified in the resource file.
-
- \target UsingResources
- \table
- \row
- \i \inlineimage designer-resources-using.png
- \i \bold{Using Resources}
-
- When changing properties with values that may be defined within a
- resource file, \QD's property editor allows you to specify a resource
- in addition to the option of selecting a source file in the ordinary
- way.
-
- \row
- \i \inlineimage designer-resource-selector.png
- \i \bold{Selecting a Resource}
-
- You can open the resource selector by clicking \gui{Choose Resource...}
- to add resources any time during the design process.
-
-\omit
-... check with Friedemann
-To quickly assign icon pixmaps to actions or pixmap properties, you may
-drag the pixmap from the resource editor to the action editor, or to the
-pixmap property in the property editor.
-\endomit
-
- \endtable
-*/
-
-
-/*!
- \page designer-stylesheet.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Editing Resources with Qt Designer
- \nextpage Using a Designer .ui File in Your Application
-
- \title Using Stylesheets with Qt Designer
-
- Since Qt 4.2, it is possible to edit stylesheets in \QD with the stylesheet
- editor.
-
- \target UsingStylesheets
- \table
- \row
- \i \inlineimage designer-stylesheet-options.png
- \bold{Setting a Stylesheet}
-
- The stylesheet editor can be accessed by right-clicking a widget
- and selecting \gui{Change styleSheet...}
-
- \row
- \i \inlineimage designer-stylesheet-usage.png
- \endtable
-
-*/
-
-
-/*!
- \page designer-using-a-ui-file.html
- \previouspage Using Stylesheets with Qt Designer
- \contentspage {Qt Designer Manual}{Contents}
- \nextpage Using Custom Widgets with Qt Designer
-
- \title Using a Designer .ui File in Your Application
-
- With Qt's integrated build tools, \l{qmake Manual}{qmake} and \l uic, the
- code for user interface components created with \QD is automatically
- generated when the rest of your application is built. Forms can be included
- and used directly from your application. Alternatively, you can use them to
- extend subclasses of standard widgets. These forms can be processed at
- compile time or at run time, depending on the approach used.
-
-
- \tableofcontents
- \section1 Compile Time Form Processing
-
- A compile time processed form can be used in your application with one of
- the following approaches:
-
- \list
- \o The Direct Approach: you construct a widget to use as a placeholder
- for the component, and set up the user interface inside it.
- \o The Single Inheritance Approach: you subclass the form's base class
- (QWidget or QDialog, for example), and include a private instance
- of the form's user interface object.
- \o The MultipleInheritance Approach: you subclass both the form's base
- class and the form's user interface object. This allows the widgets
- defined in the form to be used directly from within the scope of
- the subclass.
- \endlist
-
-
- \section2 The Direct Approach
-
- To demonstrate how to use user interface (\c{.ui}) files straight from
- \QD, we create a simple Calculator Form application. This is based on the
- original \l{Calculator Form Example}{Calculator Form} example.
-
- The application consists of one source file, \c main.cpp and a \c{.ui}
- file.
-
- The \c{calculatorform.ui} file designed with \QD is shown below:
-
- \image directapproach-calculatorform.png
-
- We will use \c qmake to build the executable, so we need to write a
- \c{.pro} file:
-
- \snippet doc/src/snippets/uitools/calculatorform/calculatorform.pro 0
-
- The special feature of this file is the \c FORMS declaration that tells
- \c qmake which files to process with \c uic. In this case, the
- \c calculatorform.ui file is used to create a \c ui_calculatorform.h file
- that can be used by any file listed in the \c SOURCES declaration. To
- ensure that \c qmake generates the \c ui_calculatorform.h file, we need to
- include it in a file listed in \c SOURCES. Since we only have \c main.cpp,
- we include it there:
-
- \snippet doc/src/snippets/uitools/calculatorform/main.cpp 0
-
- This include is an additional check to ensure that we do not generate code
- for \c .ui files that are not used.
-
- The \c main function creates the calculator widget by constructing a
- standard QWidget that we use to host the user interface described by the
- \c calculatorform.ui file.
-
- \snippet doc/src/snippets/uitools/calculatorform/main.cpp 1
-
- In this case, the \c{Ui::CalculatorForm} is an interface description object
- from the \c ui_calculatorform.h file that sets up all the dialog's widgets
- and the connections between its signals and slots.
-
- This approach provides a quick and easy way to use simple, self-contained
- components in your applications, but many componens created with \QD will
- require close integration with the rest of the application code. For
- instance, the \c CalculatorForm code provided above will compile and run,
- but the QSpinBox objects will not interact with the QLabel as we need a
- custom slot to carry out the add operation and display the result in the
- QLabel. To achieve this, we need to subclass a standard Qt widget (known as
- the single inheritance approach).
-
-
- \section2 The Single Inheritance Approach
-
- In this approach, we subclass a Qt widget and set up the user interface
- from within the constructor. Components used in this way expose the widgets
- and layouts used in the form to the Qt widget subclass, and provide a
- standard system for making signal and slot connections between the user
- interface and other objects in your application.
-
- This approach is used in the \l{Calculator Form Example}{Calculator Form}
- example.
-
- To ensure that we can use the user interface, we need to include the header
- file that \c uic generates before referring to \c{Ui::CalculatorForm}:
-
- \snippet examples/designer/calculatorform/calculatorform.h 0
-
- This means that the \c{.pro} file must be updated to include
- \c{calculatorform.h}:
-
- \snippet examples/designer/calculatorform/calculatorform.pro 0
-
- The subclass is defined in the following way:
-
- \snippet examples/designer/calculatorform/calculatorform.h 1
-
- The important feature of the class is the private \c ui object which
- provides the code for setting up and managing the user interface.
-
- The constructor for the subclass constructs and configures all the widgets
- and layouts for the dialog just by calling the \c ui object's \c setupUi()
- function. Once this has been done, it is possible to modify the user
- interface as needed.
-
- \snippet examples/designer/calculatorform/calculatorform.cpp 0
-
- We can connect signals and slots in user interface widgets in the usual
- way, taking care to prefix the \c ui object to each widget used.
-
- The advantages of this approach are its simple use of inheritance to
- provide a QWidget-based interface, and its encapsulation of the user
- interface widget variables within the \c ui data member. We can use this
- method to define a number of user interfaces within the same widget, each
- of which is contained within its own namespace, and overlay (or compose)
- them. This approach can be used to create individual tabs from existing
- forms, for example.
-
-
- \section2 The Multiple Inheritance Approach
-
- Forms created with \QD can be subclassed together with a standard
- QWidget-based class. This approach makes all the user interface components
- defined in the form directly accessible within the scope of the subclass,
- and enables signal and slot connections to be made in the usual way with
- the \l{QObject::connect()}{connect()} function.
-
- This approach is used in the \l{Multiple Inheritance Example}
- {Multiple Inheritance} example.
-
- We need to include the header file that \c uic generates from the
- \c calculatorform.ui file:
-
- \snippet examples/uitools/multipleinheritance/calculatorform.h 0
-
- The class is defined in a similar way to the one used in the
- \l{The Single Inheritance Approach}{single inheritance approach}, except that
- this time we inherit from \e{both} QWidget and \c{Ui::CalculatorForm}:
-
- \snippet examples/uitools/multipleinheritance/calculatorform.h 1
-
- We inherit \c{Ui::CalculatorForm} privately to ensure that the user
- interface objects are private in our subclass. We can also inherit it with
- the \c public or \c protected keywords in the same way that we could have
- made \c ui public or protected in the previous case.
-
- The constructor for the subclass performs many of the same tasks as the
- constructor used in the \l{The Single Inheritance Approach}
- {single inheritance} example:
-
- \snippet examples/uitools/multipleinheritance/calculatorform.cpp 0
-
- In this case, the widgets used in the user interface can be accessed in the
- same say as a widget created in code by hand. We no longer require the
- \c{ui} prefix to access them.
-
- Subclassing using multiple inheritance gives us more direct access to the
- contents of the form, is slightly cleaner than the single inheritance
- approach, but does not conveniently support composition of multiple user
- interfaces.
-
-
- \section1 Run Time Form Processing
-
- Alternatively, forms can be processed at run time, producing dynamically-
- generated user interfaces. This can be done using the QtUiTools module
- that provides the QUiLoader class to handle forms created with \QD.
-
-
- \section2 The UiTools Approach
-
- A resource file containing a \c{.ui} file is required to process forms at
- run time. Also, the application needs to be configured to use the QtUiTools
- module. This is done by including the following declaration in a \c qmake
- project file, ensuring that the application is compiled and linked
- appropriately.
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 0
-
- The QUiLoader class provides a form loader object to construct the user
- interface. This user interface can be retrieved from any QIODevice, e.g.,
- a QFile object, to obtain a form stored in a project's resource file. The
- QUiLoader::load() function constructs the form widget using the user
- interface description contained in the file.
-
- The QtUiTools module classes can be included using the following directive:
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 1
-
- The QUiLoader::load() function is invoked as shown in this code from the
- \l{Text Finder Example}{Text Finder} example:
-
- \snippet examples/uitools/textfinder/textfinder.cpp 4
-
- In a class that uses QtUiTools to build its user interface at run time, we
- can locate objects in the form using qFindChild(). For example, in the
- follownig code, we locate some components based on their object names and
- widget types:
-
- \snippet examples/uitools/textfinder/textfinder.cpp 1
-
- Processing forms at run-time gives the developer the freedom to change a
- program's user interface, just by changing the \c{.ui} file. This is useful
- when customizing programs to suit various user needs, such as extra large
- icons or a different colour scheme for accessibility support.
-
-
- \section1 Automatic Connections
-
- The signals and slots connections defined for compile time or run time
- forms can either be set up manually or automatically, using QMetaObject's
- ability to make connections between signals and suitably-named slots.
-
- Generally, in a QDialog, if we want to process the information entered by
- the user before accepting it, we need to connect the clicked() signal from
- the \gui OK button to a custom slot in our dialog. We will first show an
- example of the dialog in which the slot is connected by hand then compare
- it with a dialog that uses automatic connection.
-
-
- \section2 A Dialog Without Auto-Connect
-
- We define the dialog in the same way as before, but now include a slot in
- addition to the constructor:
-
- \snippet doc/src/snippets/designer/noautoconnection/imagedialog.h 0
-
- The \c checkValues() slot will be used to validate the values provided by
- the user.
-
- In the dialog's constructor we set up the widgets as before, and connect
- the \gui Cancel button's \l{QPushButton::clicked()}{clicked()} signal to
- the dialog's reject() slot. We also disable the
- \l{QPushButton::autoDefault}{autoDefault} property in both buttons to
- ensure that the dialog does not interfere with the way that the line edit
- handles return key events:
-
- \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 0
- \dots
- \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 1
-
- We connect the \gui OK button's \l{QPushButton::clicked()}{clicked()}
- signal to the dialog's checkValues() slot which we implement as follows:
-
- \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 2
-
- This custom slot does the minimum necessary to ensure that the data
- entered by the user is valid - it only accepts the input if a name was
- given for the image.
-
- \section2 Widgets and Dialogs with Auto-Connect
-
- Although it is easy to implement a custom slot in the dialog and connect
- it in the constructor, we could instead use QMetaObject's auto-connection
- facilities to connect the \gui OK button's clicked() signal to a slot in
- our subclass. \c{uic} automatically generates code in the dialog's
- \c setupUi() function to do this, so we only need to declare and
- implement a slot with a name that follows a standard convention:
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 2
-
- Using this convention, we can define and implement a slot that responds to
- mouse clicks on the \gui OK button:
-
- \snippet doc/src/snippets/designer/autoconnection/imagedialog.h 0
-
- Another example of automatic signal and slot connection would be the
- \l{Text Finder Example}{Text Finder} with its \c{on_findButton_clicked()}
- slot.
-
- We use QMetaObject's system to enable signal and slot connections:
-
- \snippet examples/uitools/textfinder/textfinder.cpp 2
-
- This enables us to implement the slot, as shown below:
-
- \snippet examples/uitools/textfinder/textfinder.cpp 6
- \dots
- \snippet examples/uitools/textfinder/textfinder.cpp 8
-
- Automatic connection of signals and slots provides both a standard naming
- convention and an explicit interface for widget designers to work to. By
- providing source code that implements a given interface, user interface
- designers can check that their designs actually work without having to
- write code themselves.
-*/
-
-
-/*!
- \page designer-customizing-forms.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Using Stylesheets with Qt Designer
- \nextpage Using Custom Widgets with Qt Designer
-
- \title Customizing Qt Designer Forms
-
- \image designer-form-settings.png
-
- When saving a form in \QD, it is stored as an \c .ui file. Several form
- settings, for example the grid settings or the margin and spacing for the
- default layout, are stored along with the form's components. These settings
- are used when the \l uic generates the form's C++ code. For more
- information on how to use forms in your application, see the
- \l{Using a Designer .ui File in Your Application} section.
-
-
- \section1 Modifying the Form Settings
-
- To modify the form settings, open the \gui Form menu and select \gui{Form
- Settings...}
-
- In the forms settings dialog you can specify the \gui Author of the form.
-
- You can also alter the margin and spacing properties for the form's default
- layout (\gui {Layout Default}). These default layout properties will be
- replaced by the corresponding \gui {Layout Function}, if the function is
- specified, when \c uic generates code for the form. The form settings
- dialog lets you specify functions for both the margin and the spacing.
-
- \target LayoutFunction
- \table
- \row
- \i \inlineimage designer-form-layoutfunction.png
- \i \bold{Layout Function}
-
- The default layout properties will be replaced by the corresponding
- \gui{Layout Function}, when \c uic generates code for the form. This is
- useful when different environments requires different layouts for the same
- form.
-
- To specify layout functions for the form's margin and spacing, check the
- \gui{Layout Function} group box to enable the line edits.
- \endtable
-
- You can also specify the form's \gui{Include Hints}; i.e., provide a list
- of the header files which will then be included in the form window's
- associated \c .ui file. Header files may be local, i.e., relative to the
- project's directory, \c "mywidget.h", or global, i.e. part of Qt or the
- compilers standard libraries: \c <QtGui/QWidget>.
-
- Finally, you can specify the function used to load pixmaps into the form
- window (the \gui {Pixmap Function}).
-*/
-
-
-/*!
- \page designer-using-custom-widgets.html
- \contentspage {Qt Designer Manual}{Contents}
- \previouspage Customizing Qt Designer Forms
- \nextpage Creating Custom Widgets for Qt Designer
-
- \title Using Custom Widgets with Qt Designer
-
- \QD can display custom widgets through its extensible plugin mechanism,
- allowing the range of designable widgets to be extended by the user and
- third parties. This feature also allows \QD to optionally support
- \l{Qt3Support}{Qt 3 compatibility widgets}. Alternatively, it is possible
- to use existing widgets as placeholders for widget classes that provide
- similar APIs.
-
- Widgets from the Qt3Support library are made available via in \QD's support
- for custom widgets.
-
-
- \section1 Handling Custom Widgets
-
- Although \QD supports all of the standard Qt widgets, and can be configured
- to handle widgets supplied in the Qt3Support library, some specialized
- widgets may not be available as standard for a number of reasons:
-
- \list
- \i Custom widgets may not be available at the time the user interface
- is being designed.
- \i Custom widgets may be platform-specific, and designers may be
- developing the user interface on a different platform to end users.
- \i The source code for a custom widget is not available, or the user
- interface designers are unable to use the widget for non-technical
- reasons.
- \endlist
-
- In the above situations, it is still possible to design forms with the aim
- of using custom widgets in the application. To achieve this, we can use
- the widget promotion feature of \QD.
-
- In all other cases, where the source code to the custom widgets is
- available, we can adapt the custom widget for use with \QD.
-
-
- \section2 Promoting Widgets
-
- \image designer-promoting-widgets.png
-
- If some forms must be designed, but certain custom widgets are unavailble
- to the designer, we can substitute similar widgets to represent the missing
- widgets. For example, we might represent instances of a custom push button
- class, \c MyPushButton, with instances of QPushButton and promote these to
- \c MyPushButton so that \l{uic.html}{uic} generates suitable code for this
- missing class.
-
- When choosing a widget to use as a placeholder, it is useful to compare the
- API of the missing widget with those of standard Qt widgets. For
- specialized widgets that subclass standard classes, the obvious choice of
- placeholder is the base class of the custom widget; for example, QSlider
- might be used for specialized QSlider subclasses.
-
- For specialized widgets that do not share a common API with standard Qt
- widgets, it is worth considering adapting a custom widget for use in \QD.
- If this is not possible then QWidget is the obvious choice for a
- placeholder widget since it is the lowest common denominator for all
- widgets.
-
- To add a placeholder, select an object of a suitable base class and choose
- \gui{Promote to ...} from the form's context menu. After entering the class
- name and header file in the lower part of the dialog, choose \gui{Add}. The
- placeholder class will now appear along with the base class in the upper
- list. Click the \gui{Promote} button to accept this choice.
-
- Now, when the form's context menu is opened over objects of the base class,
- the placeholder class will appear in the \gui{Promote to} submenu, allowing
- for convenient promotion of objects to that class.
-
- A promoted widget can be reverted to its base class by choosing
- \gui{Demote to} from the form's context menu.
-
-
- \section2 User Defined Custom Widgets
-
- \image worldtimeclockplugin-example.png
-
- Custom widgets can be adapted for use with \QD, giving designers the
- opportunity to configure the user interface using the actual widgets that
- will be used in an application rather than placeholder widgets. The process
- of creating a custom widget plugin is described in the
- \l{Creating Custom Widgets for Qt Designer} chapter of this manual.
-
- To use a plugin created in this way, it is necessary to ensure that the
- plugin is located on a path that \QD searches for plugins. Generally,
- plugins stored in \c{$QTDIR/plugins/designer} will be loaded when \QD
- starts. Further information on building and installing plugins can be found
- \l{Creating Custom Widgets for Qt Designer#BuildingandInstallingthePlugin}
- {here}. You can also refer to the \l{How to Create Qt Plugins}
- {Plugins HOWTO} document for information about creating plugins.
-*/
-
-
-/*!
- \page designer-creating-custom-widgets.html
- \previouspage Using Custom Widgets with Qt Designer
- \contentspage {Qt Designer Manual}{Contents}
- \nextpage Creating Custom Widget Extensions
-
- \title Creating Custom Widgets for Qt Designer
-
- \QD's plugin-based architecture allows user-defined and third party custom
- widgets to be edited just like you do with standard Qt widgets. All of the
- custom widget's features are made available to \QD, including widget
- properties, signals, and slots. Since \QD uses real widgets during the form
- design process, custom widgets will appear the same as they do when
- previewed.
-
- \image worldtimeclockplugin-example.png
-
- The \l QtDesigner module provides you with the ability to create custom
- widgets in \QD.
-
-
- \section1 Getting Started
-
- To integrate a custom widget with \QD, you require a suitable description
- for the widget and an appropriate \c{.pro} file.
-
-
- \section2 Providing an Interface Description
-
- To inform \QD about the type of widget you want to provide, create a
- subclass of QDesignerCustomWidgetInterface that describes the various
- properties your widget exposes. Most of these are supplied by functions
- that are pure virtual in the base class, because only the author of the
- plugin can provide this information.
-
- \table
- \header
- \o Function
- \o Description of the return value
- \row
- \o \c name()
- \o The name of the class that provides the widget.
- \row
- \o \c group()
- \o The group in \QD's widget box that the widget belongs to.
- \row
- \o \c toolTip()
- \o A short description to help users identify the widget in \QD.
- \row
- \o \c whatsThis()
- \o A longer description of the widget for users of \QD.
- \row
- \o \c includeFile()
- \o The header file that must be included in applications that use
- this widget. This information is stored in .ui files and will
- be used by \c uic to create a suitable \c{#includes} statement
- in the code it generates for the form containing the custom
- widget.
- \row
- \o \c icon()
- \o An icon that can be used to represent the widget in \QD's
- widget box.
- \row
- \o \c isContainer()
- \o True if the widget will be used to hold child widgets;
- false otherwise.
- \row
- \o \c createWidget()
- \o A QWidget pointer to an instance of the custom widget,
- constructed with the parent supplied.
- \note createWidget() is a factory function responsible for
- creating the widget only. The custom widget's properties will
- not be available until load() returns.
- \row
- \o \c domXml()
- \o A description of the widget's properties, such as its object
- name, size hint, and other standard QWidget properties.
- \row
- \o \c codeTemplate()
- \o This function is reserved for future use by \QD.
- \endtable
-
- Two other virtual functions can also be reimplemented:
-
- \table
- \row
- \o \c initialize()
- \o Sets up extensions and other features for custom widgets. Custom
- container extensions (see QDesignerContainerExtension) and task
- menu extensions (see QDesignerTaskMenuExtension) should be set
- up in this function.
- \row
- \o \c isInitialized()
- \o Returns true if the widget has been initialized; returns false
- otherwise. Reimplementations usually check whether the
- \c initialize() function has been called and return the result
- of this test.
- \endtable
-
-
- \section2 Notes on the \c{domXml()} Function
-
- The \c{domXml()} function returns a \c{.ui} file snippet that is used by
- \QD's widget factory to create a custom widget and its applicable
- properties.
-
- Since Qt 4.4, \QD's widget box allows for a complete \c{.ui} file to
- describe \bold one custom widget. The \c{.ui} file can be loaded using the
- \c{<ui>} tag. Specifying the <ui> tag allows for adding the <customwidget>
- element that contains additional information for custom widgets. The
- \c{<widget>} tag is sufficient if no additional information is required
-
- If the custom widget does not provide a reasonable size hint, it is
- necessary to specify a default geometry in the string returned by the
- \c domXml() function in your subclass. For example, the
- \c AnalogClockPlugin provided by the \l{designer/customwidgetplugin}
- {Custom Widget Plugin} example, defines a default widgetgeometry in the
- following way:
-
- \dots
- \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 11
- \dots
-
- An additional feature of the \c domXml() function is that, if it returns
- an empty string, the widget will not be installed in \QD's widget box.
- However, it can still be used by other widgets in the form. This feature
- is used to hide widgets that should not be explicitly created by the user,
- but are required by other widgets.
-
- If you would like to use a container widget that is not a subclass of the
- containers provided in \QD, but the container is still based on the notion
- of \e{Current Page}, you need to provide a container extension and
- tell \QD which method to use to add the pages. This can be done using the
- \c{<addpagemethod>} XML tag.
-
-
- \section1 Plugin Requirements
-
- In order for plugins to work correctly on all platforms, you need to ensure
- that they export the symbols needed by \QD.
-
- First of all, the plugin class must be exported in order for the plugin to
- be loaded by \QD. Use the Q_EXPORT_PLUGIN2() macro to do this. Also, the
- QDESIGNER_WIDGET_EXPORT macro must be used to define each custom widget class
- within a plugin, that \QD will instantiate.
-
-
- \section1 Creating Well Behaved Widgets
-
- Some custom widgets have special user interface features that may make them
- behave differently to many of the standard widgets found in \QD.
- Specifically, if a custom widget grabs the keyboard as a result of a call
- to QWidget::grabKeyboard(), the operation of \QD will be affected.
-
- To give custom widgets special behavior in \QD, provide an implementation
- of the initialize() function to configure the widget construction process
- for \QD specific behavior. This function will be called for the first time
- before any calls to createWidget() and could perhaps set an internal flag
- that can be tested later when \QD calls the plugin's createWidget()
- function.
-
-
- \target BuildingandInstallingthePlugin
- \section1 Building and Installing the Plugin
-
- \section2 A Simple Plugin
-
- The \l{Custom Widget Plugin Example} demonstrates a simple \QD plugin.
-
- The \c{.pro} file for a plugin must specify the headers and sources for
- both the custom widget and the plugin interface. Typically, this file only
- has to specify that the plugin's project is to be built as a library, but
- with specific plugin support for \QD. This is done with the following
- declarations:
-
- \snippet examples/designer/customwidgetplugin/customwidgetplugin.pro 1
-
- If Qt is configured to build in both debug and release modes, \QD will be
- built in release mode. When this occurs, it is necessary to ensure that
- plugins are also built in release mode. To do this, include the following
- declaration in the plugin's \c{.pro} file:
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 3
-
- If plugins are built in a mode that is incompatible with \QD, they will
- not be loaded and installed. For more information about plugins, see the
- \l{plugins-howto.html}{Plugins HOWTO} document.
-
- It is also necessary to ensure that the plugin is installed together with
- other \QD widget plugins:
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 4
-
- The \c $[QT_INSTALL_PLUGINS] variable is a placeholder to the location of
- the installed Qt plugins. You can configure \QD to look for plugins in
- other locations by setting the \c QT_PLUGIN_PATH environment variable
- before running the application.
-
- \note \QD will look for a \c designer subdirectory in each path supplied.
-
- See QCoreApplication::libraryPaths() for more information about customizing
- paths for libraries and plugins with Qt applications.
-
- \section2 Splitting up the Plugin
-
- In a real world scenario, you do not want to have dependencies of the
- application making use of the custom widgets to the \QD headers and
- libraries as introduced by the simple approach explained above.
-
- There are two ways to resolve this:
-
- \list
- \i Create a \c{.pri} file that contains the headers sources and sources
- of the custom widget:
-
- \code
- INCLUDEPATH += $$PWD
- HEADERS += $$PWD/analogclock.h
- SOURCES += $$PWD/analogclock.cpp
- \endcode
-
- This file would then be included by the \c{.pro} file of the plugin and
- the application:
-
- \code
- include(customwidget.pri)
- \endcode
-
- Running \c{qmake -Wall} on the \c{.pro} files causes a warning to be
- printed if an included \c{.pri} file cannot be found.
-
- \i Create a standalone shared library containing the custom widgets only
- as described in
- \l{sharedlibrary.html}{Creating Shared Libraries}.
-
- This library would then be used by the application as well as by the
- \QD plugin. Care must be taken to ensure that the plugin can locate
- the library at run-time.
- \endlist
-
- \section1 Related Examples
-
- For more information on using custom widgets in \QD, refer to the
- \l{designer/customwidgetplugin}{Custom Widget Plugin} and
- \l{designer/worldtimeclockplugin}{World Time Clock Plugin} examples for more
- information about using custom widgets in \QD. Also, you can use the
- QDesignerCustomWidgetCollectionInterface class to combine several custom
- widgets into a single library.
-*/
-
-
-/*!
- \page designer-creating-custom-widgets-extensions.html
- \previouspage Creating Custom Widgets for Qt Designer
- \nextpage Qt Designer's UI File Format
- \contentspage {Qt Designer Manual}{Contents}
-
- \title Creating Custom Widget Extensions
-
- Once you have a custom widget plugin for \QD, you can provide it with the
- expected behavior and functionality within \QD's workspace, using custom
- widget extensions.
-
-
- \section1 Extension Types
-
- There are several available types of extensions in \QD. You can use all of
- these extensions in the same pattern, only replacing the respective
- extension base class.
-
- QDesignerContainerExtension is necessary when implementing a custom
- multi-page container.
-
- \table
- \row
- \i \inlineimage designer-manual-taskmenuextension.png
- \i \bold{QDesignerTaskMenuExtension}
-
- QDesignerTaskMenuExtension is useful for custom widgets. It provides an
- extension that allows you to add custom menu entries to \QD's task
- menu.
-
- The \l{designer/taskmenuextension}{Task Menu Extension} example
- illustrates how to use this class.
-
- \row
- \i \inlineimage designer-manual-containerextension.png
- \i \bold{QDesignerContainerExtension}
-
- QDesignerContainerExtension is necessary when implementing a custom
- multi-page container. It provides an extension that allows you to add
- and delete pages for a multi-page container plugin in \QD.
-
- The \l{designer/containerextension}{Container Extension} example
- further explains how to use this class.
-
- \note It is not possible to add custom per-page properties for some
- widgets (e.g., QTabWidget) due to the way they are implemented.
- \endtable
-
- \table
- \row
- \i \inlineimage designer-manual-membersheetextension.png
- \i \bold{QDesignerMemberSheetExtension}
-
- The QDesignerMemberSheetExtension class allows you to manipulate a
- widget's member functions displayed when connecting signals and slots.
-
- \row
- \i \inlineimage designer-manual-propertysheetextension.png
- \i \bold{QDesignerPropertySheetExtension,
- QDesignerDynamicPropertySheetExtension}
-
- These extension classes allow you to control how a widget's properties
- are displayed in \QD's property editor.
- \endtable
-
-\omit
- \row
- \o
- \o \bold {QDesignerScriptExtension}
-
- The QDesignerScriptExtension class allows you to define script
- snippets that are executed when a form is loaded. The extension
- is primarily intended to be used to set up the internal states
- of custom widgets.
- \endtable
-\endomit
-
-
- \QD uses the QDesignerPropertySheetExtension and the
- QDesignerMemberSheetExtension classes to feed its property and signal and
- slot editors. Whenever a widget is selected in its workspace, \QD will
- query for the widget's property sheet extension; likewise, whenever a
- connection between two widgets is requested, \QD will query for the
- widgets' member sheet extensions.
-
- \warning All widgets have default property and member sheets. If you
- implement custom property sheet or member sheet extensions, your custom
- extensions will override the default sheets.
-
-
- \section1 Creating an Extension
-
- To create an extension you must inherit both QObject and the appropriate
- base class, and reimplement its functions. Since we are implementing an
- interface, we must ensure that it is made known to the meta object system
- using the Q_INTERFACES() macro in the extension class's definition. For
- example:
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 7
-
- This enables \QD to use the qobject_cast() function to query for supported
- interfaces using a QObject pointer only.
-
-
- \section1 Exposing an Extension to Qt Designer
-
- In \QD the extensions are not created until they are required. For this
- reason, when implementing extensions, you must subclass QExtensionFactory
- to create a class that is able to make instances of your extensions. Also,
- you must register your factory with \QD's extension manager; the extension
- manager handles the construction of extensions.
-
- When an extension is requested, \QD's extension manager will run through
- its registered factories calling QExtensionFactory::createExtension() for
- each of them until it finds one that is able to create the requested
- extension for the selected widget. This factory will then make an instance
- of the extension.
-
- \image qtdesignerextensions.png
-
-
- \section2 Creating an Extension Factory
-
- The QExtensionFactory class provides a standard extension factory, but it
- can also be used as an interface for custom extension factories.
-
- The purpose is to reimplement the QExtensionFactory::createExtension()
- function, making it able to create your extension, such as a
- \l{designer/containerextension}{MultiPageWidget} container extension.
-
- You can either create a new QExtensionFactory and reimplement the
- QExtensionFactory::createExtension() function:
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 8
-
- or you can use an existing factory, expanding the
- QExtensionFactory::createExtension() function to enable the factory to
- create your custom extension as well:
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 9
-
-
- \section2 Accessing Qt Designer's Extension Manager
-
- When implementing a custom widget plugin, you must subclass the
- QDesignerCustomWidgetInterface to expose your plugin to \QD. This is
- covered in more detail in the
- \l{Creating Custom Widgets for Qt Designer} section. The registration of
- an extension factory is typically made in the
- QDesignerCustomWidgetInterface::initialize() function:
-
- \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 10
-
- The \c formEditor parameter in the
- QDesignerCustomWidgetInterface::initialize() function is a pointer to \QD's
- current QDesignerFormEditorInterface object. You must use the
- QDesignerFormEditorInterface::extensionManager() function to retrieve an
- interface to \QD's extension manager. Then you use the
- QExtensionManager::registerExtensions() function to register your custom
- extension factory.
-
-
- \section1 Related Examples
-
- For more information on creating custom widget extensions in \QD, refer to
- the \l{designer/taskmenuextension}{Task Menu Extension} and
- \l{designer/containerextension}{Container Extension} examples.
-*/
-
-
-/*!
- \page designer-ui-file-format.html
- \previouspage Creating Custom Widget Extensions
- \contentspage {Qt Designer Manual}{Contents}
-
- \title Qt Designer's UI File Format
-
- The \c .ui file format used by \QD is described by the
- \l{http://www.w3.org/XML/Schema}{XML schema} presented below,
- which we include for your convenience. Be aware that the format
- may change in future Qt releases.
-
- \quotefile tools/designer/data/ui4.xsd
-*/
-
-
-/*!
- \page designer-recursive-shadow-casting.html
- \title Implementation of the Recursive Shadow Casting Algorithm in Qt Designer
- \contentspage {Qt Designer Manual}{Contents}
-
- \ingroup licensing
- \brief License information for contributions to specific parts of the Qt
- Designer source code.
-
- \legalese
- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). \BR
- Copyright (C) 2005 Bjoern Bergstroem
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, modify, market, reproduce,
- grant sublicenses and distribute subject to the following conditions:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software. These
- files are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- WARRANTY OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- PURPOSE.
- \endlegalese
-*/
diff --git a/doc/src/desktop-integration.qdoc b/doc/src/desktop-integration.qdoc
deleted file mode 100644
index 48dc375..0000000
--- a/doc/src/desktop-integration.qdoc
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page desktop-integration.html
- \title Desktop Integration
- \ingroup gui-programming
-
- Various classes in Qt are designed to help developers integrate applications into
- users' desktop environments. These classes enable developers to take advantage
- of native services while still using a cross-platform API.
-
- \tableofcontents
-
- \section1 Opening External Resources
-
- Although Qt provides facilities to handle and display resources, such as
- \l{QImageIOHandler}{common image formats} and \l{QTextDocument}{HTML},
- it is sometimes necessary to open files and external resources using external
- applications.
-
- QDesktopServices provides an interface to services offered by the user's desktop
- environment. In particular, the \l{QDesktopServices::}{openUrl()} function is
- used to open resources using the appropriate application, which may have been
- specifically configured by the user.
-
- \section1 System Tray Icons
-
- Many modern desktop environments feature docks or panels with \e{system trays}
- in which applications can install icons. Applications often use system tray icons
- to display status information, either by updating the icon itself or by showing
- information in "balloon messages". Additionally, many applications provide
- pop-up menus that can be accessed via their system tray icons.
-
- The QSystemTrayIcon class exposes all of the above features via an intuitive
- Qt-style API that can be used on all desktop platforms.
-
- \section1 Desktop Widgets
-
- On systems where the user's desktop is displayed using more than one screen,
- certain types of applications may need to obtain information about the
- configuration of the user's workspace to ensure that new windows and dialogs
- are opened in appropriate locations.
-
- The QDesktopWidget class can be used to monitor the positions of widgets and
- notify applications about changes to the way the desktop is split over the
- available screens. This enables applications to implement policies for
- positioning new windows so that, for example, they do not distract a user
- who is working on a specific task.
-
-
-*/
diff --git a/doc/src/developing-on-mac.qdoc b/doc/src/developing-on-mac.qdoc
deleted file mode 100644
index bd24183..0000000
--- a/doc/src/developing-on-mac.qdoc
+++ /dev/null
@@ -1,254 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page developing-on-mac.html
- \title Developing Qt Applications on Mac OS X
- \brief A overview of items to be aware of when developing Qt applications
- on Mac OS X
- \ingroup platform-notes
-
- \tableofcontents
-
- Mac OS X is a UNIX platform and behaves similar to other Unix-like
- platforms. The main difference is X11 is not used as the primary windowing
- system. Instead, Mac OS X uses its own native windowing system that is
- accessible through the Carbon and Cocoa APIs. Application development on
- Mac OS X is done using Xcode Tools, an optional install included on every
- Mac with updates available from \l {http://developer.apple.com}{Apple's
- developer website}. Xcode Tools includes Apple-modified versions of the GCC
- compiler.
-
-
- \section1 What Versions of Mac OS X are Supported?
-
- As of Qt 4.5, Qt supports Mac OS X versions 10.3 (for \bold{deployment
- only}, not for development), 10.4 and 10.5. It is usually in the best
- interest of the developer and user to be running the latest updates to any
- version. We test internally against Mac OS X 10.3.9 and Mac OS X 10.4.11 as
- well as the updated release of Mac OS X 10.5.
-
-
- \section2 Carbon or Cocoa?
-
- Historically, Qt has used the Carbon toolkit, which supports 32-bit
- applications on Mac OS X 10.3 and up. Qt 4.5 adds support for the Cocoa
- toolkit, which requires 10.5 and provides 64-bit support.
-
- This detail is typically not important to Qt application developers. Qt is
- cross-platform across Carbon and Cocoa, and Qt applications behave
- the same way when configured for either one. Eventually, the Carbon
- version will be discontinued. This is something to keep in mind when you
- consider writing code directly against native APIs.
-
- The current binary for Qt is built for Carbon. If you want to choose which
- framework Qt will use, you must build from scratch. Carbon or Cocoa is
- chosen when configuring the package for building. The configure process
- selects Carbon by default, to specify Cocoa use the \c{-cocoa} flag.
- configure for a 64-bit architecture using one of the \c{-arch} flags (see
- \l{universal binaries}{Universal Binaries}).
-
- Currently, Apple's GCC 4.0.1 is used by default. When building on 10.5,
- Apple's GCC 4.2 is also available and selectable with the configure flag:
- \c{-platform macx-g++42}. GCC 3.x will \e not work. Experimental LLVM-GCC
- support is available by passing in the \c{-platform macx-llvm} flag.
-
- The following table summarizes the different versions of Mac OS X and what
- capabilities are used by Qt.
-
- \table
- \header
- \o Mac OS X Version
- \o Cat Name
- \o Native API Used by Qt
- \o Bits available to address memory
- \o CPU Architecture Supported
- \o Development Platform
- \row
- \o 10.3
- \o Panther
- \o Carbon
- \o 32
- \o PPC
- \o No
- \row
- \o 10.4
- \o Tiger
- \o Carbon
- \o 32
- \o PPC/Intel
- \o Yes
- \row
- \o 10.5
- \o Leopard
- \o Carbon
- \o 32
- \o PPC/Intel
- \o Yes
- \row
- \o 10.5
- \o Leopard
- \o Cocoa
- \o 32/64
- \o PPC/Intel
- \o Yes
- \endtable
-
- \section2 Which One Should I Use?
-
- Carbon and Cocoa both have their advantages and disadvantages. Probably the
- easiest way to determine is to look at the version of Mac OS X you are
- targetting. If you are starting a new application and can target 10.5 and
- up, then please consider Cocoa only. If you have an existing application or
- need to target earlier versions of the operating system and do not need
- access to 64-bit or newer Apple technologies, then Carbon is a good fit. If
- your needs fall in between, you can go with a 64-bit Cocoa and 32-bit
- Carbon universal application with the appropriate checks in your code to
- choose the right path based on where you are running the application.
-
- \target universal binaries
- \section1 Universal Binaries
-
- In 2006, Apple begin transitioning from PowerPC (PPC) to Intel (x86)
- systems. Both architectures are supported by Qt. The release of Mac OS X
- 10.5 in October 2007 added the possibility of writing and deploying 64-bit
- GUI applications. Qt 4.5 supports both the 32-bit (PPC and x86) and 64-bit
- (PPC64 and x86-64) versions of PowerPC and Intel-based systems are
- supported.
-
- Universal binaries are used to bundle binaries for more than one
- architecture into a single package, simplifying deployment and
- distribution. When running an application the operating system will select
- the most appropriate architecture. Universal binaries support the following
- architectures; they can be added to the build at configure time using the
- \c{-arch} arguments:
-
- \table
- \header
- \o Architecture
- \o Flag
- \row
- \o Intel, 32-bit
- \o \c{-arch x86}
- \row
- \o Intel, 64-bit
- \o \c{-arch x86_64}
- \row
- \o PPC, 32-bit
- \o \c{-arch ppc}
- \row
- \o PPC, 64-bit
- \o \c{-arch ppc64}
- \endtable
-
- If there are no \c{-arch} flags specified, configure builds for the 32-bit
- architecture, if you are currently on one. Universal binaries were initially
- used to simplify the PPC to Intel migration. You can use \c{-universal} to
- build for both the 32-bit Intel and PPC architectures.
-
- \note The \c{-arch} flags at configure time only affect how Qt is built.
- Applications are by default built for the 32-bit architecture you are
- currently on. To build a universal binary, add the architectures to the
- CONFIG variable in the .pro file:
-
- \code
- CONFIG += x86 ppc x86_64 ppc64
- \endcode
-
-
- \section1 Day-to-Day Application Development on OS X
-
- On the command-line, applications can be built using \c qmake and \c make.
- Optionally, \c qmake can generate project files for Xcode with
- \c{-spec macx-xcode}. If you are using the binary package, \c qmake
- generates Xcode projects by default; use \c{-spec macx-gcc} to generate
- makefiles.
-
- The result of the build process is an application bundle, which is a
- directory structure that contains the actual application executable. The
- application can be launched by double-clicking it in Finder, or by
- referring directly to its executable from the command line, i. e.
- \c{myApp.app/Contents/MacOS/myApp}.
-
- If you wish to have a command-line tool that does not use the GUI (e.g.,
- \c moc, \c uic or \c ls), you can tell \c qmake not to execute the bundle
- creating steps by removing it from the \c{CONFIG} in your \c{.pro} file:
-
- \code
- CONFIG -= app_bundle
- \endcode
-
-
- \section1 Deployment - "Compile once, deploy everywhere"
-
- In general, Qt supports building on one Mac OS X version and deploying on
- all others, both forward and backwards. You can build on 10.4 Tiger and run
- the same binary on 10.3 and 10.5.
-
- Some restrictions apply:
-
- \list
- \o Some functions and optimization paths that exist in later versions
- of Mac OS X will not be available if you build on an earlier
- version of Mac OS X.
- \o The CPU architecture should match.
- \o Cocoa support is only available for Mac OS X 10.5 and up.
- \endlist
-
- Universal binaries can be used to provide a smorgasbord of configurations
- catering to all possible architectures.
-
- Mac applications are typically deployed as self-contained application
- bundles. The application bundle contains the application executable as well
- as dependencies such as the Qt libraries, plugins, translations and other
- resources you may need. Third party libraries like Qt are normally not
- installed system-wide; each application provides its own copy.
-
- The most common way to distribute applications is to provide a compressed
- disk image (.dmg file) that the user can mount in Finder. The Mac
- deployment tool (macdeployqt) can be used to create the self-contained bundles, and
- optionally also create a .dmg archive. See the
- \l{Deploying an Application on Mac OS X}{Mac deployment guide} for more
- information about deployment. It is also possible to use an installer
- wizard. More information on this option can be found in
- \l{http://developer.apple.com/mac/}{Apple's documentation}.
-*/
-
diff --git a/doc/src/development/activeqt-dumpcpp.qdoc b/doc/src/development/activeqt-dumpcpp.qdoc
new file mode 100644
index 0000000..03dc8e0
--- /dev/null
+++ b/doc/src/development/activeqt-dumpcpp.qdoc
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt-dumpcpp.html
+ \title The dumpcpp Tool (ActiveQt)
+
+ \ingroup activeqt-tools
+
+ \keyword dumpcpp
+
+ The \c dumpcpp tool generates a C++ namespace for a type library.
+
+ To generate a C++ namespace for a type library, call \c dumpcpp with the following
+ command line parameters:
+
+ \table
+ \header
+ \i Option
+ \i Result
+ \row
+ \i input
+ \i Generate documentation for \e input. \e input can specify a type library file or a type
+ library ID, or a CLSID or ProgID for an object
+ \row
+ \i -o file
+ \i Writes the class declaration to \e {file}.h and meta object infomation to \e {file}.cpp
+ \row
+ \i -n namespace
+ \i Generate a C++ namespace \e namespace
+ \row
+ \i -nometaobject
+ \i Do not generate a .cpp file with the meta object information.
+ The meta object is then generated in runtime.
+ \row
+ \i -getfile libid
+ \i Print the filename for the typelibrary \e libid to stdout
+ \row
+ \i -compat
+ \i Generate namespace with dynamicCall-compatible API
+ \row
+ \i -v
+ \i Print version information
+ \row
+ \i -h
+ \i Print help
+ \endtable
+
+ \c dumpcpp can be integrated into the \c qmake build system. In your .pro file, list the type
+ libraries you want to use in the TYPELIBS variable:
+
+ \snippet examples/activeqt/qutlook/qutlook.pro 0
+
+ The generated namespace will declare all enumerations, as well as one QAxObject subclass
+ for each \c coclass and \c interface declared in the type library. coclasses marked with
+ the \c control attribute will be wrapped by a QAxWidget subclass.
+
+ Those classes that wrap creatable coclasses (i.e. coclasses that are not marked
+ as \c noncreatable) have a default constructor; this is typically a single class
+ of type \c Application.
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 0
+
+ All other classes can only be created by passing an IDispatch interface pointer
+ to the constructor; those classes should however not be created explicitly.
+ Instead, use the appropriate API of already created objects.
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 1
+
+ All coclass wrappers also have one constructors taking an interface wrapper class
+ for each interface implemented.
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 2
+
+ You have to create coclasses to be able to connect to signals of the subobject.
+ Note that the constructor deletes the interface object, so the following will
+ cause a segmentation fault:
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 3
+
+ If the return type is of a coclass or interface type declared in another type
+ library you have to include the namespace header for that other type library
+ before including the header for the namespace you want to use (both header have
+ to be generated with this tool).
+
+ By default, methods and property returning subobjects will use the type as in
+ the type library. The caller of the function is responsible for deleting or
+ reparenting the object returned. If the \c -compat switch is set, properties
+ and method returning a COM object have the return type \c IDispatch*, and
+ the namespace will not declare wrapper classes for interfaces.
+
+ In this case, create the correct wrapper class explicitly:
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 4
+
+ You can of course use the IDispatch* returned directly, in which case you have to
+ call \c Release() when finished with the interface.
+
+ All classes in the namespace are tagged with a macro that allows you to export
+ or import them from a DLL. To do that, declare the macro to expand to
+ \c __declspec(dllimport/export) before including the header file.
+
+ To build the tool you must first build the QAxContainer library.
+ Then run your make tool in \c tools/dumpcpp.
+*/
diff --git a/doc/src/activeqt-dumpdoc.qdoc b/doc/src/development/activeqt-dumpdoc.qdoc
index 9ebc228..9ebc228 100644
--- a/doc/src/activeqt-dumpdoc.qdoc
+++ b/doc/src/development/activeqt-dumpdoc.qdoc
diff --git a/doc/src/activeqt-idc.qdoc b/doc/src/development/activeqt-idc.qdoc
index 2750505..2750505 100644
--- a/doc/src/activeqt-idc.qdoc
+++ b/doc/src/development/activeqt-idc.qdoc
diff --git a/doc/src/activeqt-testcon.qdoc b/doc/src/development/activeqt-testcon.qdoc
index 68df5e8..68df5e8 100644
--- a/doc/src/activeqt-testcon.qdoc
+++ b/doc/src/development/activeqt-testcon.qdoc
diff --git a/doc/src/development/assistant-manual.qdoc b/doc/src/development/assistant-manual.qdoc
new file mode 100644
index 0000000..29519fb
--- /dev/null
+++ b/doc/src/development/assistant-manual.qdoc
@@ -0,0 +1,810 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page assistant-manual.html
+ \title Qt Assistant Manual
+ \ingroup qttools
+
+ \startpage {index.html}{Qt Reference Documentation}
+ \nextpage Qt Assistant in More Detail
+
+ \keyword Qt Assistant
+
+ This document introduces \QA, a tool for presenting on-line
+ documentation. The document is divided into the following sections:
+
+ Table of contents:
+
+ \list
+ \o \l{The One-Minute Guide to Using Qt Assistant}
+ \o \l{Qt Assistant in More Detail}
+ \o \l{Using Qt Assistant as a Custom Help Viewer}
+ \endlist
+
+ \chapter The One-Minute Guide to Using Qt Assistant
+
+ Once you have installed Qt, \QA should be ready to run:
+
+ \list
+ \o On Windows, \QA is available as a menu option on the Qt menu.
+ \o On Mac OS X, \QA is installed in the /Developer/Applications/Qt directory.
+ \o On Unix/Linux, open a terminal, type \c{assistant} and press \key{Enter}.
+ \endlist
+
+ When you start up \QA, you will be presented with a standard main window
+ application, with a menu bar and toolbar. Below these, on the left hand
+ side are navigation windows called \e{Contents}, \e{Index} and \e{Bookmarks}.
+ On the right, taking up most of the space, is the \e{Documentation} window.
+ By default, \QA loads the Qt reference documentation along with the manuals
+ of other Qt tools, like \QD or \QL.
+
+ \QA works in a similar way to a Web browser. If you click hyperlinks
+ (cross-references), the \e{Documentation} window will present the relevant
+ page. You can bookmark pages of particular interest and you can click the
+ \gui{Previous} and \gui{Next} toolbar buttons to navigate within the pages
+ you have visited.
+
+ Although \QA can be used just like a Web browser to navigate through
+ the documentation, \QA offers a powerful means of navigation that Web
+ browsers do not provide. \QA uses an advanced full text search engine
+ to index all the pages in each compressed help file so that you can
+ search for particular words and phrases.
+
+ To perform an index search, click the \gui{Index} tab on the Sidebar
+ (or press \key{Alt+I}). In the \gui{'Look For'} line edit enter a word;
+ e.g., 'homedirpath'. As you type, words are found and highlighted in a list
+ beneath the line edit. If the highlighted text matches what you're
+ looking for, double click it, (or press \key{Enter}) and the
+ \e{Documentation} window will display the relevant page. You rarely have
+ to type in the whole word before \QA finds a match. Note that for some
+ words there may be more than one possible page that is relevant.
+
+ \QA also provides full text searching for finding specific words in
+ the documentation. To activate the full text search, either press \key(Alt+S)
+ or click on the \gui{Search} tab in the \e{Documentation} window. Then
+ enter the term you're looking for and hit the \gui{Search} button. All
+ documents containing the specified term will then be listed in the list box
+ below.
+*/
+
+/*!
+ \page assistant-details.html
+ \title Qt Assistant in More Detail
+
+ \contentspage {Qt Assistant Manual}{Contents}
+ \previouspage Qt Assistant Manual
+ \nextpage Using Qt Assistant as a Custom Help Viewer
+
+ \tableofcontents
+
+ \img assistant-assistant.png
+
+ \section1 Command Line Options
+
+ \QA handles the following command line options:
+
+ \table
+ \header
+ \o Command Line Option
+ \o Brief Description
+ \row
+ \o -collectionFile <file.qhc>
+ \o Uses the specified collection file instead of the default one.
+ \row
+ \o -showUrl URL
+ \o Shows the document referenced by URL.
+ \row
+ \o -enableRemoteControl
+ \o Enables \QA to be remotly controlled.
+ \row
+ \o -show <widget>
+ \o Shows the specified dockwidget which can be "contents", "index",
+ "bookmarks" or "search".
+ \row
+ \o -hide <widget>
+ \o Hides the specified dockwidget which can be "contents", "index",
+ "bookmarks" or "search.
+ \row
+ \o -activate <widget>
+ \o Activates the specified dockwidget which can be "contents",
+ "index", "bookmarks" or "search.
+ \row
+ \o -register <doc.qch>
+ \o Registers the specified compressed help file in the given help
+ collection.
+ \row
+ \o -unregister <doc.qch>
+ \o Unregisters the specified compressed help file from the given
+ collection file.
+ \row
+ \o -setCurrentFilter filter
+ \o Sets the given filter as the active filter.
+ \row
+ \o -quiet
+ \o Doesn't show any error, warning or success messages.
+ \endtable
+
+ \section1 Tool Windows
+
+ \img assistant-dockwidgets.png
+
+ The tool windows provide four ways to navigate the documentation:
+
+ \list
+ \o The \gui{Contents} window presents a table of contents implemented as a
+ tree view for the documentation that is available. If you click an item,
+ its documentation will appear in the \e{Documentation} window. If you double
+ click an item or click on the control to the left of it, the item's sub-items
+ will appear. Click a sub-item to make its page appear in the \e{Documentation}
+ window. Click on the control next to an open item to hide its sub-items.
+ \o The \gui{Index} window is used to look up key words or phrases.
+ See \l{The One-Minute Guide to Using Qt Assistant} for how to use this
+ window.
+ \o The \gui{Bookmarks} window lists any bookmarks you have made. Double
+ click a bookmark to make its page appear in the \e{Documentation} window.
+ The \gui{Bookmarks} window provides a context menu with \gui{Show Item},
+ \gui{Delete Item} as well as \gui{Rename Item}. Click in the main menu
+ \menu{Bookmark|Add Bookmark...} (or press \key{Ctrl+B}) to bookmark the
+ page that is currently showing in the \e{Documentation} window. Right click
+ a bookmark in the list to rename or delete the highlighted bookmark.
+ \endlist
+
+ If you want the \gui{Documentation} window to use as much space as possible,
+ you can easily group, move or hide the tool windows. To group the windows,
+ drag one on top of the other and release the mouse. If one or all tool
+ windows are not shown, press \key{Alt+C}, \key{Alt+I} or \key{Alt+O} to show
+ the required window.
+
+ The tool windows can be docked into the main window, so you can drag them
+ to the top, left, right or bottom of \e{Qt Assistant's} window, or you can
+ drag them outside \QA to float them as independent windows.
+
+ \section1 Documentation Window
+
+ \img assistant-docwindow.png
+
+ The \gui{Documentation} window lets you create a tab for each
+ documentation page that you view. Click the \gui{Add Tab} button and a new
+ tab will appear with the page name as the tab's caption. This makes it
+ convenient to switch between pages when you are working with different
+ documentation. You can delete a tab by clicking the \gui{Close Tab} button
+ located on the right side of the \gui{Documentation} window.
+
+ \section1 Toolbars
+
+ \img assistant-toolbar.png
+
+ The main toolbar provides fast access to the most common actions.
+
+ \table
+ \header \o Action \o Description \o Menu Item \o Shortcut
+ \row \o \gui{Previous} \o Takes you to the previous page in the history.
+ \o \menu{Go|Previous} \o \key{Alt+Left Arrow}
+ \row \o \gui{Next} \o Takes you to the next page in the history.
+ \o \menu{Go|Next} \o \key{Alt+Right Arrow}
+ \row \o \gui{Home}
+ \o Takes you to the home page as specified in the Preferences Dialog.
+ \o \menu{Go|Home} \o \key{Ctrl+Home}.
+ \row \o \gui{Sync with Table of Contents}
+ \o Synchronizes the \gui{Contents} tool window with the page currently
+ shown in the \gui{Documentation} window.
+ \o \menu{Go|Sync with Table of Contents} \o
+ \row \o \gui{Copy} \o Copies any selected text to the clipboard.
+ \o \menu{Edit|Copy} \o \key{Ctrl+C}
+ \row \o \gui{Print} \o Opens the \gui{Print} dialog.
+ \o \menu{File|Print} \o \key{Ctrl+P}
+ \row \o \gui{Find in Text} \o Opens the \gui{Find Text} dialog.
+ \o \menu{Edit|Find in Text} \o \key{Ctrl+F}
+ \row \o \gui{Zoom in}
+ \o Increases the font size used to display text in the current tab.
+ \o \menu{View|Zoom in} \o \key{Ctrl++}
+ \row \o \gui{Zoom out}
+ \o Decreases the font size used to display text in the current tab.
+ \o \menu{View|Zoom out} \o \key{Ctrl+-}
+ \row \o \gui{Normal Size}
+ \o Resets the font size to its normal size in the current tab.
+ \o \menu{View|Normal Size} \o \key{Ctrl+0}
+ \endtable
+
+ \img assistant-address-toolbar.png
+
+ The address toolbar provides a fast way to enter a specific URL for a
+ documentation file. By default, the address toolbar is not shown, so it
+ has to be activated via \menu{View|Toolbars|Address Toolbar}.
+
+ \img assistant-filter-toolbar.png
+
+ The filter toolbar allows you to apply a filter to the currently installed
+ documentation. As with the address toolbar, the filter toolbar is not visible
+ by default and has to be activated via \menu{View|Toolbars|Filter Toolbar}.
+
+ \section1 Menus
+
+ \section2 File Menu
+
+ \list
+ \o \menu{File|Page Setup...} invokes a dialog allowing you to define
+ page layout properties, such as margin sizes, page orientation and paper size.
+ \o \menu{File|Print Preview...} provides a preview of the printed pages.
+ \o \menu{File|Print...} opens the \l{#Print Dialog}{\gui{Print} dialog}.
+ \o \menu{File|New Tab} opens a new empty tab in the \gui{Documentation}
+ window.
+ \o \menu{File|Close Tab} closes the current tab of the
+ \gui{Documentation} window.
+ \o \menu{File|Exit} closes the \QA application.
+ \endlist
+
+ \section2 Edit Menu
+
+ \list
+ \o \menu{Edit|Copy} copies any selected text to the clipboard.
+ \o \menu{Edit|Find in Text} invokes the \l{#Find Text Control}{\gui{Find Text}
+ control} at the lower end of the \gui{Documentation} window.
+ \o \menu{Edit|Find Next} looks for the next occurance of the specified
+ text in the \gui{Find Text} control.
+ \o \menu{Edit|Find Previous} looks for the previous occurance of
+ the specified text in the \l{#Find Text Control}{\gui{Find Text} control}.
+ \o \menu{Edit|Preferences} invokes the \l{#Preferences Dialog}{\gui{Preferences} dialog}.
+ \endlist
+
+ \section2 View Menu
+
+ \list
+ \o \menu{View|Zoom in} increases the font size in the current tab.
+ \o \menu{View|Zoom out} decreases the font size in the current tab.
+ \o \menu{View|Normal Size} resets the font size in the current tab.
+ \o \menu{View|Contents} toggles the display of the \gui{Contents} tool window.
+ \o \menu{View|Index} toggles the display of the \gui{Index} tool window.
+ \o \menu{View|Bookmarks} toggles the display of the \gui{Bookmarks} tool window.
+ \o \menu{View|Search} toggles the display of the Search in the \gui{Documentation} window.
+ \endlist
+
+ \section2 Go Menu
+
+ \list
+ \o \menu{Go|Home} goes to the home page.
+ \o \menu{Go|Back} displays the previous page in the history.
+ \o \menu{Go|Forward} displays the next page in the history.
+ \o \menu{Go|Sync with Table of Contents} syncs the \gui{Contents} tool window to the currently shown page.
+ \o \menu{Go|Next Page} selects the next tab in the \gui{Documentation} window.
+ \o \menu{Go|Previous Page} selects the previous tab in the \gui{Documentation} window.
+ \endlist
+
+ \section2 Bookmarks Menu
+
+ \list
+ \o \menu{Bookmarks|Add} adds the current page to the list of bookmarks.
+ \endlist
+
+ \section1 Dialogs
+
+ \section2 Print Dialog
+
+ This dialog is platform-specific. It gives access to various printer
+ options and can be used to print the document shown in the current tab.
+
+ \section2 Preferences Dialog
+
+ \img assistant-preferences-fonts.png
+
+ The \menu{Fonts} page allows you to change the font family and font sizes of the
+ browser window displaying the documentation or the application itself.
+
+ \img assistant-preferences-filters.png
+
+ The \menu{Filters} page lets you create and remove documentation
+ filters. To add a new filter, click the \gui{Add} button, specify a
+ filter name in the pop-up dialog and click \gui{OK}, then select
+ the filter attributes in the list box on the right hand side.
+ You can delete a filter by selecting it and clicking the \gui{Remove}
+ button.
+
+ \img assistant-preferences-documentation.png
+
+ The \menu{Documentation} page lets you install and remove compressed help
+ files. Click the \gui{Install} button and choose the path of the compressed
+ help file (*.qch) you would like to install.
+ To delete a help file, select a documentation set in the list and click
+ \gui{Remove}.
+
+ \img assistant-preferences-options.png
+
+ The \menu{Options} page lets you specify the homepage \QA will display when
+ you click the \gui{Home} button in \QA's main user interface. You can specify
+ the hompage by typing it here or clicking on one of the buttons below the
+ textbox. \gui{Current Page} sets the currently displayed page as your home
+ page while \gui{Restore to default} will reset your home page to the default
+ home page.
+
+ \section1 Find Text Control
+
+ This control is used to find text in the current page. Enter the text you want
+ to find in the line edit. The search is incremental, meaning that the most
+ relevant result is shown as you enter characters into the line edit.
+
+ If you check the \gui{Whole words only} checkbox, the search will only consider
+ whole words; for example, if you search for "spin" with this checkbox checked it will
+ not match "spinbox", but will match "spin". If you check the \gui{Case sensitive}
+ checkbox then, for example, "spin" will match "spin" but not "Spin". You can
+ search forwards or backwards from your current position in the page by clicking
+ the \gui{Previous} or \gui{Next} buttons. To hide the find control, either click the
+ \gui{Close} button or hit the \key{Esc} key.
+
+ \section1 Filtering Help Contents
+
+ \QA allows you to install any kind of documentation as long as it is organized
+ in Qt compressed help files (*.qch). For example, it is possible to install the
+ Qt reference documentation for Qt 4.4.0 and Qt 4.4.1 at the same time. In many
+ respects, this is very convenient since only one version of \QA is needed.
+ However, at the same time it becomes more complicated when performing tasks like
+ searching the index because nearly every keyword is defined in Qt 4.4.0 as well
+ as in Qt 4.4.1. This means that \QA will always ask the user to choose which one
+ should be displayed.
+
+ We use documentation filters to solve this issue. A filter is identified by its
+ name, and contains a list of filter attributes. An attribute is just a string and
+ can be freely chosen. Attributes are defined by the documentation itself, this
+ means that every documentation set usually has one or more attributes.
+
+ For example, the Qt 4.4.0 \QA documentation defines the attributes \c {assistant},
+ \c{tools} and \c{4.4.0}, \QD defines \c{designer}, \c{tools} and \c{4.4.0}.
+ The filter to display all tools would then define only the attribute
+ \c{tools} since this attribute is part of both documentation sets.
+ Adding the attribute \c{assistant} to the filter would then only show \QA
+ documentation since the \QD documentation does not contain this
+ attribute. Having an empty list of attributes in a filter will match all
+ documentation; i.e., it is equivalent to requesting unfiltered documentation.
+
+ \section1 Full Text Searching
+
+ \img assistant-search.png
+
+ \QA provides a powerful full text search engine. To search
+ for certain words or text, click the \gui{Search} tab in the \gui{Documentation}
+ window. Then enter the text you want to look for and press \key{Enter}
+ or click the \gui{Search} button. The search is not case sensitive, so,
+ for example, Foo, fOo and FOO are all treated as the same. The following are
+ examples of common search patterns:
+
+ \list
+ \o \c deep -- lists all the documents that contain the word 'deep'
+ \o \c{deep*} -- lists all the documents that contain a word beginning
+ with 'deep'
+ \o \c{deep copy} -- lists all documents that contain both 'deep' \e
+ and 'copy'
+ \o \c{"deep copy"} -- list all documents that contain the phrase 'deep copy'
+ \endlist
+
+ It is also possible to use the \gui{Advanced search} to get more flexibility.
+ You can specify some words so that hits containing these are excluded from the
+ result, or you can search for an exact phrase. Searching for similar words will
+ give results like these:
+
+ \list
+ \o \c{QStin} -- lists all the documents with titles that are similar, such as \c{QString}
+ \o \c{QSting} -- lists all the documents with titles that are similar, such as \c{QString}
+ \o \c{QStrin} -- lists all the documents with titles that are similar, such as \c{QString}
+ \endlist
+
+ Options can be combined to improve the search results.
+
+ The list of documents found is ordered according to the number of
+ occurrences of the search text which they contain, with those containing
+ the highest number of occurrences appearing first. Simply click any
+ document in the list to display it in the \gui{Documentation} window.
+
+ If the documentation has changed \mdash for example, if documents have been added
+ or removed \mdash \QA will index them again.
+
+*/
+
+/*!
+ \page assistant-custom-help-viewer.html
+ \title Using Qt Assistant as a Custom Help Viewer
+
+ \contentspage {Qt Assistant Manual}{Contents}
+ \previouspage Qt Assistant in More Detail
+
+ Using \QA as custom help viewer requires more than just being able to
+ display custom documentation. It is equally important that the
+ appearance of \QA can be customized so that it is seen as a
+ application-specific help viewer rather than \QA. This is achieved by
+ changing the window title or icon, as well as some application-specific
+ menu texts and actions. The complete list of possible customizations
+ can be found in the \l{Creating a Custom Help Collection File} section.
+
+ Another requirement of a custom help viewer is the ability to receive
+ actions or commands from the application it provides help for. This is
+ especially important when the application offers context sensitive help.
+ When used in this way, the help viewer may need to change its contents
+ depending on the state the application is currently in. This means that
+ the application has to communicate the current state to the help viewer.
+ The section about \l{Using Qt Assistant Remotely} explains how this can
+ be done.
+
+ \tableofcontents
+
+ The \l{Simple Text Viewer Example}{Simple Text Viewer} example uses the
+ techniques described in this document to show how to use \QA as a custom
+ help viewer for an application.
+
+ \warning In order to ship Qt Assistant in your application, it is crucial
+ that you include the sqlite plugin. For more information on how to include
+ plugins in your application, refer to the \l{Deploying Qt Applications}
+ {deployment documentation}.
+
+ \section1 Qt Help Collection Files
+
+ The first important point to know about \QA is that it stores all
+ settings related to its appearance \e and a list of installed
+ documentation in a help collection file. This means, when starting \QA
+ with different collection files, \QA may look totally different. This
+ complete separation of settings makes it possible to deploy \QA as a
+ custom help viewer for more than one application on one machine
+ without risk of interference between different instances of \QA.
+
+ To apply a certain help collection to \QA, specify the respective
+ collection file on the command line when starting it. For example:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
+
+ However, storing all settings in one collection file raises some problems.
+ The collection file is usually installed in the same directory as the
+ application itself, or one of its subdirectories. Depending on the
+ directory and the operating system, the user may not have any permissions
+ to modify this file which would happen when the user settings are stored.
+ Also, it may not even be possible to give the user write permissions;
+ e.g., when the file is located on a read-only medium like a CD-ROM.
+
+ Even if it is possible to give everybody the right to store their settings
+ in a globally available collection file, the settings from one user would
+ be overwritten by another user when exiting \QA.
+
+ To solve this dilemma, \QA creates user specific collection files which
+ are more or less copied from the original collection file. The user-specific
+ collection file will be saved in a subdirectory of the path returned by
+ QDesktopServices::DataLocation. The subdirectory, or \e{cache directory}
+ within this user-specific location, can be defined in the help collection
+ project file. For example:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 7
+
+ So, when calling
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
+
+ \QA actually uses the collection file:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 9
+
+ There is no need ever to start \QA with the user specific collection
+ file. Instead, the collection file shipped with the application should
+ always be used. Also, when adding or removing documentation from the
+ collection file (see next section) always use the normal collection file.
+ \QA will take care of synchronizing the user collection files when the
+ list of installed documentation has changed.
+
+ \section1 Displaying Custom Documentation
+
+ Before \QA is able to show documentation, it has to know where it can
+ find the actual documentation files, meaning that it has to know the
+ location of the Qt compressed help file (*.qch). As already mentioned,
+ \QA stores references to the compressed help files in the currently used
+ collection file. So, when creating a new collection file you can list
+ all compressed help files \QA should display.
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 5
+
+ Sometimes, depending on the application for which \QA acts as a
+ help viewer, more documentation needs to be added over time; for
+ example, when installing more application components or plugins.
+ This can be done manually by starting \QA, opening the \gui{Edit|Preferences}
+ dialog and navigating to the \gui{Documentation} tab page. Then click
+ the \gui{Add...} button, select a Qt compressed help file (*.qch)
+ and press \gui{Open}. However, this approach has the disadvantage
+ that every user has to do it manually to get access to the new
+ documentation.
+
+ The prefered way of adding documentation to an already existing collection
+ file is to use the \c{-register} command line flag of \QA. When starting
+ \QA with this flag, the documentation will be added and \QA will
+ exit right away displaying a message if the registration was successful
+ or not.
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 6
+
+ The \c{-quiet} flag can be passed on to \QA to prevent it from writing
+ out the status message.
+
+ \bold{Note:} \QA will show the documentation in the contents view in the same
+ order as it was registered.
+
+
+ \section1 Changing the Appearance of Qt Assistant
+
+ The appearance of \QA can be changed by passing different command line options
+ on startup. However, these command line options only allow to show or hide
+ specific widgets, like the contents or index view. Other customizations, such
+ as changing the application title or icon, or disabling the filter functionality,
+ can be done by creating a custom help collection file.
+
+ \section2 Creating a Custom Help Collection File
+
+ The help collection file (*.qhc) used by \QA is created when running the
+ \c qcollectiongenerator tool on a help collection project file (*.qhcp).
+ The project file format is XML and supports the following tags:
+
+ \table
+ \header
+ \o Tag
+ \o Brief Description
+ \row
+ \o \c{<title>}
+ \o This property is used to specify a window title for \QA.
+ \row
+ \o \c{<homePage>}
+ \o This tag specifies which page should be display when
+ pressing the home button in \QA's main user interface.
+ \row
+ \o \c{<startPage>}
+ \o This tag specifies which page \QA should initially
+ display when the help collection is used.
+ \row
+ \o \c{<currentFilter>}
+ \o This tag specifies the \l{Qt Assistant in More Detail#Preferences Dialog}{filter}
+ that is initially used.
+ If this filter is not specified, the documentation will not be filtered. This has
+ no impact if only one documentation set is installed.
+ \row
+ \o \c{<applicationIcon>}
+ \o This tag describes an icon that will be used instead of the normal \QA
+ application icon. This is specified as a relative path from the directory
+ containing the collection file.
+ \row
+ \o \c{<enableFilterFunctionality>}
+ \o This tag is used to enable or disable user accessible filter functionality,
+ making it possible to prevent the user from changing any filter when running \QA.
+ It does not mean that the internal filter functionality is completely disabled.
+ Set the value to \c{false} if you want to disable the filtering. If the filter
+ toolbar should be shown by default, set the attribute \c{visible} to \c{true}.
+ \row
+ \o \c{<enableDocumentationManager>}
+ \o This tag is used to specify whether the documentation manager should be shown
+ in the preferences dialog. Disabling the Documentation Manager allows you to limit
+ \QA to display a specific documentation set or make it impossible for the end user
+ to accidentally remove or install documentation. To hide the documentation manager,
+ set the tag value to \c{false}.
+ \row
+ \o \c{<enableAddressBar>}
+ \o This tag describes if the address bar can be shown. By default it is
+ enabled; if you want to disable it set the tag value to \c{false}. If the
+ address bar functionality is enabled, the address bar can be shown by setting the
+ tag attribute \c{visible} to \c{true}.
+ \row
+ \o \c{<aboutMenuText>, <text>}
+ \o The \c{aboutMenuText} tag lists texts for different languages which will
+ later appear in the \menu{Help} menu; e.g., "About Application". A text is
+ specified within the \c{text} tags; the \c{language} attribute takes the two
+ letter language name. The text is used as the default text if no language
+ attribute is specified.
+ \row
+ \o \c{<aboutDialog>, <file>, <icon>}
+ \o The \c{aboutDialog} tag can be used to specify the text for the \gui{About}
+ dialog that can be opened from the \menu{Help} menu. The text is taken from the
+ file in the \c{file} tags. It is possible to specify a different file or any
+ language. The icon defined by the \c{icon} tags is applied to any language.
+ \row
+ \o \c{<cacheDirectory>}
+ \o Specified as a path relative to the directory given by
+ QDesktopServices::DataLocation, the cache path is used to store index files
+ needed for the full text search and a copy of the collection file.
+ The copy is needed because \QA stores all its settings in the collection file;
+ i.e., it must be writable for the user.
+ \endtable
+
+ In addition to those \QA specific tags, the tags for generating and registering
+ documentation can be used. See \l{The Qt Help Framework#Creating a Qt Help Collection}
+ {Qt Help Collection} documentation for more information.
+
+ An example of a help collection file that uses all the available tags is shown below:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 1
+
+ To create the binary collection file, run the \c qcollectiongenerator tool:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 10
+
+ To test the generated collection file, start \QA in the following way:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
+
+ \section1 Using Qt Assistant Remotely
+
+ Even though the help viewer is a standalone application, it will mostly
+ be launched by the application it provides help for. This approach
+ gives the application the possibility to ask for specific help contents
+ to be displayed as soon as the help viewer is started. Another advantage
+ with this approach is that the application can communicate with the
+ help viewer process and can therefore request other help contents to be
+ shown depending on the current state of the application.
+
+ So, to use \QA as the custom help viewer of your application, simply
+ create a QProcess and specify the path to the Assistant executable. In order
+ to make Assistant listen to your application, turn on its remote control
+ functionality by passing the \c{-enableRemoteControl} command line option.
+
+ \warning The trailing '\0' must be appended separately to the QByteArray,
+ e.g., \c{QByteArray("command" + '\0')}.
+
+ The following example shows how this can be done:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 2
+
+ Once \QA is running, you can send commands by using the stdin channel of
+ the process. The code snippet below shows how to tell \QA to show a certain
+ page in the documentation.
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 3
+
+ The following commands can be used to control \QA:
+
+ \table
+ \header
+ \o Command
+ \o Brief Description
+ \row
+ \o \c{show <Widget>}
+ \o Shows the dock widget specified by <Widget>. If the widget
+ is already shown and this command is sent again, the widget will be
+ activated, meaning that it will be raised and given the input focus.
+ Possible values for <Widget> are "contents", "index", "bookmarks" or "search".
+ \row
+ \o \c{hide <Widget>}
+ \o Hides the dock widget specified by <Widget>. Possible values for
+ <Widget> are "contents", "index", "bookmarks" and "search".
+ \row
+ \o \c{setSource <Url>}
+ \o Displays the given <Url>. The URL can be absolute or relative
+ to the currently displayed page. If the URL is absolute, it has to
+ be a valid Qt help system URL; i.e., starting with "qthelp://".
+ \row
+ \o \c{activateKeyword <Keyword>}
+ \o Inserts the specified <Keyword> into the line edit of the
+ index dock widget and activates the corresponding item in the
+ index list. If such an item has more than one link associated
+ with it, a topic chooser will be shown.
+ \row
+ \o \c{activateIdentifier <Id>}
+ \o Displays the help contents for the given <Id>. An ID is unique
+ in each namespace and has only one link associated to it, so the
+ topic chooser will never pop up.
+ \row
+ \o \c{syncContents}
+ \o Selects the item in the contents widget which corresponds to
+ the currently displayed page.
+ \row
+ \o \c{setCurrentFilter}
+ \o Selects the specified filter and updates the visual representation
+ accordingly.
+ \row
+ \o \c{expandToc <Depth>}
+ \o Expands the table of contents tree to the given depth. If depth
+ is less than 1, the tree will be collapsed completely.
+ \endtable
+
+ If you want to send several commands within a short period of time, it is
+ recommended that you write only a single line to the stdin of the process
+ instead of one line for every command. The commands have to be separated by
+ a semicolon, as shown in the following example:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 4
+
+ \section1 Compatibility with Old Formats
+
+ In older versions of Qt, the help system was based on Document Content File
+ (DCF) and Qt Assistant Documentation Profile (ADP) formats. In contrast,
+ Qt Assistant and the help system used in Qt 4.4 use the formats described
+ earlier in this manual.
+
+ Unfortunately, the old file formats are not compatible with the new ones.
+ In general, the differences are not that big \mdash in most cases is the old
+ format is just a subset of the new one. One example is the \c namespace tag in
+ the Qt Help Project format, which was not part of the old format, but plays a vital
+ role in the new one. To help you to move to the new file format, we have created
+ a conversion wizard.
+
+ The wizard is started by executing \c qhelpconverter. It guides you through the
+ conversion of different parts of the file and generates a new \c qch or \c qhcp
+ file.
+
+ Once the wizard is finished and the files created, run the \c qhelpgenerator
+ or the \c qcollectiongenerator tool to generate the binary help files used by \QA.
+*/
+
+/*
+\section2 Modifying \QA with Command Line Options
+
+ Different help collections can be shown by simply passing the help collection
+ path to \QA. For example:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 0
+
+ Other available options the can be passed on the command line.
+
+ \table
+ \header
+ \o Command Line Option
+ \o Brief Description
+ \row
+ \o -collectionFile <file.qhc>
+ \o Uses the specified collection file instead of the default one.
+ \row
+ \o -showUrl URL
+ \o Shows the document referenced by URL.
+ \row
+ \o -enableRemoteControl
+ \o Enables \QA to be remotly controlled.
+ \row
+ \o -show <widget>
+ \o Shows the specified dockwidget which can be "contents", "index",
+ "bookmarks" or "search".
+ \row
+ \o -hide <widget>
+ \o Hides the specified dockwidget which can be "contents", "index",
+ "bookmarks" or "search.
+ \row
+ \o -activate <widget>
+ \o Activates the specified dockwidget which can be "contents",
+ "index", "bookmarks" or "search.
+ \row
+ \o -register <doc.qch>
+ \o Registers the specified compressed help file in the given help
+ collection.
+ \row
+ \o -unregister <doc.qch>
+ \o Unregisters the specified compressed help file from the given
+ collection file.
+ \row
+ \o -quiet
+ \o Doesn't show any error, warning or success messages.
+ \endtable
+ */
diff --git a/doc/src/development/debug.qdoc b/doc/src/development/debug.qdoc
new file mode 100644
index 0000000..c3a3256
--- /dev/null
+++ b/doc/src/development/debug.qdoc
@@ -0,0 +1,243 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page debug.html
+ \title Debugging Techniques
+
+ Here we present some useful hints to help you with debugging your
+ Qt-based software.
+
+ \tableofcontents
+
+ \section1 Configuring Qt for Debugging
+
+ When \l{Installation}{configuring Qt for installation}, it is possible
+ to ensure that it is built to include debug symbols that can make it
+ easier to track bugs in applications and libraries. However, on some
+ platforms, building Qt in debug mode will cause applications to be larger
+ than desirable.
+
+ \section2 Debugging in Mac OS X and Xcode
+
+ \section3 Debugging With/Without Frameworks
+
+ The basic stuff you need to know about debug libraries and
+ frameworks is found at developer.apple.com in:
+ \l{http://developer.apple.com/technotes/tn2004/tn2124.html#SECDEBUGLIB}
+ {Apple Technicle Note TN2124} Qt follows that.
+
+ When you build Qt, frameworks are built by default, and inside the
+ framework you will find both a release and a debug version (e.g.,
+ QtCore and QtCore_debug). If you pass the \c{-no-framework} flag
+ when you build Qt, two dylibs are built for each Qt library (e.g.,
+ libQtCore.4.dylib and libQtCore_debug.4.dylib).
+
+ What happens when you link depends on whether you use frameworks
+ or not. We don't see a compelling reason to recommend one over the
+ other.
+
+ \section4 With Frameworks:
+
+ Since the release and debug libraries are inside the framework,
+ the app is simply linked against the framework. Then when you run
+ in the debugger, you will get either the release version or the
+ debug version, depending on whether you set \c{DYLD_IMAGE_SUFFIX}.
+ If you don't set it, you get the release version by default (i.e.,
+ non _debug). If you set \c{DYLD_IMAGE_SUFFIX=_debug}, you get the
+ debug version.
+
+ \section4 Without Frameworks:
+
+ When you tell \e{qmake} to generate a Makefile with the debug
+ config, it will link against the _debug version of the libraries
+ and generate debug symbols for the app. Running this program in
+ GDB will then work like running GDB on other platforms, and you
+ will be able to trace inside Qt.
+
+ \section3 Debug Symbols and Size
+
+ The amount of space taken up by debug symbols generated by GCC can
+ be excessively large. However, with the release of Xcode 2.3 it is
+ now possible to use Dwarf symbols which take up a significantly
+ smaller amount of space. To enable this feature when configuring
+ Qt, pass the \c{-dwarf-2} option to the configure script.
+
+ This is not enabled by default because previous versions of Xcode
+ will not work with the compiler flag used to implement this
+ feature. Mac OS X 10.5 will use dwarf-2 symbols by default.
+
+ dwarf-2 symbols contain references to source code, so the size of
+ the final debug application should compare favorably to a release
+ build.
+
+ \omit
+ Although it is not necessary to build Qt with debug symbols to use the
+ other techniques described in this document, certain features are only
+ available when Qt is configured for debugging.
+ \endomit
+
+ \section1 Command Line Options Recognized by Qt
+
+ When you run a Qt application, you can specify several
+ command-line options that can help with debugging. These are
+ recognized by QApplication.
+
+ \table
+ \header \o Option \o Description
+ \row \o \c -nograb
+ \o The application should never grab \link QWidget::grabMouse()
+ the mouse\endlink or \link QWidget::grabKeyboard() the
+ keyboard \endlink. This option is set by default when the
+ program is running in the \c gdb debugger under Linux.
+ \row \o \c -dograb
+ \o Ignore any implicit or explicit \c{-nograb}. \c -dograb wins over
+ \c -nograb even when \c -nograb is last on the command line.
+ \row \o \c -sync
+ \o Runs the application in X synchronous mode. Synchronous mode
+ forces the X server to perform each X client request
+ immediately and not use buffer optimization. It makes the
+ program easier to debug and often much slower. The \c -sync
+ option is only valid for the X11 version of Qt.
+ \endtable
+
+ \section1 Warning and Debugging Messages
+
+ Qt includes four global functions for writing out warning and debug
+ text. You can use them for the following purposes:
+
+ \list
+ \o qDebug() is used for writing custom debug output.
+ \o qWarning() is used to report warnings and recoverable errors in
+ your application.
+ \o qCritical() is used for writing critical error mesages and
+ reporting system errors.
+ \o qFatal() is used for writing fatal error messages shortly before exiting.
+ \endlist
+
+ If you include the <QtDebug> header file, the \c qDebug() function
+ can also be used as an output stream. For example:
+
+ \snippet doc/src/snippets/code/doc_src_debug.qdoc 0
+
+ The Qt implementation of these functions prints the text to the
+ \c stderr output under Unix/X11 and Mac OS X. With Windows, if it
+ is a console application, the text is sent to console; otherwise, it
+ is sent to the debugger. You can take over these functions by
+ installing a message handler using qInstallMsgHandler().
+
+ If the \c QT_FATAL_WARNINGS environment variable is set,
+ qWarning() exits after printing the warning message. This makes
+ it easy to obtain a backtrace in the debugger.
+
+ Both qDebug() and qWarning() are debugging tools. They can be
+ compiled away by defining \c QT_NO_DEBUG_OUTPUT and \c
+ QT_NO_WARNING_OUTPUT during compilation.
+
+ The debugging functions QObject::dumpObjectTree() and
+ QObject::dumpObjectInfo() are often useful when an application
+ looks or acts strangely. More useful if you use \l{QObject::setObjectName()}{object names}
+ than not, but often useful even without names.
+
+ \section1 Providing Support for the qDebug() Stream Operator
+
+ You can implement the stream operator used by qDebug() to provide
+ debugging support for your classes. The class that implements the
+ stream is \c QDebug. The functions you need to know about in \c
+ QDebug are \c space() and \c nospace(). They both return a debug
+ stream; the difference between them is whether a space is inserted
+ between each item. Here is an example for a class that represents
+ a 2D coordinate.
+
+ \snippet doc/src/snippets/qdebug/qdebugsnippet.cpp 0
+
+ Integration of custom types with Qt's meta-object system is covered
+ in more depth in the \l{Creating Custom Qt Types} document.
+
+ \section1 Debugging Macros
+
+ The header file \c <QtGlobal> contains some debugging macros and
+ \c{#define}s.
+
+ Three important macros are:
+ \list
+ \o \l{Q_ASSERT()}{Q_ASSERT}(cond), where \c cond is a boolean
+ expression, writes the warning "ASSERT: '\e{cond}' in file xyz.cpp, line
+ 234" and exits if \c cond is false.
+ \o \l{Q_ASSERT_X()}{Q_ASSERT_X}(cond, where, what), where \c cond is a
+ boolean expression, \c where a location, and \c what a message,
+ writes the warning: "ASSERT failure in \c{where}: '\c{what}', file xyz.cpp, line 234"
+ and exits if \c cond is false.
+ \o \l{Q_CHECK_PTR()}{Q_CHECK_PTR}(ptr), where \c ptr is a pointer.
+ Writes the warning "In file xyz.cpp, line 234: Out of memory" and
+ exits if \c ptr is 0.
+ \endlist
+
+ These macros are useful for detecting program errors, e.g. like this:
+
+ \snippet doc/src/snippets/code/doc_src_debug.qdoc 1
+
+ Q_ASSERT(), Q_ASSERT_X(), and Q_CHECK_PTR() expand to nothing if
+ \c QT_NO_DEBUG is defined during compilation. For this reason,
+ the arguments to these macro should not have any side-effects.
+ Here is an incorrect usage of Q_CHECK_PTR():
+
+ \snippet doc/src/snippets/code/doc_src_debug.qdoc 2
+
+ If this code is compiled with \c QT_NO_DEBUG defined, the code in
+ the Q_CHECK_PTR() expression is not executed and \e alloc returns
+ an unitialized pointer.
+
+ The Qt library contains hundreds of internal checks that will
+ print warning messages when a programming error is detected. We
+ therefore recommend that you use a debug version of Qt when
+ developing Qt-based software.
+
+ \section1 Common Bugs
+
+ There is one bug that is so common that it deserves mention here:
+ If you include the Q_OBJECT macro in a class declaration and
+ run \link moc.html the meta-object compiler\endlink (\c{moc}),
+ but forget to link the \c{moc}-generated object code into your
+ executable, you will get very confusing error messages. Any link
+ error complaining about a lack of \c{vtbl}, \c{_vtbl}, \c{__vtbl}
+ or similar is likely to be a result of this problem.
+*/
diff --git a/doc/src/development/designer-manual.qdoc b/doc/src/development/designer-manual.qdoc
new file mode 100644
index 0000000..b1d7c8f
--- /dev/null
+++ b/doc/src/development/designer-manual.qdoc
@@ -0,0 +1,2836 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page designer-manual.html
+
+ \title Qt Designer Manual
+ \ingroup qttools
+ \keyword Qt Designer
+
+ \QD is Qt's tool for designing and building graphical user
+ interfaces (GUIs) from Qt components. You can compose and customize your
+ widgets or dialogs in a what-you-see-is-what-you-get (WYSIWYG) manner, and
+ test them using different styles and resolutions.
+
+ Widgets and forms created with \QD integrated seamlessly with programmed
+ code, using Qt's signals and slots mechanism, that lets you easily assign
+ behavior to graphical elements. All properties set in \QD can be changed
+ dynamically within the code. Furthermore, features like widget promotion
+ and custom plugins allow you to use your own components with \QD.
+
+ If you are new to \QD, you can take a look at the
+ \l{Getting To Know Qt Designer} document. For a quick tutorial on how to
+ use \QD, refer to \l{A Quick Start to Qt Designer}.
+
+ Qt Designer 4.5 boasts a long list of improvements. For a detailed list of
+ what is new, refer \l{What's New in Qt Designer 4.5}.
+
+ \image designer-multiple-screenshot.png
+
+ For more information on using \QD, you can take a look at the following
+ links:
+
+ \list
+ \o \l{Qt Designer's Editing Modes}
+ \list
+ \o \l{Qt Designer's Widget Editing Mode}{Widget Editing Mode}
+ \o \l{Qt Designer's Signals and Slots Editing Mode}
+ {Signals and Slots Editing Mode}
+ \o \l{Qt Designer's Buddy Editing Mode}
+ {Buddy Editing Mode}
+ \o \l{Qt Designer's Tab Order Editing Mode}
+ {Tab Order Editing Mode}
+ \endlist
+ \o \l{Using Layouts in Qt Designer}
+ \o \l{Saving, Previewing and Printing Forms in Qt Designer}
+ \o \l{Using Containers in Qt Designer}
+ \o \l{Creating Main Windows in Qt Designer}
+ \o \l{Editing Resources with Qt Designer}
+ \o \l{Using Stylesheets with Qt Designer}
+ \o \l{Using a Designer UI File in Your Application}
+ \endlist
+
+ For advanced usage of \QD, you can refer to these links:
+
+ \list
+ \o \l{Customizing Qt Designer Forms}
+ \o \l{Using Custom Widgets with Qt Designer}
+ \o \l{Creating Custom Widgets for Qt Designer}
+ \o \l{Creating Custom Widget Extensions}
+ \o \l{Qt Designer's UI File Format}
+ \endlist
+
+
+ \section1 Legal Notices
+
+ Some source code in \QD is licensed under specific highly permissive
+ licenses from the original authors. The Qt team gratefully acknowledges
+ these contributions to \QD and all uses of \QD should also acknowledge
+ these contributions and quote the following license statements in an
+ appendix to the documentation.
+
+ \list
+ \i \l{Implementation of the Recursive Shadow Casting Algorithm in Qt Designer}
+ \endlist
+*/
+
+
+
+/*!
+ \page designer-whats-new.html
+ \contentspage {Qt Designer Manual}{Contents}
+
+
+ \title What's New in Qt Designer 4.5
+
+ \section1 General Changes
+
+
+ \table
+ \header
+ \i Widget Filter Box
+ \i Widget Morphing
+ \i Disambiguation Field
+ \row
+ \i \inlineimage designer-widget-filter.png
+ \i \inlineimage designer-widget-morph.png
+ \i \inlineimage designer-disambiguation.png
+ \endtable
+
+ \list 1
+ \i Displaying only icons in the \gui{Widget Box}: It is now possible
+ for the \gui{Widget Box} to display icons only. Simply select
+ \gui{Icon View} from the context menu.
+ \i Filter for \gui{Widget Box}: A filter is now provided to quickly
+ locate the widget you need. If you use a particular widget
+ frequently, you can always add it to the
+ \l{Getting to Know Qt Designer#WidgetBox}{scratch pad}.
+ \i Support for QButtonGroup: It is available via the context
+ menu of a selection of QAbstractButton objects.
+ \i Improved support for item widgets: The item widgets' (e.g.,
+ QListWidget, QTableWidget, and QTreeWidget) contents dialogs have
+ been improved. You can now add translation comments and also modify
+ the header properties.
+ \i Widget morphing: A widget can now be morphed from one type to
+ another with its layout and properties preserved. To begin, click
+ on your widget and select \gui{Morph into} from the context menu.
+ \i Disambiguation field: The property editor now shows this extra
+ field under the \gui{accessibleDescription} property. This field
+ has been introduced to aid translators in the case of two source
+ texts being the same but used for different purposes. For example,
+ a dialog could have two \gui{Add} buttons for two different
+ reasons. \note To maintain compatibility, comments in UI files
+ created prior to Qt 4.5 will be listed in the \gui{Disambiguation}
+ field.
+ \endlist
+
+
+
+ \section1 Improved Shortcuts for the Editing Mode
+
+ \list
+ \i The \key{Shift+Click} key combination now selects the ancestor for
+ nested layouts. This iterates from one ancestor to the other.
+
+ \i The \key{Ctrl} key is now used to toggle and copy drag. Previously
+ this was done with the \key{Shift} key but is now changed to
+ conform to standards.
+
+ \i The left mouse button does rubber band selection for form windows;
+ the middle mouse button does rubber band selection everywhere.
+ \endlist
+
+
+ \section1 Layouts
+ \list
+ \i It is now possible to switch a widget's layout without breaking it
+ first. Simply select the existing layout and change it to another
+ type using the context menu or the layout buttons on the toolbar.
+
+ \i To quickly populate a \gui{Form Layout}, you can now use the
+ \gui{Add form layout row...} item available in the context menu or
+ double-click on the red layout.
+ \endlist
+
+
+ \section1 Support for Embedded Design
+
+ \table
+ \header
+ \i Comboboxes to Select a Device Profile
+ \row
+ \i \inlineimage designer-embedded-preview.png
+ \endtable
+
+ It is now possible to specify embedded device profiles, e.g., Style, Font,
+ Screen DPI, resolution, default font, etc., in \gui{Preferences}. These
+ settings will affect the \gui{Form Editor}. The profiles will also be
+ visible with \gui{Preview}.
+
+
+ \section1 Related Classes
+
+ \list
+ \i QUiLoader \mdash forms loaded with this class will now react to
+ QEvent::LanguageChange if QUiLoader::setLanguageChangeEnabled() or
+ QUiLoader::isLanguageChangeEnabled() is set to true.
+
+ \i QDesignerCustomWidgetInterface \mdash the
+ \l{QDesignerCustomWidgetInterface::}{domXml()} function now has new
+ attributes for its \c{<ui>} element. These attributes are
+ \c{language} and \c{displayname}. The \c{language} element can be
+ one of the following "", "c++", "jambi". If this element is
+ specified, it must match the language in which Designer is running.
+ Otherwise, this element will not be available. The \c{displayname}
+ element represents the name that will be displayed in the
+ \gui{Widget Box}. Previously this was hardcoded to be the class
+ name.
+
+ \i QWizard \mdash QWizard's page now has a string \c{id} attribute that
+ can be used to fill in enumeration values to be used by the
+ \c{uic}. However, this attribute has no effect on QUiLoader.
+ \endlist
+*/
+
+
+/*!
+ \page designer-to-know.html
+ \contentspage {Qt Designer Manual}{Contents}
+
+
+ \title Getting to Know Qt Designer
+
+ \tableofcontents
+
+ \image designer-screenshot.png
+
+ \section1 Launching Designer
+
+ The way that you launch \QD depends on your platform:
+
+ \list
+ \i On Windows, click the Start button, under the \gui Programs submenu,
+ open the \gui{Qt 4} submenu and click \gui Designer.
+ \i On Unix or Linux, you might find a \QD icon on the desktop
+ background or in the desktop start menu under the \gui Programming
+ or \gui Development submenus. You can launch \QD from this icon.
+ Alternatively, you can type \c{designer} in a terminal window.
+ \i On Mac OS X, double click on \QD in \gui Finder.
+ \endlist
+
+ \section1 The User Interface
+
+ When used as a standalone application, \QD's user interface can be
+ configured to provide either a multi-window user interface (the default
+ mode), or it can be used in docked window mode. When used from within an
+ integrated development environment (IDE) only the multi-window user
+ interface is available. You can switch modes in the \gui Preferences dialog
+ from the \gui Edit menu.
+
+ In multi-window mode, you can arrange each of the tool windows to suit your
+ working style. The main window consists of a menu bar, a tool bar, and a
+ widget box that contains the widgets you can use to create your user
+ interface.
+
+ \target MainWindow
+ \table
+ \row
+ \i \inlineimage designer-main-window.png
+ \i \bold{Qt Designer's Main Window}
+
+ The menu bar provides all the standard actions for managing forms,
+ using the clipboard, and accessing application-specific help.
+ The current editing mode, the tool windows, and the forms in use can
+ also be accessed via the menu bar.
+
+ The tool bar displays common actions that are used when editing a form.
+ These are also available via the main menu.
+
+ The widget box provides common widgets and layouts that are used to
+ design components. These are grouped into categories that reflect their
+ uses or features.
+ \endtable
+
+ Most features of \QD are accessible via the menu bar, the tool bar, or the
+ widget box. Some features are also available through context menus that can
+ be opened over the form windows. On most platforms, the right mouse is used
+ to open context menus.
+
+ \target WidgetBox
+ \table
+ \row
+ \i \inlineimage designer-widget-box.png
+ \i \bold{Qt Designer's Widget Box}
+
+ The widget box provides a selection of standard Qt widgets, layouts,
+ and other objects that can be used to create user interfaces on forms.
+ Each of the categories in the widget box contain widgets with similar
+ uses or related features.
+
+ \note Since Qt 4.4, new widgets have been included, e.g.,
+ QPlainTextEdit, QCommandLinkButton, QScrollArea, QMdiArea, and
+ QWebView.
+
+ You can display all of the available objects in a category by clicking
+ on the handle next to the category label. When in
+ \l{Qt Designer's Widget Editing Mode}{Widget Editing
+ Mode}, you can add objects to a form by dragging the appropriate items
+ from the widget box onto the form, and dropping them in the required
+ locations.
+
+ \QD provides a scratch pad feature that allows you to collect
+ frequently used objects in a separate category. The scratch pad
+ category can be filled with any widget currently displayed in a form
+ by dragging them from the form and dropping them onto the widget box.
+ These widgets can be used in the same way as any other widgets, but
+ they can also contain child widgets. Open a context menu over a widget
+ to change its name or remove it from the scratch pad.
+ \endtable
+
+
+ \section1 The Concept of Layouts in Qt
+
+ A layout is used to arrange and manage the elements that make up a user
+ interface. Qt provides a number of classes to automatically handle layouts
+ -- QHBoxLayout, QVBoxLayout, QGridLayout, and QFormLayout. These classes
+ solve the challenge of laying out widgets automatically, providing a user
+ interface that behaves predictably. Fortunately knowledge of the layout
+ classes is not required to arrange widgets with \QD. Instead, select one of
+ the \gui{Lay Out Horizontally}, \gui{Lay Out in a Grid}, etc., options from
+ the context menu.
+
+ Each Qt widget has a recommended size, known as \l{QWidget::}{sizeHint()}.
+ The layout manager will attempt to resize a widget to meet its size hint.
+ In some cases, there is no need to have a different size. For example, the
+ height of a QLineEdit is always a fixed value, depending on font size and
+ style. In other cases, you may require the size to change, e.g., the width
+ of a QLineEdit or the width and height of item view widgets. This is where
+ the widget size constraints -- \l{QWidget::minimumSize()}{minimumSize} and
+ \l{QWidget::maximumSize()}{maximumSize} constraints come into play. These
+ are properties you can set in the property editor. For example, to override
+ the default \l{QWidget::}{sizeHint()}, simply set
+ \l{QWidget::minimumSize()}{minimumSize} and \l{QWidget::maximumSize()}
+ {maximumSize} to the same value. Alternatively, to use the current size as
+ a size constraint value, choose one of the \gui{Size Constraint} options
+ from the widget's context menu. The layout will then ensure that those
+ constraints are met. To control the size of your widgets via code, you can
+ reimplement \l{QWidget::}{sizeHint()} in your code.
+
+ The screenshot below shows the breakdown of a basic user interface designed
+ using a grid. The coordinates on the screenshot show the position of each
+ widget within the grid.
+
+ \image addressbook-tutorial-part3-labeled-layout.png
+
+ \note Inside the grid, the QPushButton objects are actually nested. The
+ buttons on the right are first placed in a QVBoxLayout; the buttons at the
+ bottom are first placed in a QHBoxLayout. Finally, they are put into
+ coordinates (1,2) and (3,1) of the QGridLayout.
+
+ To visualize, imagine the layout as a box that shrinks as much as possible,
+ attempting to \e squeeze your widgets in a neat arrangement, and, at the
+ same time, maximize the use of available space.
+
+ Qt's layouts help when you:
+
+ \list 1
+ \i Resize the user face to fit different window sizes.
+ \i Resize elements within the user interface to suit different
+ localizations.
+ \i Arrange elements to adhere to layout guidelines for different
+ platforms.
+ \endlist
+
+ So, you no longer have to worry about rearranging widgets for different
+ platforms, settings, and languages.
+
+ The example below shows how different localizations can affect the user
+ interface. When a localization requires more space for longer text strings
+ the Qt layout automatically scales to accommodate this, while ensuring that
+ the user interface looks presentable and still matches the platform
+ guidelines.
+
+ \table
+ \header
+ \i A Dialog in English
+ \i A Dialog in French
+ \row
+ \i \image designer-english-dialog.png
+ \i \image designer-french-dialog.png
+ \endtable
+
+ The process of laying out widgets consists of creating the layout hierarchy
+ while setting as few widget size constraints as possible.
+
+ For a more technical perspective on Qt's layout classes, refer to the
+ \l{Layout Management} documentation.
+*/
+
+
+/*!
+ \page designer-quick-start.html
+ \contentspage {Qt Designer Manual}{Contents}
+
+
+ \title A Quick Start to Qt Designer
+
+ Using \QD involves \bold four basic steps:
+
+ \list 1
+ \o Choose your form and objects
+ \o Lay the objects out on the form
+ \o Connect the signals to the slots
+ \o Preview the form
+ \endlist
+
+ \image rgbController-screenshot.png
+
+ Suppose you would like to design a small widget (see screenshot above) that
+ contains the controls needed to manipulate Red, Green and Blue (RGB) values
+ -- a type of widget that can be seen everywhere in image manipulation
+ programs.
+
+ \table
+ \row
+ \i \inlineimage designer-choosing-form.png
+ \i \bold{Choosing a Form}
+
+ You start by choosing \gui Widget from the \gui{New Form} dialog.
+ \endtable
+
+
+ \table
+ \row
+ \i \inlineimage rgbController-arrangement.png
+ \i \bold{Placing Widgets on a Form}
+
+ Drag three labels, three spin boxes and three vertical sliders on to your
+ form. To change the label's default text, simply double-click on it. You
+ can arrange them according to how you would like them to be laid out.
+ \endtable
+
+ To ensure that they are laid out exactly like this in your program, you
+ need to place these widgets into a layout. We will do this in groups of
+ three. Select the "RED" label. Then, hold down \key Ctrl while you select
+ its corresponding spin box and slider. In the \gui{Form} menu, select
+ \gui{Lay Out in a Grid}.
+
+ \table
+ \row
+ \i \inlineimage rgbController-form-gridLayout.png
+ \i \inlineimage rgbController-selectForLayout.png
+ \endtable
+
+
+ Repeat the step for the other two labels along with their corresponding
+ spin boxes and sliders as well.
+
+ The next step is to combine all three layouts into one \bold{main layout}.
+ The main layout is the top level widget's (in this case, the QWidget)
+ layout. It is important that your top level widget has a layout; otherwise,
+ the widgets on your window will not resize when your window is resized. To
+ set the layout, \gui{Right click} anywhere on your form, outside of the
+ three separate layouts, and select \gui{Lay Out Horizontally}.
+ Alternatively, you could also select \gui{Lay Out in a Grid} -- you will
+ still see the same arrangement (shown below).
+
+ \image rgbController-final-layout.png
+
+ \note Main layouts cannot be seen on the form. To check if you have a main
+ layout installed, try resizing your form; your widgets should resize
+ accordingly. Alternatively, you can take a look at \QD's
+ \gui{Object Inspector}. If your top level widget does not have a layout,
+ you will see the broken layout icon next to it,
+ \inlineimage rgbController-no-toplevel-layout.png
+ .
+
+ When you click on the slider and drag it to a certain value, you want the
+ spin box to display the slider's position. To accomplish this behavior, you
+ need to connect the slider's \l{QAbstractSlider::}{valueChanged()} signal
+ to the spin box's \l{QSpinBox::}{setValue()} slot. You also need to make
+ the reverse connections, e.g., connect the spin box's \l{QSpinBox::}
+ {valueChanged()} signal to the slider's \l{QAbstractSlider::value()}
+ {setValue()} slot.
+
+ To do this, you have to switch to \gui{Edit Signals/Slots} mode, either by
+ pressing \key{F4} or something \gui{Edit Signals/Slots} from the \gui{Edit}
+ menu.
+
+ \table
+ \row
+ \i \inlineimage rgbController-signalsAndSlots.png
+ \i \bold{Connecting Signals to Slots}
+
+ Click on the slider and drag the cursor towards the spin box. The
+ \gui{Configure Connection} dialog, shown below, will pop up. Select the
+ correct signal and slot and click \gui OK.
+ \endtable
+
+ \image rgbController-configure-connection1.png
+
+ Repeat the step (in reverse order), clicking on the spin box and dragging
+ the cursor towards the slider, to connect the spin box's
+ \l{QSpinBox::}{valueChanged()} signal to the slider's
+ \l{QAbstractSlider::value()}{setValue()} slot.
+
+ You can use the screenshot below as a guide to selecting the correct signal
+ and slot.
+
+ \image rgbController-configure-connection2.png
+
+ Now that you have successfully connected the objects for the "RED"
+ component of the RGB Controller, do the same for the "GREEN" and "BLUE"
+ components as well.
+
+ Since RGB values range between 0 and 255, we need to limit the spin box
+ and slider to that particular range.
+
+ \table
+ \row
+ \i \inlineimage rgbController-property-editing.png
+ \i \bold{Setting Widget Properties}
+
+ Click on the first spin box. Within the \gui{Property Editor}, you will
+ see \l{QSpinBox}'s properties. Enter "255" for the
+ \l{QSpinBox::}{maximum} property. Then, click on the first vertical
+ slider, you will see \l{QAbstractSlider}'s properties. Enter "255" for
+ the \l{QAbstractSlider::}{maximum} property as well. Repeat this
+ process for the remaining spin boxes and sliders.
+ \endtable
+
+ Now, we preview your form to see how it would look in your application -
+ press \key{Ctrl + R} or select \gui Preview from the \gui Form menu. Try
+ dragging the slider - the spin box will mirror its value too (and vice
+ versa). Also, you can resize it to see how the layouts that are used to
+ manage the child widgets, respond to different window sizes.
+*/
+
+
+/*!
+ \page designer-editing-mode.html
+ \previouspage Getting to Know Qt Designer
+ \contentspage {Qt Designer Manual}{Contents}
+ \nextpage Using Layouts in Qt Designer
+
+ \title Qt Designer's Editing Modes
+
+ \QD provides four editing modes: \l{Qt Designer's Widget Editing Mode}
+ {Widget Editing Mode}, \l{Qt Designer's Signals and Slots Editing Mode}
+ {Signals and Slots Editing Mode}, \l{Qt Designer's Buddy Editing Mode}
+ {Buddy Editing Mode} and \l{Qt Designer's Tab Order Editing Mode}
+ {Tab Order Editing Mode}. When working with \QD, you will always be in one
+ of these four modes. To switch between modes, simply select it from the
+ \gui{Edit} menu or the toolbar. The table below describes these modes in
+ further detail.
+
+ \table
+ \header \i \i \bold{Editing Modes}
+ \row
+ \i \inlineimage designer-widget-tool.png
+ \i In \l{Qt Designer's Widget Editing Mode}{Edit} mode, we can
+ change the appearance of the form, add layouts, and edit the
+ properties of each widget. To switch to this mode, press
+ \key{F3}. This is \QD's default mode.
+
+ \row
+ \i \inlineimage designer-connection-tool.png
+ \i In \l{Qt Designer's Signals and Slots Editing Mode}
+ {Signals and Slots} mode, we can connect widgets together using
+ Qt's signals and slots mechanism. To switch to this mode, press
+ \key{F4}.
+
+ \row
+ \i \inlineimage designer-buddy-tool.png
+ \i In \l{Qt Designer's Buddy Editing Mode}{Buddy Editing Mode},
+ buddy widgets can be assigned to label widgets to help them
+ handle keyboard focus correctly.
+
+ \row
+ \i \inlineimage designer-tab-order-tool.png
+ \i In \l{Qt Designer's Tab Order Editing Mode}
+ {Tab Order Editing Mode}, we can set the order in which widgets
+ receive the keyboard focus.
+ \endtable
+
+*/
+
+
+/*!
+ \page designer-widget-mode.html
+ \previouspage Qt Designer's Editing Modes
+ \contentspage {Qt Designer Manual}{Contents}
+ \nextpage Qt Designer's Signals and Slots Editing Mode
+
+ \title Qt Designer's Widget Editing Mode
+
+ \image designer-editing-mode.png
+
+ In the Widget Editing Mode, objects can be dragged from the main window's
+ widget box to a form, edited, resized, dragged around on the form, and even
+ dragged between forms. Object properties can be modified interactively, so
+ that changes can be seen immediately. The editing interface is intuitive
+ for simple operations, yet it still supports Qt's powerful layout
+ facilities.
+
+
+ \tableofcontents
+
+ To create and edit new forms, open the \gui File menu and select
+ \gui{New Form...} or press \key{Ctrl+N}. Existing forms can also be edited
+ by selecting \gui{Open Form...} from the \gui File menu or pressing
+ \key{Ctrl+O}.
+
+ At any point, you can save your form by selecting the \gui{Save From As...}
+ option from the \gui File menu. The UI files saved by \QD contain
+ information about the objects used, and any details of signal and slot
+ connections between them.
+
+
+ \section1 Editing A Form
+
+ By default, new forms are opened in widget editing mode. To switch to Edit
+ mode from another mode, select \gui{Edit Widgets} from the \gui Edit menu
+ or press the \key F3 key.
+
+ Objects are added to the form by dragging them from the main widget box
+ and dropping them in the desired location on the form. Once there, they
+ can be moved around simply by dragging them, or using the cursor keys.
+ Pressing the \key Ctrl key at the same time moves the selected widget
+ pixel by pixel, while using the cursor keys alone make the selected widget
+ snap to the grid when it is moved. Objects can be selected by clicking on
+ them with the left mouse button. You can also use the \key Tab key to
+ change the selection.
+
+ ### Screenshot of widget box, again
+
+ The widget box contains objects in a number of different categories, all of
+ which can be placed on the form as required. The only objects that require
+ a little more preparation are the \gui Container widgets. These are
+ described in further detail in the \l{Using Containers in Qt Designer}
+ chapter.
+
+
+ \target SelectingObjects
+ \table
+ \row
+ \i \inlineimage designer-selecting-widget.png
+ \i \bold{Selecting Objects}
+
+ Objects on the form are selected by clicking on them with the left
+ mouse button. When an object is selected, resize handles are shown at
+ each corner and the midpoint of each side, indicating that it can be
+ resized.
+
+ To select additional objects, hold down the \key Shift key and click on
+ them. If more than one object is selected, the current object will be
+ displayed with resize handles of a different color.
+
+ To move a widget within a layout, hold down \key Shift and \key Control
+ while dragging the widget. This extends the selection to the widget's
+ parent layout.
+
+ Alternatively, objects can be selected in the
+ \l{The Object Inspector}{Object Inspector}.
+ \endtable
+
+ When a widget is selected, normal clipboard operations such as cut, copy,
+ and paste can be performed on it. All of these operations can be done and
+ undone, as necessary.
+
+ The following shortcuts can be used:
+
+ \target ShortcutsForEditing
+ \table
+ \header \i Action \i Shortcut \i Description
+ \row
+ \i Cut
+ \i \key{Ctrl+X}
+ \i Cuts the selected objects to the clipboard.
+ \row
+ \i Copy
+ \i \key{Ctrl+C}
+ \i Copies the selected objects to the clipboard.
+ \row
+ \i Paste
+ \i \key{Ctrl+V}
+ \i Pastes the objects in the clipboard onto the form.
+ \row
+ \i Delete
+ \i \key Delete
+ \i Deletes the selected objects.
+ \row
+ \i Clone object
+ \i \key{Ctrl+drag} (leftmouse button)
+ \i Makes a copy of the selected object or group of objects.
+ \row
+ \i Preview
+ \i \key{Ctrl+R}
+ \i Shows a preview of the form.
+ \endtable
+
+ All of the above actions (apart from cloning) can be accessed via both the
+ \gui Edit menu and the form's context menu. These menus also provide
+ funcitons for laying out objects as well as a \gui{Select All} function to
+ select all the objects on the form.
+
+ Widgets are not unique objects; you can make as many copies of them as you
+ need. To quickly duplicate a widget, you can clone it by holding down the
+ \key Ctrl key and dragging it. This allows widgets to be copied and placed
+ on the form more quickly than with clipboard operations.
+
+
+ \target DragAndDrop
+ \table
+ \row
+ \i \inlineimage designer-dragging-onto-form.png
+ \i \bold{Drag and Drop}
+
+ \QD makes extensive use of the drag and drop facilities provided by Qt.
+ Widgets can be dragged from the widget box and dropped onto the form.
+
+ Widgets can also be "cloned" on the form: Holding down \key Ctrl and
+ dragging the widget creates a copy of the widget that can be dragged to
+ a new position.
+
+ It is also possible to drop Widgets onto the \l {The Object Inspector}
+ {Object Inspector} to handle nested layouts easily.
+ \endtable
+
+ \QD allows selections of objects to be copied, pasted, and dragged between
+ forms. You can use this feature to create more than one copy of the same
+ form, and experiment with different layouts in each of them.
+
+
+ \section2 The Property Editor
+
+ The Property Editor always displays properties of the currently selected
+ object on the form. The available properties depend on the object being
+ edited, but all of the widgets provided have common properties such as
+ \l{QObject::}{objectName}, the object's internal name, and
+ \l{QWidget::}{enabled}, the property that determines whether an
+ object can be interacted with or not.
+
+
+ \target EditingProperties
+ \table
+ \row
+ \i \inlineimage designer-property-editor.png
+ \i \bold{Editing Properties}
+
+ The property editor uses standard Qt input widgets to manage the
+ properties of jbects on the form. Textual properties are shown in line
+ edits, integer properties are displayed in spinboxes, boolean
+ properties are displayed in check boxes, and compound properties such
+ as colors and sizes are presented in drop-down lists of input widgets.
+
+ Modified properties are indicated with bold labels. To reset them, click
+ the arrow button on the right.
+
+ Changes in properties are applied to all selected objects that have the
+ same property.
+ \endtable
+
+ Certain properties are treated specially by the property editor:
+
+ \list
+ \o Compound properties -- properties that are made up of more than one
+ value -- are represented as nodes that can be expanded, allowing
+ their values to be edited.
+ \o Properties that contain a choice or selection of flags are edited
+ via combo boxes with checkable items.
+ \o Properties that allow access to rich data types, such as QPalette,
+ are modified using dialogs that open when the properties are edited.
+ QLabel and the widgets in the \gui Buttons section of the widget box
+ have a \c text property that can also be edited by double-clicking
+ on the widget or by pressing \gui F2. \QD interprets the backslash
+ (\\) character specially, enabling newline (\\n) characters to be
+ inserted into the text; the \\\\ character sequence is used to
+ insert a single backslash into the text. A context menu can also be
+ opened while editing, providing another way to insert special
+ characters and newlines into the text.
+ \endlist
+
+
+ \section2 Dynamic Properties
+
+ The property editor can also be used to add new
+ \l{QObject#Dynamic Properties}{dynamic properties} to both standard Qt
+ widgets and to forms themselves. Since Qt 4.4, dynamic properties are added
+ and removed via the property editor's toolbar, shown below.
+
+ \image designer-property-editor-toolbar.png
+
+ To add a dynamic property, clcik on the \gui Add button
+ \inlineimage designer-property-editor-add-dynamic.png
+ . To remove it, click on the \gui Remove button
+ \inlineimage designer-property-editor-remove-dynamic.png
+ instead. You can also sort the properties alphabetically and change the
+ color groups by clickinig on the \gui Configure button
+ \inlineimage designer-property-editor-configure.png
+ .
+
+ \section2 The Object Inspector
+ \table
+ \row
+ \i \inlineimage designer-object-inspector.png
+ \i \bold{The Object Inspector}
+
+ The \gui{Object Inspector} displays a hierarchical list of all the
+ objects on the form that is currently being edited. To show the child
+ objects of a container widget or a layout, click the handle next to the
+ object label.
+
+ Each object on a form can be selected by clicking on the corresponding
+ item in the \gui{Object Inspector}. Right-clicking opens the form's
+ context menu. These features can be useful if you have many overlapping
+ objects. To locate an object in the \gui{Object Inspector}, use
+ \key{Ctrl+F}.
+
+ Since Qt 4.4, double-clicking on the object's name allows you to change
+ the object's name with the in-place editor.
+
+ Since Qt 4.5, the \gui{Object Inspector} displays the layout state of
+ the containers. The broken layout icon ###ICON is displayed if there is
+ something wrong with the layouts.
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-layouts.html
+ \previouspage Qt Designer's Widget Editing Mode
+ \contentspage
+ \nextpage Qt Designer's Signals and Slots Editing Mode
+
+ \title Using Layouts in Qt Designer
+
+ Before a form can be used, the objects on the form need to be placed into
+ layouts. This ensures that the objects will be displayed properly when the
+ form is previewed or used in an application. Placing objects in a layout
+ also ensures that they will be resized correctly when the form is resized.
+
+
+ \tableofcontents
+
+ \section1 Applying and Breaking Layouts
+
+ The simplest way to manage objects is to apply a layout to a group of
+ existing objects. This is achieved by selecting the objects that you need
+ to manage and applying one of the standard layouts using the main toolbar,
+ the \gui Form menu, or the form's context menu.
+
+ Once widgets have been inserted into a layout, it is not possible to move
+ and resize them individually because the layout itself controls the
+ geometry of each widget within it, taking account of the hints provided by
+ spacers. Instead, you must either break the layout and adjust each object's
+ geometry manually, or you can influence the widget's geometry by resizing
+ the layout.
+
+ To break the layout, press \key{Ctrl+0} or choose \gui{Break Layout} from
+ the form's context menu, the \gui Form menu or the main toolbar. You can
+ also add and remove spacers from the layout to influence the geometries of
+ the widgets.
+
+
+ \target InsertingObjectsIntoALayout
+ \table
+ \row
+ \i \inlineimage designer-layout-inserting.png
+ \i \bold{Inserting Objects into a Layout}
+
+ Objects can be inserted into an existing layout by dragging them from
+ their current positions and dropping them at the required location. A
+ blue cursor is displayed in the layout as an object is dragged over
+ it to indicate where the object will be added.
+ \endtable
+
+
+ \section2 Setting A Top Level Layout
+
+ The form's top level layout can be set by clearing the slection (click the
+ left mouse button on the form itself) and applying a layout. A top level
+ layout is necessary to ensure that your widgets will resize correctly when
+ its window is resized. To check if you have set a top level layout, preview
+ your widget and attempt to resize the window by dragging the size grip.
+
+ \table
+ \row
+ \i \inlineimage designer-set-layout.png
+ \i \bold{Applying a Layout}
+
+ To apply a layout, you can select your choice of layout from the
+ toolbar shown on the left, or from the context menu shown below.
+ \endtable
+
+ \image designer-set-layout2.png
+
+
+ \section2 Horizontal and Vertical Layouts
+
+ The simplest way to arrange objects on a form is to place them in a
+ horizontal or vertical layout. Horizontal layouts ensure that the widgets
+ within are aligned horizontally; vertical layouts ensure that they are
+ aligned vertically.
+
+ Horizontal and vertical layouts can be combined and nested to any depth.
+ However, if you need more control over the placement of objects, consider
+ using the grid layout.
+
+
+ \section3 The Grid Layout
+
+ Complex form layouts can be created by placing objects in a grid layout.
+ This kind of layout gives the form designer much more freedom to arrange
+ widgets on the form, but can result in a much less flexible layout.
+ However, for some kinds of form layout, a grid arrangement is much more
+ suitable than a nested arrangement of horizontal and vertical layouts.
+
+
+ \section3 Splitter Layouts
+
+ Another common way to manage the layout of objects on a form is to place
+ them in a splitter. These splitters arrange the objects horizontally or
+ vertically in the same way as normal layouts, but also allow the user to
+ adjust the amount of space allocated to each object.
+
+ \image designer-splitter-layout.png
+
+ Although QSplitter is a container widget, \QD treats splitter objects as
+ layouts that are applied to existing widgets. To place a group of widgets
+ into a splitter, select them
+ \l{Qt Designer's Widget Editing Mode#SelectingObjects}{as described here}
+ then apply the splitter layout by using the appropriate toolbar button,
+ keyboard shortcut, or \gui{Lay out} context menu entry.
+
+
+ \section3 The Form Layout
+
+ Since Qt 4.4, another layout class has been included -- QFormLayout. This
+ class manages widgets in a two-column form; the left column holds labels
+ and the right column holds field widgets such as line edits, spin boxes,
+ etc. The QFormLayout class adheres to various platform look and feel
+ guidelines and supports wrapping for long rows.
+
+ \image designer-form-layout.png
+
+ The UI file above results in the previews shown below.
+
+ \table
+ \header
+ \i Windows XP
+ \i Mac OS X
+ \i Cleanlooks
+ \row
+ \i \inlineimage designer-form-layout-windowsXP.png
+ \i \inlineimage designer-form-layout-macintosh.png
+ \i \inlineimage designer-form-layout-cleanlooks.png
+ \endtable
+
+
+ \section2 Shortcut Keys
+
+ In addition to the standard toolbar and context menu entries, there is also
+ a set of keyboard shortcuts to apply layouts on widgets.
+
+ \target LayoutShortcuts
+ \table
+ \header
+ \i Layout
+ \i Shortcut
+ \i Description
+ \row
+ \i Horizontal
+ \i \key{Ctrl+1}
+ \i Places the selected objects in a horizontal layout.
+ \row
+ \i Vertical
+ \i \key{Ctrl+2}
+ \i Places the selected objects in a vertical layout.
+ \row
+ \i Grid
+ \i \key{Ctrl+5}
+ \i Places the selected objects in a grid layout.
+ \row
+ \i Form
+ \i \key{Ctrl+6}
+ \i Places the selected objects in a form layout.
+ \row
+ \i Horizontal splitter
+ \i \key{Ctrl+3}
+ \i Creates a horizontal splitter and places the selected objects
+ inside it.
+ \row
+ \i Vertical splitter
+ \i \key{Ctrl+4}
+ \i Creates a vertical splitter and places the selected objects
+ inside it.
+ \row
+ \i Adjust size
+ \i \key{Ctrl+J}
+ \i Adjusts the size of the layout to ensure that each child object
+ has sufficient space to display its contents. See
+ QWidget::adjustSize() for more information.
+ \endtable
+
+ \note \key{Ctrl+0} is used to break a layout.
+
+*/
+
+
+/*!
+ \page designer-preview.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Using Layouts in Qt Designer
+ \nextpage Qt Designer's Buddy Editing Mode
+ \title Saving, Previewing and Printing Forms in Qt Designer
+
+ Although \QD's forms are accurate representations of the components being
+ edited, it is useful to preview the final appearance while editing. This
+ feature can be activated by opening the \gui Form menu and selecting
+ \gui Preview, or by pressing \key{Ctrl+R} when in the form.
+
+ \image designer-dialog-preview.png
+
+ The preview shows exactly what the final component will look like when used
+ in an application.
+
+ Since Qt 4.4, it is possible to preview forms with various skins - default
+ skins, skins created with Qt Style Sheets or device skins. This feature
+ simulates the effect of calling \c{QApplication::setStyleSheet()} in the
+ application.
+
+ To preview your form with skins, open the \gui Edit menu and select
+ \gui{Preferences...}
+
+ You will see the dialog shown below:
+
+ \image designer-preview-style.png
+
+ The \gui{Print/Preview Configuration} checkbox must be checked to activate
+ previews of skins. You can select the styles provided from the \gui{Style}
+ drop-down box.
+
+ \image designer-preview-style-selection.png
+
+ Alternatively, you can preview custom style sheet created with Qt Style
+ Sheets. The figure below shows an example of Qt Style Sheet syntax and the
+ corresponding output.
+
+ \image designer-preview-stylesheet.png
+
+ Another option would be to preview your form with device skins. A list of
+ generic device skins are available in \QD, however, you may also use
+ other QVFB skins with the \gui{Browse...} option.
+
+ \image designer-preview-deviceskin-selection.png
+
+
+ \section1 Viewing the Form's Code
+
+ Since Qt 4.4, it is possible to view code generated by the User Interface
+ Compiler (uic) for the \QD form.
+
+ \image designer-form-viewcode.png
+
+ Select \gui{View Code...} from the \gui{Form} menu and a dialog with the
+ generated code will be displayed. The screenshot below is an example of
+ code generated by the \c{uic}.
+
+ \image designer-code-viewer.png
+
+ \section1 Saving and Printing the Form
+
+ Forms created in \QD can be saved to an image or printed.
+
+ \table
+ \row
+ \i \inlineimage designer-file-menu.png
+ \i \bold{Saving Forms}
+
+ To save a form as an image, choose the \gui{Save Image...} option. The file
+ will be saved in \c{.png} format.
+
+ \bold{Printing Forms}
+
+ To print a form, select the \gui{Print...} option.
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-connection-mode.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Using Layouts in Qt Designer
+ \nextpage Qt Designer's Buddy Editing Mode
+
+
+ \title Qt Designer's Signals and Slots Editing Mode
+
+ \image designer-connection-mode.png
+
+ In \QD's signals and slots editing mode, you can connect objects in a form
+ together using Qt's signals and slots mechanism. Both widgets and layouts
+ can be connected via an intuitive connection interface, using the menu of
+ compatible signals and slots provided by \QD. When a form is saved, all
+ connections are preserved so that they will be ready for use when your
+ project is built.
+
+
+ \tableofcontents
+
+ For more information on Qt's signals and sltos mechanism, refer to the
+ \l{Signals and Slots} document.
+
+
+ \section1 Connecting Objects
+
+ To begin connecting objects, enter the signals and slots editing mode by
+ opening the \gui Edit menu and selecting \gui{Edit Signals/Slots}, or by
+ pressing the \key F4 key.
+
+ All widgets and layouts on the form can be connected together. However,
+ spacers just provide spacing hints to layouts, so they cannot be connected
+ to other objects.
+
+
+ \target HighlightedObjects
+ \table
+ \row
+ \i \inlineimage designer-connection-highlight.png
+ \i \bold{Highlighted Objects}
+
+ When the cursor is over an object that can be used in a connection, the
+ object will be highlighted.
+ \endtable
+
+ To make a connectionn, press the left mouse button and drag the cursor
+ towards the object you want to connect it to. As you do this, a line will
+ extend from the source object to the cursor. If the cursor is over another
+ object on the form, the line will end with an arrow head that points to the
+ destination object. This indicates that a connection will be made between
+ the two objects when you release the mouse button.
+
+ You can abandon the connection at any point while you are dragging the
+ connection path by pressing \key{Esc}.
+
+ \target MakingAConnection
+ \table
+ \row
+ \i \inlineimage designer-connection-making.png
+ \i \bold{Making a Connection}
+
+ The connection path will change its shape as the cursor moves around
+ the form. As it passes over objects, they are highlighted, indicating
+ that they can be used in a signal and slot connection. Release the
+ mouse button to make the connection.
+ \endtable
+
+ The \gui{Configure Connection} dialog (below) is displayed, showing signals
+ from the source object and slots from the destination object that you can
+ use.
+
+ \image designer-connection-dialog.png
+
+ To complete the connection, select a signal from the source object and a
+ slot from the destination object, then click \key OK. Click \key Cancel if
+ you wish to abandon the connection.
+
+ \note If the \gui{Show all signals and slots} checkbox is selected, all
+ available signals from the source object will be shown. Otherwise, the
+ signals and slots inherited from QWidget will be hidden.
+
+ You can make as many connections as you like between objects on the form;
+ it is possible to connect signals from objects to slots in the form itself.
+ As a result, the signal and slot connections in many dialogs can be
+ completely configured from within \QD.
+
+ \target ConnectingToTheForm
+ \table
+ \row
+ \i \inlineimage designer-connection-to-form.png
+ \i \bold{Connecting to a Form}
+
+ To connect an object to the form itself, simply position the cursor
+ over the form and release the mouse button. The end point of the
+ connection changes to the electrical "ground" symbol.
+ \endtable
+
+
+ \section1 Editing and Deleting Connections
+
+ By default, connection paths are created with two labels that show the
+ signal and slot involved in the connection. These labels are usually
+ oriented along the line of the connection. You can move them around inside
+ their host widgets by dragging the red square at each end of the connection
+ path.
+
+ \target ConnectionEditor
+ \table
+ \row
+ \i \inlineimage designer-connection-editor.png
+ \i \bold{The Signal/Slot Editor}
+
+ The signal and slot used in a connection can be changed after it has
+ been set up. When a connection is configured, it becomes visible in
+ \QD's signal and slot editor where it can be further edited. You can
+ also edit signal/slot connections by double-clicking on the connection
+ path or one of its labels to display the Connection Dialog.
+ \endtable
+
+ \target DeletingConnections
+ \table
+ \row
+ \i \inlineimage designer-connection-editing.png
+ \i \bold{Deleting Connections}
+
+ The whole connection can be selected by clicking on any of its path
+ segments. Once selected, a connection can be deleted with the
+ \key Delete key, ensuring that it will not be set up in the UI
+ file.
+ \endtable
+*/
+
+
+/*!
+ \page designer-buddy-mode.html
+ \contentspage{Qt Designer Manual}{Contents}
+ \previouspage Qt Designer's Signals and Slots Editing Mode
+ \nextpage Qt Designer's Tab Order Editing Mode
+
+ \title Qt Designer's Buddy Editing Mode
+
+ \image designer-buddy-mode.png
+
+ One of the most useful basic features of Qt is the support for buddy
+ widgets. A buddy widget accepts the input focus on behalf of a QLabel when
+ the user types the label's shortcut key combination. The buddy concept is
+ also used in Qt's \l{Model/View Programming}{model/view} framework.
+
+
+ \section1 Linking Labels to Buddy Widgets
+
+ To enter buddy editing mode, open the \gui Edit menu and select
+ \gui{Edit Buddies}. This mode presents the widgets on the form in a similar
+ way to \l{Qt Designer's Signals and Slots Editing Mode}{signals and slots
+ editing mode} but in this mode, connections must start at label widgets.
+ Ideally, you should connect each label widget that provides a shortcut with
+ a suitable input widget, such as a QLineEdit.
+
+
+ \target MakingBuddies
+ \table
+ \row
+ \i \inlineimage designer-buddy-making.png
+ \i \bold{Making Buddies}
+
+ To define a buddy widget for a label, click on the label, drag the
+ connection to another widget on the form, and release the mouse button.
+ The connection shown indicates how input focus is passed to the buddy
+ widget. You can use the form preview to test the connections between
+ each label and its buddy.
+ \endtable
+
+
+ \section1 Removing Buddy Connections
+
+ Only one buddy widget can be defined for each label. To change the buddy
+ used, it is necessary to delete any existing buddy connection before you
+ create a new one.
+
+ Connections between labels and their buddy widgets can be deleted in the
+ same way as signal-slot connections in signals and slots editing mode:
+ Select the buddy connection by clicking on it and press the \key Delete
+ key. This operation does not modify either the label or its buddy in any
+ way.
+*/
+
+
+/*!
+ \page designer-tab-order.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Qt Designer's Buddy Editing Mode
+ \nextpage Using Containers in Qt Designer
+
+ \title Qt Designer's Tab Order Editing Mode
+
+ \image designer-tab-order-mode.png
+
+ Many users expect to be able to navigate between widgets and controls
+ using only the keyboard. Qt lets the user navigate between input widgets
+ with the \key Tab and \key{Shift+Tab} keyboard shortcuts. The default
+ \e{tab order} is based on the order in which widgets are constructed.
+ Although this order may be sufficient for many users, it is often better
+ to explicitly specify the tab order to make your application easier to
+ use.
+
+
+ \section1 Setting the Tab Order
+
+ To enter tab order editing mode, open the \gui Edit menu and select
+ \gui{Edit Tab Order}. In this mode, each input widget in the form is shown
+ with a number indicating its position in the tab order. So, if the user
+ gives the first input widget the input focus and then presses the tab key,
+ the focus will move to the second input widget, and so on.
+
+ The tab order is defined by clicking on each of the numbers in the correct
+ order. The first number you click will change to red, indicating the
+ currently edited position in the tab order chain. The widget associated
+ with the number will become the first one in the tab order chain. Clicking
+ on another widget will make it the second in the tab order, and so on.
+
+ Repeat this process until you are satisfied with the tab order in the form
+ -- you do not need to click every input widget if you see that the
+ remaining widgets are already in the correct order. Numbers, for which you
+ already set the order, change to green, while those which are not clicked
+ yet, remain blue.
+
+ If you make a mistake, simply double click outside of any number or choose
+ \gui{Restart} from the form's context menu to start again. If you have many
+ widgets on your form and would like to change the tab order in the middle or
+ at the end of the tab order chain, you can edit it at any position. Press
+ \key{Ctrl} and click the number from which you want to start.
+ Alternatively, choose \gui{Start from Here} in the context menu.
+
+*/
+
+
+/*!
+ \page designer-using-containers.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Qt Designer's Tab Order Editing Mode
+ \nextpage Creating Main Windows in Qt Designer
+
+
+ \title Using Containers in Qt Designer
+
+ Container widgets provide high level control over groups of objects on a
+ form. They can be used to perform a variety of functions, such as managing
+ input widgets, providing paged and tabbed layouts, or just acting as
+ decorative containers for other objects.
+
+ \image designer-widget-morph.png
+
+ \QD provides visual feedback to help you place objects inside your
+ containers. When you drag an object from the widget box (or elsewhere) on
+ the form, each container will be highlighted when the cursor is positioned
+ over it. This indicates that you can drop the object inside, making it a
+ child object of the container. This feedback is important because it is
+ easy to place objects close to containers without actually placing them
+ inside. Both widgets and spacers can be used inside containers.
+
+ Stacked widgets, tab widgets, and toolboxes are handled specially in \QD.
+ Normally, when adding pages (tabs, pages, compartments) to these containers
+ in your own code, you need to supply existing widgets, either as
+ placeholders or containing child widgets. In \QD, these are automatically
+ created for you, so you can add child objects to each page straight away.
+
+ Each container typically allows its child objects to be arranged in one or
+ more layouts. The type of layout management provided depends on each
+ container, although setting the layout is usually just a matter of
+ selecting the container by clicking it, and applying a layout. The table
+ below shows a list of available containers.
+
+ \table
+ \row
+ \i \inlineimage designer-containers-frame.png
+ \i \bold Frames
+
+ Frames are used to enclose and group widgets, as well as to provide
+ decoration. They are used as the foundation for more complex
+ containers, but they can also be used as placeholders in forms.
+
+ The most important properties of frames are \c frameShape,
+ \c frameShadow, \c lineWidth, and \c midLineWidth. These are described
+ in more detail in the QFrame class description.
+
+ \row
+ \i \inlineimage designer-containers-groupbox.png
+ \i \bold{Group Boxes}
+
+ Group boxes are usually used to group together collections of
+ checkboxes and radio buttons with similar purposes.
+
+ Among the significant properties of group boxes are \c title, \c flat,
+ \c checkable, and \c checked. These are demonstrated in the
+ \l{widgets/groupbox}{Group Box} example, and described in the QGroupBox
+ class documentation. Each group box can contain its own layout, and
+ this is necessary if it contains other widgets. To add a layout to the
+ group box, click inside it and apply the layout as usual.
+
+ \row
+ \i \inlineimage designer-containers-stackedwidget.png
+ \i \bold{Stacked Widgets}
+
+ Stacked widgets are collections of widgets in which only the topmost
+ layer is visible. Control over the visible layer is usually managed by
+ another widget, such as combobox, using signals and slots.
+
+ \QD shows arrows in the top-right corner of the stack to allow you to
+ see all the widgets in the stack when designing it. These arrows do not
+ appear in the preview or in the final component. To navigate between
+ pages in the stack, select the stacked widget and use the
+ \gui{Next Page} and \gui{Previous Page} entries from the context menu.
+ The \gui{Insert Page} and \gui{Delete Page} context menu options allow
+ you to add and remove pages.
+
+ \row
+ \i \inlineimage designer-containers-tabwidget.png
+ \i \bold{Tab Widgets}
+
+ Tab widgets allow the developer to split up the contents of a widget
+ into different labelled sections, only one of which is displayed at any
+ given time. By default, the tab widget contains two tabs, and these can
+ be deleted or renamed as required. You can also add additional tabs.
+
+ To delete a tab:
+ \list
+ \o Click on its label to make it the current tab.
+ \o Select the tab widget and open its context menu.
+ \o Select \gui{Delete Page}.
+ \endlist
+
+ To add a new tab:
+ \list
+ \o Select the tab widget and open its context menu.
+ \o Select \gui{Insert Page}.
+ \o You can add a page before or after the \e current page. \QD
+ will create a new widget for that particular tab and insert it
+ into the tab widget.
+ \o You can set the title of the current tab by changing the
+ \c currentTabText property in the \gui{Property Editor}.
+ \endlist
+
+ \row
+ \i \inlineimage designer-containers-toolbox.png
+ \i \bold{ToolBox Widgets}
+
+ Toolbox widgets provide a series of pages or compartments in a toolbox.
+ They are handled in a way similar to stacked widgets.
+
+ To rename a page in a toolbox, make the toolbox your current pange and
+ change its \c currentItemText property from the \gui{Property Editor}.
+
+ To add a new page, select \gui{Insert Page} from the toolbox widget's
+ context menu. You can add the page before or after the current page.
+
+ To delete a page, select \gui{Delete Page} from the toolbox widget's
+ context menu.
+
+ \row
+ \i \inlineimage designer-containers-dockwidget.png
+ \i \bold{Dock Widgets}
+
+ Dock widgets are floating panels, often containing input widgets and
+ more complex controls, that are either attached to the edges of the
+ main window in "dock areas", or floated as independent tool windows.
+
+ Although dock widgets can be added to any type of form, they are
+ typically used with forms created from the
+ \l{Creating Main Windows in Qt Designer}{main window template}.
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-creating-mainwindows.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Using Containers in Qt Designer
+ \nextpage Editing Resources with Qt Designer
+
+ \title Creating Main Windows in Qt Designer
+
+ \QD can be used to create user interfaces for different purposes, and
+ it provides different kinds of form templates for each user interface. The
+ main window template is used to create application windows with menu bars,
+ toolbars, and dock widgets.
+
+ \omit
+ \image designer-mainwindow-example.png
+ \endomit
+
+ Create a new main window by opening the \gui File menu and selecting the
+ \gui{New Form...} option, or by pressing \key{Ctrl+N}. Then, select the
+ \gui{Main Window} template. This template provides a main application
+ window containing a menu bar and a toolbar by default -- these can be
+ removed if they are not required.
+
+ If you remove the menu bar, a new one can be created by selecting the
+ \gui{Create Menu Bar} option from the context menu, obtained by
+ right-clicking within the main window form.
+
+ An application can have only \bold one menu bar, but \bold several
+ toolbars.
+
+
+ \section1 Menus
+
+ Menus are added to the menu bar by modifying the \gui{Type Here}
+ placeholders. One of these is always present for editing purposes, and
+ will not be displayed in the preview or in the finished window.
+
+ Once created, the properties of a menu can be accessed using the
+ \l{Qt Designer's Widget Editing Mode#The Property Editor}{Property Editor},
+ and each menu can be accessed for this purpose via the
+ \l{Qt Designer's Widget Editing Mode#The Object Inspector}{The Object Inspector}.
+
+ Existing menus can be removed by opening a context menu over the label in
+ the menu bar, and selecting \gui{Remove Menu 'menu_name'}.
+
+
+ \target CreatingAMenu
+ \table
+ \row
+ \i \inlineimage designer-creating-menu1.png
+ \i \inlineimage designer-creating-menu2.png
+ \i \bold{Creating a Menu}
+
+ Double-click the placeholder item to begin editing. The menu text,
+ displayed using a line edit, can be modified.
+
+ \row
+ \i \inlineimage designer-creating-menu3.png
+ \i \inlineimage designer-creating-menu4.png
+ \i Insert the required text for the new menu. Inserting an
+ ampersand character (&) causes the letter following it to be
+ used as a mnemonic for the menu.
+
+ Press \key Return or \key Enter to accept the new text, or press
+ \key Escape to reject it. You can undo the editing operation later if
+ required.
+ \endtable
+
+ Menus can also be rearranged in the menu bar simply by dragging and
+ dropping them in the preferred location. A vertical red line indicates the
+ position where the menu will be inserted.
+
+ Menus can contain any number of entries and separators, and can be nested
+ to the required depth. Adding new entries to menus can be achieved by
+ navigating the menu structure in the usual way.
+
+ \target CreatingAMenuEntry
+ \table
+ \row
+ \i \inlineimage designer-creating-menu-entry1.png
+ \i \inlineimage designer-creating-menu-entry2.png
+ \i \bold{Creating a Menu Entry}
+
+ Double-click the \gui{new action} placeholder to begin editing, or
+ double-click \gui{new separator} to insert a new separator line after
+ the last entry in the menu.
+
+ The menu entry's text is displayed using a line edit, and can be
+ modified.
+
+ \row
+ \i \inlineimage designer-creating-menu-entry3.png
+ \i \inlineimage designer-creating-menu-entry4.png
+ \i Insert the required text for the new entry, optionally using
+ the ampersand character (&) to mark the letter to use as a
+ mnemonic for the entry.
+
+ Press \key Return or \key Enter to accept the new text, or press
+ \key Escape to reject it. The action created for this menu entry will
+ be accessible via the \l{#TheActionEditor}{Action Editor}, and any
+ associated keyboard shortcut can be set there.
+ \endtable
+
+ Just like with menus, entries can be moved around simply by dragging and
+ dropping them in the preferred location. When an entry is dragged over a
+ closed menu, the menu will open to allow it to be inserted there. Since
+ menu entries are based on actions, they can also be dropped onto toolbars,
+ where they will be displayed as toolbar buttons.
+
+
+ \section1 Toolbars
+
+
+ ### SCREENSHOT
+
+ Toolbars ared added to a main window in a similar way to the menu bar:
+ Select the \gui{Add Tool Bar} option from the form's context menu.
+ Alternatively, if there is an existing toolbar in the main window, you can
+ click the arrow on its right end to create a new toolbar.
+
+ Toolbar buttons are created using the action system to populate each
+ toolbar, rather than by using specific button widgets from the widget box.
+ Since actions can be represented by menu entries and toolbar buttons, they
+ can be moved between menus and toolbars. To share an action between a menu
+ and a toolbar, drag its icon from the \l{#TheActionEditor}{Action Editor}
+ to the toolbar rather than from the menu where its entry is located.
+
+ New actions for menus and toolbars can be created in the
+ \l{#TheActionEditor}{Action Editor}.
+
+
+ \section1 Actions
+
+ With the menu bar and the toolbars in place, it's time to populate them
+ with action: \QD provides an action editor to simplify the creation and
+ management of actions.
+
+
+ \target TheActionEditor
+ \table
+ \row
+ \i \inlineimage designer-action-editor.png
+ \i \bold{The Action Editor}
+
+ Enable the action editor by opening the \gui Tools menu, and switching
+ on the \gui{Action Editor} option.
+
+ The action editor allows you to create \gui New actions and \gui Delete
+ actions. It also provides a search function, \gui Filter, using the
+ action's text.
+
+ \QD's action editor can be viewed in the classic \gui{Icon View} and
+ \gui{Detailed View}. The screenshot below shows the action editor in
+ \gui{Detailed View}. You can also copy and paste actions between menus,
+ toolbars and forms.
+ \endtable
+
+ To create an action, use the action editor's \gui New button, which will
+ then pop up an input dialog. Provide the new action with a \gui Text --
+ this is the text that will appear in a menu entry and as the action's
+ tooltip. The text is also automatically added to an "action" prefix,
+ creating the action's \gui{Object Name}.
+
+ In addition, the dialog provides the option of selecting an \gui Icon for
+ the action, as well as removing the current icon.
+
+ Once the action is created, it can be used wherever actions are applicable.
+
+
+ \target AddingAnAction
+ \table
+ \row
+ \i \inlineimage designer-adding-menu-action.png
+ \i \inlineimage designer-adding-toolbar-action.png
+ \i \bold{Adding an Action}
+
+ To add an action to a menu or a toolbar, simply press the left mouse
+ button over the action in the action editor, and drag it to the
+ preferred location.
+
+ \QD provides highlighted guide lines that tell you where the action
+ will be added. Release the mouse button to add the action when you have
+ found the right spot.
+ \endtable
+
+
+ \section1 Dock Widgets
+
+ Since dock widgets are \l{Using Containers in Qt Designer}
+ {container widgets}, they can be added to a form in the usuasl way. Once
+ added to a form, dock widgets are not placed in any particular dock area by
+ default; you need to set the \gui{docked} property to true for each widget
+ and choose an appropriate value for its \gui{dockWidgetArea} property.
+
+ \target AddingADockWidget
+ \table
+ \row
+ \i \inlineimage designer-adding-dockwidget.png
+ \i \bold{Adding a Dock Widget}
+
+ To add a dock widget, simply drag one from the \gui Containers section
+ of the widget box, and drop it onto the main form area. Just like other
+ widgets, its properties can be modified with the \gui{Property Editor}.
+
+ Dock widgets can be optionally floated as indpendent tool windows.
+ Hence, it is useful to give them window titles by setting their
+ \gui{windowTitle} property. This also helps to identify them on the
+ form.
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-resources.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Creating Main Windows in Qt Designer
+ \nextpage Using Stylesheets with Qt Designer
+
+ \title Editing Resources with Qt Designer
+
+ \image designer-resources-editing.png
+
+ \QD fully supports the \l{The Qt Resource System}{Qt Resource System},
+ enabling resources to be specified together with forms as they are
+ designed. To aid designers and developers manage resources for their
+ applications, \QD's resource editor allows resources to be defined on a
+ per-form basis. In other words, each form can have a separate resource
+ file.
+
+ \section1 Defining a Resource File
+
+ To specify a resource file you must enable the resource editor by opening
+ the \gui Tools menu, and switching on the \gui{Resource Browser} option.
+
+ \target ResourceFiles
+ \table
+ \row
+ \i \inlineimage designer-resource-browser.png
+ \i \bold{Resource Files}
+
+ Within the resource browser, you can open existing resource files or
+ create new ones. Click the \gui{Edit Resources} button
+ \inlineimage designer-edit-resources-button.png
+ to edit your resources. To reload resources, click on the \gui Reload
+ button
+ \inlineimage designer-reload-resources-button.png
+ .
+ \endtable
+
+
+ Once a resource file is loaded, you can create or remove entries in it
+ using the given \gui{Add Files}
+ \inlineimage designer-add-resource-entry-button.png
+ and \gui{Remove Files}
+ \inlineimage designer-remove-resource-entry-button.png
+ buttons, and specify resources (e.g., images) using the \gui{Add Files}
+ button
+ \inlineimage designer-add-files-button.png
+ . Note that these resources must reside within the current resource file's
+ directory or one of its subdirectories.
+
+
+ \target EditResource
+ \table
+ \row
+ \i \inlineimage designer-edit-resource.png
+ \i \bold{Editing Resource Files}
+
+ Press the
+ \inlineimage designer-add-resource-entry-button.png
+ button to add a new resource entry to the file. Then use the
+ \gui{Add Files} button
+ \inlineimage designer-add-files-button.png
+ to specify the resource.
+
+ You can remove resources by selecting the corresponding entry in the
+ resource editor, and pressing the
+ \inlineimage designer-remove-resource-entry-button.png
+ button.
+ \endtable
+
+
+ \section1 Using the Resources
+
+ Once the resources are defined you can use them actively when composing
+ your form. For example, you might want to create a tool button using an
+ icon specified in the resource file.
+
+ \target UsingResources
+ \table
+ \row
+ \i \inlineimage designer-resources-using.png
+ \i \bold{Using Resources}
+
+ When changing properties with values that may be defined within a
+ resource file, \QD's property editor allows you to specify a resource
+ in addition to the option of selecting a source file in the ordinary
+ way.
+
+ \row
+ \i \inlineimage designer-resource-selector.png
+ \i \bold{Selecting a Resource}
+
+ You can open the resource selector by clicking \gui{Choose Resource...}
+ to add resources any time during the design process.
+
+\omit
+... check with Friedemann
+To quickly assign icon pixmaps to actions or pixmap properties, you may
+drag the pixmap from the resource editor to the action editor, or to the
+pixmap property in the property editor.
+\endomit
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-stylesheet.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Editing Resources with Qt Designer
+ \nextpage Using a Designer UI File in Your Application
+
+ \title Using Stylesheets with Qt Designer
+
+ Since Qt 4.2, it is possible to edit stylesheets in \QD with the stylesheet
+ editor.
+
+ \target UsingStylesheets
+ \table
+ \row
+ \i \inlineimage designer-stylesheet-options.png
+ \bold{Setting a Stylesheet}
+
+ The stylesheet editor can be accessed by right-clicking a widget
+ and selecting \gui{Change styleSheet...}
+
+ \row
+ \i \inlineimage designer-stylesheet-usage.png
+ \endtable
+
+*/
+
+
+/*!
+ \page designer-using-a-ui-file.html
+ \previouspage Using Stylesheets with Qt Designer
+ \contentspage {Qt Designer Manual}{Contents}
+ \nextpage Using Custom Widgets with Qt Designer
+
+ \title Using a Designer UI File in Your Application
+
+ With Qt's integrated build tools, \l{qmake Manual}{qmake} and \l uic, the
+ code for user interface components created with \QD is automatically
+ generated when the rest of your application is built. Forms can be included
+ and used directly from your application. Alternatively, you can use them to
+ extend subclasses of standard widgets. These forms can be processed at
+ compile time or at run time, depending on the approach used.
+
+
+ \tableofcontents
+ \section1 Compile Time Form Processing
+
+ A compile time processed form can be used in your application with one of
+ the following approaches:
+
+ \list
+ \o The Direct Approach: you construct a widget to use as a placeholder
+ for the component, and set up the user interface inside it.
+ \o The Single Inheritance Approach: you subclass the form's base class
+ (QWidget or QDialog, for example), and include a private instance
+ of the form's user interface object.
+ \o The MultipleInheritance Approach: you subclass both the form's base
+ class and the form's user interface object. This allows the widgets
+ defined in the form to be used directly from within the scope of
+ the subclass.
+ \endlist
+
+
+ \section2 The Direct Approach
+
+ To demonstrate how to use user interface (UI) files straight from
+ \QD, we create a simple Calculator Form application. This is based on the
+ original \l{Calculator Form Example}{Calculator Form} example.
+
+ The application consists of one source file, \c main.cpp and a UI
+ file.
+
+ The \c{calculatorform.ui} file designed with \QD is shown below:
+
+ \image directapproach-calculatorform.png
+
+ We will use \c qmake to build the executable, so we need to write a
+ \c{.pro} file:
+
+ \snippet doc/src/snippets/uitools/calculatorform/calculatorform.pro 0
+
+ The special feature of this file is the \c FORMS declaration that tells
+ \c qmake which files to process with \c uic. In this case, the
+ \c calculatorform.ui file is used to create a \c ui_calculatorform.h file
+ that can be used by any file listed in the \c SOURCES declaration. To
+ ensure that \c qmake generates the \c ui_calculatorform.h file, we need to
+ include it in a file listed in \c SOURCES. Since we only have \c main.cpp,
+ we include it there:
+
+ \snippet doc/src/snippets/uitools/calculatorform/main.cpp 0
+
+ This include is an additional check to ensure that we do not generate code
+ for UI files that are not used.
+
+ The \c main function creates the calculator widget by constructing a
+ standard QWidget that we use to host the user interface described by the
+ \c calculatorform.ui file.
+
+ \snippet doc/src/snippets/uitools/calculatorform/main.cpp 1
+
+ In this case, the \c{Ui::CalculatorForm} is an interface description object
+ from the \c ui_calculatorform.h file that sets up all the dialog's widgets
+ and the connections between its signals and slots.
+
+ This approach provides a quick and easy way to use simple, self-contained
+ components in your applications, but many componens created with \QD will
+ require close integration with the rest of the application code. For
+ instance, the \c CalculatorForm code provided above will compile and run,
+ but the QSpinBox objects will not interact with the QLabel as we need a
+ custom slot to carry out the add operation and display the result in the
+ QLabel. To achieve this, we need to subclass a standard Qt widget (known as
+ the single inheritance approach).
+
+
+ \section2 The Single Inheritance Approach
+
+ In this approach, we subclass a Qt widget and set up the user interface
+ from within the constructor. Components used in this way expose the widgets
+ and layouts used in the form to the Qt widget subclass, and provide a
+ standard system for making signal and slot connections between the user
+ interface and other objects in your application.
+
+ This approach is used in the \l{Calculator Form Example}{Calculator Form}
+ example.
+
+ To ensure that we can use the user interface, we need to include the header
+ file that \c uic generates before referring to \c{Ui::CalculatorForm}:
+
+ \snippet examples/designer/calculatorform/calculatorform.h 0
+
+ This means that the \c{.pro} file must be updated to include
+ \c{calculatorform.h}:
+
+ \snippet examples/designer/calculatorform/calculatorform.pro 0
+
+ The subclass is defined in the following way:
+
+ \snippet examples/designer/calculatorform/calculatorform.h 1
+
+ The important feature of the class is the private \c ui object which
+ provides the code for setting up and managing the user interface.
+
+ The constructor for the subclass constructs and configures all the widgets
+ and layouts for the dialog just by calling the \c ui object's \c setupUi()
+ function. Once this has been done, it is possible to modify the user
+ interface as needed.
+
+ \snippet examples/designer/calculatorform/calculatorform.cpp 0
+
+ We can connect signals and slots in user interface widgets in the usual
+ way, taking care to prefix the \c ui object to each widget used.
+
+ The advantages of this approach are its simple use of inheritance to
+ provide a QWidget-based interface, and its encapsulation of the user
+ interface widget variables within the \c ui data member. We can use this
+ method to define a number of user interfaces within the same widget, each
+ of which is contained within its own namespace, and overlay (or compose)
+ them. This approach can be used to create individual tabs from existing
+ forms, for example.
+
+
+ \section2 The Multiple Inheritance Approach
+
+ Forms created with \QD can be subclassed together with a standard
+ QWidget-based class. This approach makes all the user interface components
+ defined in the form directly accessible within the scope of the subclass,
+ and enables signal and slot connections to be made in the usual way with
+ the \l{QObject::connect()}{connect()} function.
+
+ This approach is used in the \l{Multiple Inheritance Example}
+ {Multiple Inheritance} example.
+
+ We need to include the header file that \c uic generates from the
+ \c calculatorform.ui file:
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.h 0
+
+ The class is defined in a similar way to the one used in the
+ \l{The Single Inheritance Approach}{single inheritance approach}, except that
+ this time we inherit from \e{both} QWidget and \c{Ui::CalculatorForm}:
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.h 1
+
+ We inherit \c{Ui::CalculatorForm} privately to ensure that the user
+ interface objects are private in our subclass. We can also inherit it with
+ the \c public or \c protected keywords in the same way that we could have
+ made \c ui public or protected in the previous case.
+
+ The constructor for the subclass performs many of the same tasks as the
+ constructor used in the \l{The Single Inheritance Approach}
+ {single inheritance} example:
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.cpp 0
+
+ In this case, the widgets used in the user interface can be accessed in the
+ same say as a widget created in code by hand. We no longer require the
+ \c{ui} prefix to access them.
+
+ Subclassing using multiple inheritance gives us more direct access to the
+ contents of the form, is slightly cleaner than the single inheritance
+ approach, but does not conveniently support composition of multiple user
+ interfaces.
+
+
+ \section1 Run Time Form Processing
+
+ Alternatively, forms can be processed at run time, producing dynamically-
+ generated user interfaces. This can be done using the QtUiTools module
+ that provides the QUiLoader class to handle forms created with \QD.
+
+
+ \section2 The UiTools Approach
+
+ A resource file containing a UI file is required to process forms at
+ run time. Also, the application needs to be configured to use the QtUiTools
+ module. This is done by including the following declaration in a \c qmake
+ project file, ensuring that the application is compiled and linked
+ appropriately.
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 0
+
+ The QUiLoader class provides a form loader object to construct the user
+ interface. This user interface can be retrieved from any QIODevice, e.g.,
+ a QFile object, to obtain a form stored in a project's resource file. The
+ QUiLoader::load() function constructs the form widget using the user
+ interface description contained in the file.
+
+ The QtUiTools module classes can be included using the following directive:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 1
+
+ The QUiLoader::load() function is invoked as shown in this code from the
+ \l{Text Finder Example}{Text Finder} example:
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 4
+
+ In a class that uses QtUiTools to build its user interface at run time, we
+ can locate objects in the form using qFindChild(). For example, in the
+ follownig code, we locate some components based on their object names and
+ widget types:
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 1
+
+ Processing forms at run-time gives the developer the freedom to change a
+ program's user interface, just by changing the UI file. This is useful
+ when customizing programs to suit various user needs, such as extra large
+ icons or a different colour scheme for accessibility support.
+
+
+ \section1 Automatic Connections
+
+ The signals and slots connections defined for compile time or run time
+ forms can either be set up manually or automatically, using QMetaObject's
+ ability to make connections between signals and suitably-named slots.
+
+ Generally, in a QDialog, if we want to process the information entered by
+ the user before accepting it, we need to connect the clicked() signal from
+ the \gui OK button to a custom slot in our dialog. We will first show an
+ example of the dialog in which the slot is connected by hand then compare
+ it with a dialog that uses automatic connection.
+
+
+ \section2 A Dialog Without Auto-Connect
+
+ We define the dialog in the same way as before, but now include a slot in
+ addition to the constructor:
+
+ \snippet doc/src/snippets/designer/noautoconnection/imagedialog.h 0
+
+ The \c checkValues() slot will be used to validate the values provided by
+ the user.
+
+ In the dialog's constructor we set up the widgets as before, and connect
+ the \gui Cancel button's \l{QPushButton::clicked()}{clicked()} signal to
+ the dialog's reject() slot. We also disable the
+ \l{QPushButton::autoDefault}{autoDefault} property in both buttons to
+ ensure that the dialog does not interfere with the way that the line edit
+ handles return key events:
+
+ \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 0
+ \dots
+ \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 1
+
+ We connect the \gui OK button's \l{QPushButton::clicked()}{clicked()}
+ signal to the dialog's checkValues() slot which we implement as follows:
+
+ \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 2
+
+ This custom slot does the minimum necessary to ensure that the data
+ entered by the user is valid - it only accepts the input if a name was
+ given for the image.
+
+ \section2 Widgets and Dialogs with Auto-Connect
+
+ Although it is easy to implement a custom slot in the dialog and connect
+ it in the constructor, we could instead use QMetaObject's auto-connection
+ facilities to connect the \gui OK button's clicked() signal to a slot in
+ our subclass. \c{uic} automatically generates code in the dialog's
+ \c setupUi() function to do this, so we only need to declare and
+ implement a slot with a name that follows a standard convention:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 2
+
+ Using this convention, we can define and implement a slot that responds to
+ mouse clicks on the \gui OK button:
+
+ \snippet doc/src/snippets/designer/autoconnection/imagedialog.h 0
+
+ Another example of automatic signal and slot connection would be the
+ \l{Text Finder Example}{Text Finder} with its \c{on_findButton_clicked()}
+ slot.
+
+ We use QMetaObject's system to enable signal and slot connections:
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 2
+
+ This enables us to implement the slot, as shown below:
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 6
+ \dots
+ \snippet examples/uitools/textfinder/textfinder.cpp 8
+
+ Automatic connection of signals and slots provides both a standard naming
+ convention and an explicit interface for widget designers to work to. By
+ providing source code that implements a given interface, user interface
+ designers can check that their designs actually work without having to
+ write code themselves.
+*/
+
+
+/*!
+ \page designer-customizing-forms.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Using Stylesheets with Qt Designer
+ \nextpage Using Custom Widgets with Qt Designer
+
+ \title Customizing Qt Designer Forms
+
+ \image designer-form-settings.png
+
+ When saving a form in \QD, it is stored as a UI file. Several form
+ settings, for example the grid settings or the margin and spacing for the
+ default layout, are stored along with the form's components. These settings
+ are used when the \l uic generates the form's C++ code. For more
+ information on how to use forms in your application, see the
+ \l{Using a Designer UI File in Your Application} section.
+
+
+ \section1 Modifying the Form Settings
+
+ To modify the form settings, open the \gui Form menu and select \gui{Form
+ Settings...}
+
+ In the forms settings dialog you can specify the \gui Author of the form.
+
+ You can also alter the margin and spacing properties for the form's default
+ layout (\gui {Layout Default}). These default layout properties will be
+ replaced by the corresponding \gui {Layout Function}, if the function is
+ specified, when \c uic generates code for the form. The form settings
+ dialog lets you specify functions for both the margin and the spacing.
+
+ \target LayoutFunction
+ \table
+ \row
+ \i \inlineimage designer-form-layoutfunction.png
+ \i \bold{Layout Function}
+
+ The default layout properties will be replaced by the corresponding
+ \gui{Layout Function}, when \c uic generates code for the form. This is
+ useful when different environments requires different layouts for the same
+ form.
+
+ To specify layout functions for the form's margin and spacing, check the
+ \gui{Layout Function} group box to enable the line edits.
+ \endtable
+
+ You can also specify the form's \gui{Include Hints}; i.e., provide a list
+ of the header files which will then be included in the form window's
+ associated UI file. Header files may be local, i.e., relative to the
+ project's directory, \c "mywidget.h", or global, i.e. part of Qt or the
+ compilers standard libraries: \c <QtGui/QWidget>.
+
+ Finally, you can specify the function used to load pixmaps into the form
+ window (the \gui {Pixmap Function}).
+*/
+
+
+/*!
+ \page designer-using-custom-widgets.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Customizing Qt Designer Forms
+ \nextpage Creating Custom Widgets for Qt Designer
+
+ \title Using Custom Widgets with Qt Designer
+
+ \QD can display custom widgets through its extensible plugin mechanism,
+ allowing the range of designable widgets to be extended by the user and
+ third parties. This feature also allows \QD to optionally support
+ \l{Qt3Support}{Qt 3 compatibility widgets}. Alternatively, it is possible
+ to use existing widgets as placeholders for widget classes that provide
+ similar APIs.
+
+ Widgets from the Qt3Support library are made available via in \QD's support
+ for custom widgets.
+
+
+ \section1 Handling Custom Widgets
+
+ Although \QD supports all of the standard Qt widgets, and can be configured
+ to handle widgets supplied in the Qt3Support library, some specialized
+ widgets may not be available as standard for a number of reasons:
+
+ \list
+ \i Custom widgets may not be available at the time the user interface
+ is being designed.
+ \i Custom widgets may be platform-specific, and designers may be
+ developing the user interface on a different platform to end users.
+ \i The source code for a custom widget is not available, or the user
+ interface designers are unable to use the widget for non-technical
+ reasons.
+ \endlist
+
+ In the above situations, it is still possible to design forms with the aim
+ of using custom widgets in the application. To achieve this, we can use
+ the widget promotion feature of \QD.
+
+ In all other cases, where the source code to the custom widgets is
+ available, we can adapt the custom widget for use with \QD.
+
+
+ \section2 Promoting Widgets
+
+ \image designer-promoting-widgets.png
+
+ If some forms must be designed, but certain custom widgets are unavailble
+ to the designer, we can substitute similar widgets to represent the missing
+ widgets. For example, we might represent instances of a custom push button
+ class, \c MyPushButton, with instances of QPushButton and promote these to
+ \c MyPushButton so that \l{uic.html}{uic} generates suitable code for this
+ missing class.
+
+ When choosing a widget to use as a placeholder, it is useful to compare the
+ API of the missing widget with those of standard Qt widgets. For
+ specialized widgets that subclass standard classes, the obvious choice of
+ placeholder is the base class of the custom widget; for example, QSlider
+ might be used for specialized QSlider subclasses.
+
+ For specialized widgets that do not share a common API with standard Qt
+ widgets, it is worth considering adapting a custom widget for use in \QD.
+ If this is not possible then QWidget is the obvious choice for a
+ placeholder widget since it is the lowest common denominator for all
+ widgets.
+
+ To add a placeholder, select an object of a suitable base class and choose
+ \gui{Promote to ...} from the form's context menu. After entering the class
+ name and header file in the lower part of the dialog, choose \gui{Add}. The
+ placeholder class will now appear along with the base class in the upper
+ list. Click the \gui{Promote} button to accept this choice.
+
+ Now, when the form's context menu is opened over objects of the base class,
+ the placeholder class will appear in the \gui{Promote to} submenu, allowing
+ for convenient promotion of objects to that class.
+
+ A promoted widget can be reverted to its base class by choosing
+ \gui{Demote to} from the form's context menu.
+
+
+ \section2 User Defined Custom Widgets
+
+ \image worldtimeclockplugin-example.png
+
+ Custom widgets can be adapted for use with \QD, giving designers the
+ opportunity to configure the user interface using the actual widgets that
+ will be used in an application rather than placeholder widgets. The process
+ of creating a custom widget plugin is described in the
+ \l{Creating Custom Widgets for Qt Designer} chapter of this manual.
+
+ To use a plugin created in this way, it is necessary to ensure that the
+ plugin is located on a path that \QD searches for plugins. Generally,
+ plugins stored in \c{$QTDIR/plugins/designer} will be loaded when \QD
+ starts. Further information on building and installing plugins can be found
+ \l{Creating Custom Widgets for Qt Designer#BuildingandInstallingthePlugin}
+ {here}. You can also refer to the \l{How to Create Qt Plugins}
+ {Plugins HOWTO} document for information about creating plugins.
+*/
+
+
+/*!
+ \page designer-creating-custom-widgets.html
+ \previouspage Using Custom Widgets with Qt Designer
+ \contentspage {Qt Designer Manual}{Contents}
+ \nextpage Creating Custom Widget Extensions
+
+ \title Creating Custom Widgets for Qt Designer
+
+ \QD's plugin-based architecture allows user-defined and third party custom
+ widgets to be edited just like you do with standard Qt widgets. All of the
+ custom widget's features are made available to \QD, including widget
+ properties, signals, and slots. Since \QD uses real widgets during the form
+ design process, custom widgets will appear the same as they do when
+ previewed.
+
+ \image worldtimeclockplugin-example.png
+
+ The \l QtDesigner module provides you with the ability to create custom
+ widgets in \QD.
+
+
+ \section1 Getting Started
+
+ To integrate a custom widget with \QD, you require a suitable description
+ for the widget and an appropriate \c{.pro} file.
+
+
+ \section2 Providing an Interface Description
+
+ To inform \QD about the type of widget you want to provide, create a
+ subclass of QDesignerCustomWidgetInterface that describes the various
+ properties your widget exposes. Most of these are supplied by functions
+ that are pure virtual in the base class, because only the author of the
+ plugin can provide this information.
+
+ \table
+ \header
+ \o Function
+ \o Description of the return value
+ \row
+ \o \c name()
+ \o The name of the class that provides the widget.
+ \row
+ \o \c group()
+ \o The group in \QD's widget box that the widget belongs to.
+ \row
+ \o \c toolTip()
+ \o A short description to help users identify the widget in \QD.
+ \row
+ \o \c whatsThis()
+ \o A longer description of the widget for users of \QD.
+ \row
+ \o \c includeFile()
+ \o The header file that must be included in applications that use
+ this widget. This information is stored in UI files and will
+ be used by \c uic to create a suitable \c{#includes} statement
+ in the code it generates for the form containing the custom
+ widget.
+ \row
+ \o \c icon()
+ \o An icon that can be used to represent the widget in \QD's
+ widget box.
+ \row
+ \o \c isContainer()
+ \o True if the widget will be used to hold child widgets;
+ false otherwise.
+ \row
+ \o \c createWidget()
+ \o A QWidget pointer to an instance of the custom widget,
+ constructed with the parent supplied.
+ \note createWidget() is a factory function responsible for
+ creating the widget only. The custom widget's properties will
+ not be available until load() returns.
+ \row
+ \o \c domXml()
+ \o A description of the widget's properties, such as its object
+ name, size hint, and other standard QWidget properties.
+ \row
+ \o \c codeTemplate()
+ \o This function is reserved for future use by \QD.
+ \endtable
+
+ Two other virtual functions can also be reimplemented:
+
+ \table
+ \row
+ \o \c initialize()
+ \o Sets up extensions and other features for custom widgets. Custom
+ container extensions (see QDesignerContainerExtension) and task
+ menu extensions (see QDesignerTaskMenuExtension) should be set
+ up in this function.
+ \row
+ \o \c isInitialized()
+ \o Returns true if the widget has been initialized; returns false
+ otherwise. Reimplementations usually check whether the
+ \c initialize() function has been called and return the result
+ of this test.
+ \endtable
+
+
+ \section2 Notes on the \c{domXml()} Function
+
+ The \c{domXml()} function returns a UI file snippet that is used by
+ \QD's widget factory to create a custom widget and its applicable
+ properties.
+
+ Since Qt 4.4, \QD's widget box allows for a complete UI file to
+ describe \bold one custom widget. The UI file can be loaded using the
+ \c{<ui>} tag. Specifying the <ui> tag allows for adding the <customwidget>
+ element that contains additional information for custom widgets. The
+ \c{<widget>} tag is sufficient if no additional information is required
+
+ If the custom widget does not provide a reasonable size hint, it is
+ necessary to specify a default geometry in the string returned by the
+ \c domXml() function in your subclass. For example, the
+ \c AnalogClockPlugin provided by the \l{designer/customwidgetplugin}
+ {Custom Widget Plugin} example, defines a default widgetgeometry in the
+ following way:
+
+ \dots
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 11
+ \dots
+
+ An additional feature of the \c domXml() function is that, if it returns
+ an empty string, the widget will not be installed in \QD's widget box.
+ However, it can still be used by other widgets in the form. This feature
+ is used to hide widgets that should not be explicitly created by the user,
+ but are required by other widgets.
+
+
+ A complete custom widget specification looks like:
+
+ \code
+<ui language="c++"> displayname="MyWidget">
+ <widget class="widgets::MyWidget" name="mywidget"/>
+ <customwidgets>
+ <customwidget>
+ <class>widgets::MyWidget</class>
+ <addpagemethod>addPage</addpagemethod>
+ <propertyspecifications>
+ <stringpropertyspecification name="fileName" notr="true" type="singleline"
+ <stringpropertyspecification name="text" type="richtext"
+ </propertyspecifications>
+ </customwidget>
+ </customwidgets>
+</ui>
+ \endcode
+
+ Attributes of the \c{<ui>} tag:
+ \table
+ \header
+ \o Attribute
+ \o Presence
+ \o Values
+ \o Comment
+ \row
+ \o \c{language}
+ \o optional
+ \o "c++", "jambi"
+ \o This attribute specifies the language the custom widget is intended for.
+ It is mainly there to prevent C++-plugins from appearing in Qt Jambi.
+ \row
+ \o \c{displayname}
+ \o optional
+ \o Class name
+ \o The value of the attribute appears in the Widget box and can be used to
+ strip away namespaces.
+ \endtable
+
+ The \c{<addpagemethod>} tag tells \QD and \l uic which method should be used to
+ add pages to a container widget. This applies to container widgets that require
+ calling a particular method to add a child rather than adding the child by passing
+ the parent. In particular, this is relevant for containers that are not a
+ a subclass of the containers provided in \QD, but are based on the notion
+ of \e{Current Page}. In addition, you need to provide a container extension
+ for them.
+
+ The \c{<propertyspecifications>} element can contain a list of property meta information.
+ Currently, properties of type string are supported. For these properties, the
+ \c{<stringpropertyspecification>} tag can be used. This tag has the following attributes:
+
+
+ \table
+ \header
+ \o Attribute
+ \o Presence
+ \o Values
+ \o Comment
+ \row
+ \o \c{name}
+ \o required
+ \o Name of the property
+ \row
+ \o \c{type}
+ \o required
+ \o See below table
+ \o The value of the attribute determines how the property editor will handle them.
+ \row
+ \o \c{notr}
+ \o optional
+ \o "true", "false"
+ \o If the attribute is "true", the value is not meant to be translated.
+ \endtable
+
+ Values of the \c{type} attribute of the string property:
+
+ \table
+ \header
+ \o Value
+ \o Type
+ \row
+ \o \c{"richtext"}
+ \o Rich text.
+ \row
+ \o \c{"multiline"}
+ \o Multi-line plain text.
+ \row
+ \o \c{"singleline"}
+ \o Single-line plain text.
+ \row
+ \o \c{"stylesheet"}
+ \o A CSS-style sheet.
+ \row
+ \o \c{"objectname"}
+ \o An object name (restricted set of valid characters).
+ \row
+ \o \c{"url"}
+ \o URL, file name.
+ \endtable
+
+ \section1 Plugin Requirements
+
+ In order for plugins to work correctly on all platforms, you need to ensure
+ that they export the symbols needed by \QD.
+
+ First of all, the plugin class must be exported in order for the plugin to
+ be loaded by \QD. Use the Q_EXPORT_PLUGIN2() macro to do this. Also, the
+ QDESIGNER_WIDGET_EXPORT macro must be used to define each custom widget class
+ within a plugin, that \QD will instantiate.
+
+
+ \section1 Creating Well Behaved Widgets
+
+ Some custom widgets have special user interface features that may make them
+ behave differently to many of the standard widgets found in \QD.
+ Specifically, if a custom widget grabs the keyboard as a result of a call
+ to QWidget::grabKeyboard(), the operation of \QD will be affected.
+
+ To give custom widgets special behavior in \QD, provide an implementation
+ of the initialize() function to configure the widget construction process
+ for \QD specific behavior. This function will be called for the first time
+ before any calls to createWidget() and could perhaps set an internal flag
+ that can be tested later when \QD calls the plugin's createWidget()
+ function.
+
+
+ \target BuildingandInstallingthePlugin
+ \section1 Building and Installing the Plugin
+
+ \section2 A Simple Plugin
+
+ The \l{Custom Widget Plugin Example} demonstrates a simple \QD plugin.
+
+ The \c{.pro} file for a plugin must specify the headers and sources for
+ both the custom widget and the plugin interface. Typically, this file only
+ has to specify that the plugin's project is to be built as a library, but
+ with specific plugin support for \QD. This is done with the following
+ declarations:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.pro 1
+
+ If Qt is configured to build in both debug and release modes, \QD will be
+ built in release mode. When this occurs, it is necessary to ensure that
+ plugins are also built in release mode. To do this, include the following
+ declaration in the plugin's \c{.pro} file:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 3
+
+ If plugins are built in a mode that is incompatible with \QD, they will
+ not be loaded and installed. For more information about plugins, see the
+ \l{plugins-howto.html}{Plugins HOWTO} document.
+
+ It is also necessary to ensure that the plugin is installed together with
+ other \QD widget plugins:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 4
+
+ The \c $[QT_INSTALL_PLUGINS] variable is a placeholder to the location of
+ the installed Qt plugins. You can configure \QD to look for plugins in
+ other locations by setting the \c QT_PLUGIN_PATH environment variable
+ before running the application.
+
+ \note \QD will look for a \c designer subdirectory in each path supplied.
+
+ See QCoreApplication::libraryPaths() for more information about customizing
+ paths for libraries and plugins with Qt applications.
+
+ \section2 Splitting up the Plugin
+
+ In a real world scenario, you do not want to have dependencies of the
+ application making use of the custom widgets to the \QD headers and
+ libraries as introduced by the simple approach explained above.
+
+ There are two ways to resolve this:
+
+ \list
+ \i Create a \c{.pri} file that contains the headers sources and sources
+ of the custom widget:
+
+ \code
+ INCLUDEPATH += $$PWD
+ HEADERS += $$PWD/analogclock.h
+ SOURCES += $$PWD/analogclock.cpp
+ \endcode
+
+ This file would then be included by the \c{.pro} file of the plugin and
+ the application:
+
+ \code
+ include(customwidget.pri)
+ \endcode
+
+ Running \c{qmake -Wall} on the \c{.pro} files causes a warning to be
+ printed if an included \c{.pri} file cannot be found.
+
+ \i Create a standalone shared library containing the custom widgets only
+ as described in
+ \l{sharedlibrary.html}{Creating Shared Libraries}.
+
+ This library would then be used by the application as well as by the
+ \QD plugin. Care must be taken to ensure that the plugin can locate
+ the library at run-time.
+ \endlist
+
+ \section1 Related Examples
+
+ For more information on using custom widgets in \QD, refer to the
+ \l{designer/customwidgetplugin}{Custom Widget Plugin} and
+ \l{designer/worldtimeclockplugin}{World Time Clock Plugin} examples for more
+ information about using custom widgets in \QD. Also, you can use the
+ QDesignerCustomWidgetCollectionInterface class to combine several custom
+ widgets into a single library.
+*/
+
+
+/*!
+ \page designer-creating-custom-widgets-extensions.html
+ \previouspage Creating Custom Widgets for Qt Designer
+ \nextpage Qt Designer's UI File Format
+ \contentspage {Qt Designer Manual}{Contents}
+
+ \title Creating Custom Widget Extensions
+
+ Once you have a custom widget plugin for \QD, you can provide it with the
+ expected behavior and functionality within \QD's workspace, using custom
+ widget extensions.
+
+
+ \section1 Extension Types
+
+ There are several available types of extensions in \QD. You can use all of
+ these extensions in the same pattern, only replacing the respective
+ extension base class.
+
+ QDesignerContainerExtension is necessary when implementing a custom
+ multi-page container.
+
+ \table
+ \row
+ \i \inlineimage designer-manual-taskmenuextension.png
+ \i \bold{QDesignerTaskMenuExtension}
+
+ QDesignerTaskMenuExtension is useful for custom widgets. It provides an
+ extension that allows you to add custom menu entries to \QD's task
+ menu.
+
+ The \l{designer/taskmenuextension}{Task Menu Extension} example
+ illustrates how to use this class.
+
+ \row
+ \i \inlineimage designer-manual-containerextension.png
+ \i \bold{QDesignerContainerExtension}
+
+ QDesignerContainerExtension is necessary when implementing a custom
+ multi-page container. It provides an extension that allows you to add
+ and delete pages for a multi-page container plugin in \QD.
+
+ The \l{designer/containerextension}{Container Extension} example
+ further explains how to use this class.
+
+ \note It is not possible to add custom per-page properties for some
+ widgets (e.g., QTabWidget) due to the way they are implemented.
+ \endtable
+
+ \table
+ \row
+ \i \inlineimage designer-manual-membersheetextension.png
+ \i \bold{QDesignerMemberSheetExtension}
+
+ The QDesignerMemberSheetExtension class allows you to manipulate a
+ widget's member functions displayed when connecting signals and slots.
+
+ \row
+ \i \inlineimage designer-manual-propertysheetextension.png
+ \i \bold{QDesignerPropertySheetExtension,
+ QDesignerDynamicPropertySheetExtension}
+
+ These extension classes allow you to control how a widget's properties
+ are displayed in \QD's property editor.
+ \endtable
+
+\omit
+ \row
+ \o
+ \o \bold {QDesignerScriptExtension}
+
+ The QDesignerScriptExtension class allows you to define script
+ snippets that are executed when a form is loaded. The extension
+ is primarily intended to be used to set up the internal states
+ of custom widgets.
+ \endtable
+\endomit
+
+
+ \QD uses the QDesignerPropertySheetExtension and the
+ QDesignerMemberSheetExtension classes to feed its property and signal and
+ slot editors. Whenever a widget is selected in its workspace, \QD will
+ query for the widget's property sheet extension; likewise, whenever a
+ connection between two widgets is requested, \QD will query for the
+ widgets' member sheet extensions.
+
+ \warning All widgets have default property and member sheets. If you
+ implement custom property sheet or member sheet extensions, your custom
+ extensions will override the default sheets.
+
+
+ \section1 Creating an Extension
+
+ To create an extension you must inherit both QObject and the appropriate
+ base class, and reimplement its functions. Since we are implementing an
+ interface, we must ensure that it is made known to the meta object system
+ using the Q_INTERFACES() macro in the extension class's definition. For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 7
+
+ This enables \QD to use the qobject_cast() function to query for supported
+ interfaces using a QObject pointer only.
+
+
+ \section1 Exposing an Extension to Qt Designer
+
+ In \QD the extensions are not created until they are required. For this
+ reason, when implementing extensions, you must subclass QExtensionFactory
+ to create a class that is able to make instances of your extensions. Also,
+ you must register your factory with \QD's extension manager; the extension
+ manager handles the construction of extensions.
+
+ When an extension is requested, \QD's extension manager will run through
+ its registered factories calling QExtensionFactory::createExtension() for
+ each of them until it finds one that is able to create the requested
+ extension for the selected widget. This factory will then make an instance
+ of the extension.
+
+ \image qtdesignerextensions.png
+
+
+ \section2 Creating an Extension Factory
+
+ The QExtensionFactory class provides a standard extension factory, but it
+ can also be used as an interface for custom extension factories.
+
+ The purpose is to reimplement the QExtensionFactory::createExtension()
+ function, making it able to create your extension, such as a
+ \l{designer/containerextension}{MultiPageWidget} container extension.
+
+ You can either create a new QExtensionFactory and reimplement the
+ QExtensionFactory::createExtension() function:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 8
+
+ or you can use an existing factory, expanding the
+ QExtensionFactory::createExtension() function to enable the factory to
+ create your custom extension as well:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 9
+
+
+ \section2 Accessing Qt Designer's Extension Manager
+
+ When implementing a custom widget plugin, you must subclass the
+ QDesignerCustomWidgetInterface to expose your plugin to \QD. This is
+ covered in more detail in the
+ \l{Creating Custom Widgets for Qt Designer} section. The registration of
+ an extension factory is typically made in the
+ QDesignerCustomWidgetInterface::initialize() function:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 10
+
+ The \c formEditor parameter in the
+ QDesignerCustomWidgetInterface::initialize() function is a pointer to \QD's
+ current QDesignerFormEditorInterface object. You must use the
+ QDesignerFormEditorInterface::extensionManager() function to retrieve an
+ interface to \QD's extension manager. Then you use the
+ QExtensionManager::registerExtensions() function to register your custom
+ extension factory.
+
+
+ \section1 Related Examples
+
+ For more information on creating custom widget extensions in \QD, refer to
+ the \l{designer/taskmenuextension}{Task Menu Extension} and
+ \l{designer/containerextension}{Container Extension} examples.
+*/
+
+
+/*!
+ \page designer-ui-file-format.html
+ \previouspage Creating Custom Widget Extensions
+ \contentspage {Qt Designer Manual}{Contents}
+
+ \title Qt Designer's UI File Format
+
+ The \c UI file format used by \QD is described by the
+ \l{http://www.w3.org/XML/Schema}{XML schema} presented below,
+ which we include for your convenience. Be aware that the format
+ may change in future Qt releases.
+
+ \quotefile tools/designer/data/ui4.xsd
+*/
+
+
+/*!
+ \page designer-recursive-shadow-casting.html
+ \title Implementation of the Recursive Shadow Casting Algorithm in Qt Designer
+ \contentspage {Qt Designer Manual}{Contents}
+
+ \ingroup licensing
+ \brief License information for contributions to specific parts of the Qt
+ Designer source code.
+
+ \legalese
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). \BR
+ Copyright (C) 2005 Bjoern Bergstroem
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, modify, market, reproduce,
+ grant sublicenses and distribute subject to the following conditions:
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software. These
+ files are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ WARRANTY OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE.
+ \endlegalese
+*/
diff --git a/doc/src/development/developing-on-mac.qdoc b/doc/src/development/developing-on-mac.qdoc
new file mode 100644
index 0000000..32a2a2a
--- /dev/null
+++ b/doc/src/development/developing-on-mac.qdoc
@@ -0,0 +1,271 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page developing-on-mac.html
+ \title Developing Qt Applications on Mac OS X
+ \brief A overview of items to be aware of when developing Qt applications
+ on Mac OS X
+ \ingroup platform-specific
+
+ \tableofcontents
+
+ Mac OS X is a UNIX platform and behaves similar to other Unix-like
+ platforms. The main difference is X11 is not used as the primary windowing
+ system. Instead, Mac OS X uses its own native windowing system that is
+ accessible through the Carbon and Cocoa APIs. Application development on
+ Mac OS X is done using Xcode Tools, an optional install included on every
+ Mac with updates available from \l {http://developer.apple.com}{Apple's
+ developer website}. Xcode Tools includes Apple-modified versions of the GCC
+ compiler.
+
+
+ \section1 What Versions of Mac OS X are Supported?
+
+ As of Qt 4.6, Qt supports Mac OS X versions 10.4 and up. It is usually in
+ the best interest of the developer and user to be running the latest
+ updates to any version. We test internally against Mac OS X 10.4.11 as well
+ as the updated release of Mac OS X 10.5 and Mac OS X 10.6.
+
+ \section2 Carbon or Cocoa?
+
+ Historically, Qt has used the Carbon toolkit, which supports 32-bit
+ applications on Mac OS X 10.4 and up. Qt 4.5 and up has support for the Cocoa
+ toolkit, which requires 10.5 and provides 64-bit support.
+
+ This detail is typically not important to Qt application developers. Qt is
+ cross-platform across Carbon and Cocoa, and Qt applications behave
+ the same way when configured for either one. Eventually, the Carbon
+ version will be discontinued. This is something to keep in mind when you
+ consider writing code directly against native APIs.
+
+ The current binary for Qt is built in two flavors, 32-bit Carbon and full
+ universal Cocoa (32-bit and 64-bit). If you want a different setup for
+ Qt will use, you must build from scratch. Carbon or Cocoa is chosen when
+ configuring the package for building. The configure process selects Carbon
+ by default, to specify Cocoa use the \c{-cocoa} flag. configure for a
+ 64-bit architecture using one of the \c{-arch} flags (see \l{universal
+ binaries}{Universal Binaries}).
+
+ Currently, Apple's default GCC compiler is used by default (GCC 4.0.1 on
+ 10.4 and 10.5, GCC 4.2 on 10.6). You can specify alternate compilers
+ though. For example, on Mac OS X 10.5, Apple's GCC 4.2 is also available
+ and selectable with the configure flag: \c{-platform macx-g++42}. LLVM-GCC
+ support is available by passing in the \c{-platform macx-llvm} flag. GCC
+ 3.x will \e not work. Though they may work, We do not support custom-built
+ GCC's.
+
+ The following table summarizes the different versions of Mac OS X and what
+ capabilities are used by Qt.
+
+ \table
+ \header
+ \o Mac OS X Version
+ \o Cat Name
+ \o Native API Used by Qt
+ \o Bits available to address memory
+ \o CPU Architecture Supported
+ \o Development Platform
+ \row
+ \o 10.4
+ \o Tiger
+ \o Carbon
+ \o 32
+ \o PPC/Intel
+ \o Yes
+ \row
+ \o 10.5
+ \o Leopard
+ \o Carbon
+ \o 32
+ \o PPC/Intel
+ \o Yes
+ \row
+ \o 10.5
+ \o Leopard
+ \o Cocoa
+ \o 32/64
+ \o PPC/Intel
+ \o Yes
+ \row
+ \o 10.6
+ \o Snow Leopard
+ \o Cocoa/Carbon
+ \o 32
+ \o PPC/Intel
+ \o Yes
+ \row
+ \o 10.6
+ \o Snow Leopard
+ \o Cocoa
+ \o 64
+ \o Intel
+ \o Yes
+ \endtable
+
+ Note that building for ppc-64 is not supported on 10.6.
+
+ \section2 Which One Should I Use?
+
+ Carbon and Cocoa both have their advantages and disadvantages. Probably the
+ easiest way to determine is to look at the version of Mac OS X you are
+ targetting. If you are starting a new application and can target 10.5 and
+ up, then please consider Cocoa only. If you have an existing application or
+ need to target earlier versions of the operating system and do not need
+ access to 64-bit or newer Apple technologies, then Carbon is a good fit. If
+ your needs fall in between, you can go with a 64-bit Cocoa and 32-bit
+ Carbon universal application with the appropriate checks in your code to
+ choose the right path based on where you are running the application.
+
+ For Mac OS X 10.6, Apple has started recommending developers to build their
+ applications 64-bit. The main reason is that there is a small speed
+ increase due to the extra registers on Intel CPU's, all their machine
+ offerings have been 64-bit since 2007, and there is a cost for reading all
+ the 32-bit libraries into memory if everything else is 64-bit. If you want
+ to follow this advice, there is only one choice, 64-bit Cocoa.
+
+ \target universal binaries
+ \section1 Universal Binaries
+
+ In 2006, Apple begin transitioning from PowerPC (PPC) to Intel (x86)
+ systems. Both architectures are supported by Qt. The release of Mac OS X
+ 10.5 in October 2007 added the possibility of writing and deploying 64-bit
+ GUI applications. Qt 4.5 and up supports both the 32-bit (PPC and x86) and
+ 64-bit (PPC64 and x86-64) versions of PowerPC and Intel-based systems.
+
+ Universal binaries are used to bundle binaries for more than one
+ architecture into a single package, simplifying deployment and
+ distribution. When running an application the operating system will select
+ the most appropriate architecture. Universal binaries support the following
+ architectures; they can be added to the build at configure time using the
+ \c{-arch} arguments:
+
+ \table
+ \header
+ \o Architecture
+ \o Flag
+ \row
+ \o Intel, 32-bit
+ \o \c{-arch x86}
+ \row
+ \o Intel, 64-bit
+ \o \c{-arch x86_64}
+ \row
+ \o PPC, 32-bit
+ \o \c{-arch ppc}
+ \row
+ \o PPC, 64-bit
+ \o \c{-arch ppc64}
+ \endtable
+
+ If there are no \c{-arch} flags specified, configure builds for the 32-bit
+ architecture, if you are currently on one. Universal binaries were initially
+ used to simplify the PPC to Intel migration. You can use \c{-universal} to
+ build for both the 32-bit Intel and PPC architectures.
+
+ \note The \c{-arch} flags at configure time only affect how Qt is built.
+ Applications are by default built for the 32-bit architecture you are
+ currently on. To build a universal binary, add the architectures to the
+ CONFIG variable in the .pro file:
+
+ \code
+ CONFIG += x86 ppc x86_64 ppc64
+ \endcode
+
+
+ \section1 Day-to-Day Application Development on OS X
+
+ On the command-line, applications can be built using \c qmake and \c make.
+ Optionally, \c qmake can generate project files for Xcode with
+ \c{-spec macx-xcode}. If you are using the binary package, \c qmake
+ generates Xcode projects by default; use \c{-spec macx-gcc} to generate
+ makefiles.
+
+ The result of the build process is an application bundle, which is a
+ directory structure that contains the actual application executable. The
+ application can be launched by double-clicking it in Finder, or by
+ referring directly to its executable from the command line, i. e.
+ \c{myApp.app/Contents/MacOS/myApp}.
+
+ If you wish to have a command-line tool that does not use the GUI (e.g.,
+ \c moc, \c uic or \c ls), you can tell \c qmake not to execute the bundle
+ creating steps by removing it from the \c{CONFIG} in your \c{.pro} file:
+
+ \code
+ CONFIG -= app_bundle
+ \endcode
+
+
+ \section1 Deployment - "Compile once, deploy everywhere"
+
+ In general, Qt supports building on one Mac OS X version and deploying on
+ all others, both forward and backwards. You can build on 10.4 Tiger and run
+ the same binary on 10.5 and up.
+
+ Some restrictions apply:
+
+ \list
+ \o Some functions and optimization paths that exist in later versions
+ of Mac OS X will not be available if you build on an earlier
+ version of Mac OS X.
+ \o The CPU architecture should match.
+ \o Cocoa support is only available for Mac OS X 10.5 and up.
+ \endlist
+
+ Universal binaries can be used to provide a smorgasbord of configurations
+ catering to all possible architectures.
+
+ Mac applications are typically deployed as self-contained application
+ bundles. The application bundle contains the application executable as well
+ as dependencies such as the Qt libraries, plugins, translations and other
+ resources you may need. Third party libraries like Qt are normally not
+ installed system-wide; each application provides its own copy.
+
+ The most common way to distribute applications is to provide a compressed
+ disk image (.dmg file) that the user can mount in Finder. The Mac
+ deployment tool (macdeployqt) can be used to create the self-contained bundles, and
+ optionally also create a .dmg archive. See the
+ \l{Deploying an Application on Mac OS X}{Mac deployment guide} for more
+ information about deployment. It is also possible to use an installer
+ wizard. More information on this option can be found in
+ \l{http://developer.apple.com/mac/}{Apple's documentation}.
+*/
+
diff --git a/doc/src/development/developing-with-qt.qdoc b/doc/src/development/developing-with-qt.qdoc
new file mode 100644
index 0000000..8608958
--- /dev/null
+++ b/doc/src/development/developing-with-qt.qdoc
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page developing-with-qt.html
+ \title Cross Platform Development with Qt
+
+ Qt is provided with a set of build tools to help developers automate
+ the process of building and installing Qt applications.
+
+ \table 100%
+ \header \o Development \o Cross-Platform Issues \o Specific Tools
+ \row
+ \o
+ \list
+ \o \l {Debugging Techniques}
+ \o \l {Qt's Tools}
+ \o \l {The Qt Resource System}
+ \o \l {Using Precompiled Headers}
+ \endlist
+ \o
+ \list
+ \o \l {Cross Compiling Qt for Embedded Linux Applications}
+ \o \l {Deploying Qt Applications}
+ \o \l {Installation}{Installing Qt}
+ \o \l {Window System Specific Notes}
+ \endlist
+ \o
+ \list
+ \o \l lupdate and \l lrelease
+ \o \l {moc}{Meta-Object Compiler (moc)}
+ \o \l {User Interface Compiler (uic)}
+ \o \l {Resource Compiler (rcc)}
+ \endlist
+ \endtable
+*/
diff --git a/doc/src/development/moc.qdoc b/doc/src/development/moc.qdoc
new file mode 100644
index 0000000..e18f31a
--- /dev/null
+++ b/doc/src/development/moc.qdoc
@@ -0,0 +1,335 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page moc.html
+ \title Using the Meta-Object Compiler (moc)
+ \ingroup qttools
+ \keyword moc
+
+ The Meta-Object Compiler, \c moc, is the program that handles
+ \l{Meta-Object System}{Qt's C++ extensions}.
+
+ The \c moc tool reads a C++ header file. If it finds one or more
+ class declarations that contain the Q_OBJECT macro, it
+ produces a C++ source file containing the meta-object code for
+ those classes. Among other things, meta-object code is required
+ for the signals and slots mechanism, the run-time type information,
+ and the dynamic property system.
+
+ The C++ source file generated by \c moc must be compiled and
+ linked with the implementation of the class.
+
+ If you use \l qmake to create your makefiles, build rules will be
+ included that call the moc when required, so you will not need to
+ use the moc directly. For more background information on \c moc,
+ see \l{Why Doesn't Qt Use Templates for Signals and Slots?}
+
+ \section1 Usage
+
+ \c moc is typically used with an input file containing class
+ declarations like this:
+
+ \snippet doc/src/snippets/moc/myclass1.h 0
+
+ In addition to the signals and slots shown above, \c moc also
+ implements object properties as in the next example. The
+ Q_PROPERTY() macro declares an object property, while
+ Q_ENUMS() declares a list of enumeration types within the class
+ to be usable inside the \l{Qt's Property System}{property
+ system}.
+
+ In the following example, we declare a property of the
+ enumeration type \c Priority that is also called \c priority and
+ has a get function \c priority() and a set function \c
+ setPriority().
+
+ \snippet doc/src/snippets/moc/myclass2.h 0
+
+ The Q_FLAGS() macro declares enums that are to be used
+ as flags, i.e. OR'd together. Another macro, Q_CLASSINFO(),
+ allows you to attach additional name/value pairs to the class's
+ meta-object:
+
+ \snippet doc/src/snippets/moc/myclass3.h 0
+
+ The output produced by \c moc must be compiled and linked, just
+ like the other C++ code in your program; otherwise, the build
+ will fail in the final link phase. If you use \c qmake, this is
+ done automatically. Whenever \c qmake is run, it parses the
+ project's header files and generates make rules to invoke \c moc
+ for those files that contain a Q_OBJECT macro.
+
+ If the class declaration is found in the file \c myclass.h, the
+ moc output should be put in a file called \c moc_myclass.cpp.
+ This file should then be compiled as usual, resulting in an
+ object file, e.g., \c moc_myclass.obj on Windows. This object
+ should then be included in the list of object files that are
+ linked together in the final building phase of the program.
+
+ \section1 Writing Make Rules for Invoking \c moc
+
+ For anything but the simplest test programs, it is recommended
+ that you automate running the \c{moc}. By adding some rules to
+ your program's makefile, \c make can take care of running moc
+ when necessary and handling the moc output.
+
+ We recommend using the \l qmake makefile generation tool for
+ building your makefiles. This tool generates a makefile that does
+ all the necessary \c moc handling.
+
+ If you want to create your makefiles yourself, here are some tips
+ on how to include moc handling.
+
+ For Q_OBJECT class declarations in header files, here is a
+ useful makefile rule if you only use GNU make:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 0
+
+ If you want to write portably, you can use individual rules of
+ the following form:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 1
+
+ You must also remember to add \c moc_foo.cpp to your \c SOURCES
+ (substitute your favorite name) variable and \c moc_foo.o or \c
+ moc_foo.obj to your \c OBJECTS variable.
+
+ Both examples assume that \c $(DEFINES) and \c $(INCPATH) expand
+ to the define and include path options that are passed to the C++
+ compiler. These are required by \c moc to preprocess the source
+ files.
+
+ While we prefer to name our C++ source files \c .cpp, you can use
+ any other extension, such as \c .C, \c .cc, \c .CC, \c .cxx, and
+ \c .c++, if you prefer.
+
+ For Q_OBJECT class declarations in implementation (\c .cpp)
+ files, we suggest a makefile rule like this:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 2
+
+ This guarantees that make will run the moc before it compiles
+ \c foo.cpp. You can then put
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 3
+
+ at the end of \c foo.cpp, where all the classes declared in that
+ file are fully known.
+
+ \section1 Command-Line Options
+
+ Here are the command-line options supported by the moc:
+
+ \table
+ \header \o Option \o Description
+
+ \row
+ \o \c{-o<file>}
+ \o Write output to \c <file> rather than to standard output.
+
+ \row
+ \o \c{-f[<file>]}
+ \o Force the generation of an \c #include statement in the
+ output. This is the default for header files whose extension
+ starts with \c H or \c h. This option is useful if you have
+ header files that do not follow the standard naming conventions.
+ The \c <file> part is optional.
+
+ \row
+ \o \c -i
+ \o Do not generate an \c #include statement in the output.
+ This may be used to run the moc on on a C++ file containing one or
+ more class declarations. You should then \c #include the meta-object
+ code in the \c .cpp file.
+
+ \row
+ \o \c -nw
+ \o Do not generate any warnings. (Not recommended.)
+
+ \row
+ \o \c {-p<path>}
+ \o Makes the moc prepend \c {<path>/} to the file name in the
+ generated \c #include statement.
+
+ \row
+ \o \c {-I<dir>}
+ \o Add dir to the include path for header files.
+
+ \row
+ \o \c{-E}
+ \o Preprocess only; do not generate meta-object code.
+
+ \row
+ \o \c {-D<macro>[=<def>]}
+ \o Define macro, with optional definition.
+
+ \row
+ \o \c{-U<macro>}
+ \o Undefine macro.
+
+ \row
+ \o \c{@<file>}
+ \o Read additional command-line options from \c{<file>}.
+ Each line of the file is treated as a single option. Empty lines
+ are ignored. Note that this option is not supported within the
+ options file itself (i.e. an options file can't "include" another
+ file).
+
+ \row
+ \o \c{-h}
+ \o Display the usage and the list of options.
+
+ \row
+ \o \c {-v}
+ \o Display \c{moc}'s version number.
+
+ \row
+ \o \c{-Fdir}
+
+ \o Mac OS X. Add the framework directory \c{dir} to the head of
+ the list of directories to be searched for header files. These
+ directories are interleaved with those specified by -I options
+ and are scanned in a left-to-right order (see the manpage for
+ gcc). Normally, use -F /Library/Frameworks/
+
+ \endtable
+
+ You can explicitly tell the moc not to parse parts of a header
+ file. \c moc defines the preprocessor symbol \c Q_MOC_RUN. Any
+ code surrounded by
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 4
+
+ is skipped by the \c moc.
+
+ \section1 Diagnostics
+
+ \c moc will warn you about a number of dangerous or illegal
+ constructs in the Q_OBJECT class declarations.
+
+ If you get linkage errors in the final building phase of your
+ program, saying that \c YourClass::className() is undefined or
+ that \c YourClass lacks a vtable, something has been done wrong.
+ Most often, you have forgotten to compile or \c #include the
+ moc-generated C++ code, or (in the former case) include that
+ object file in the link command. If you use \c qmake, try
+ rerunning it to update your makefile. This should do the trick.
+
+ \section1 Limitations
+
+ \c moc does not handle all of C++. The main problem is that class
+ templates cannot have signals or slots. Here is an example:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 5
+
+ Another limitation is that moc does not expand macros, so you
+ for example cannot use a macro to declare a signal/slot
+ or use one to define a base class for a QObject.
+
+ Less importantly, the following constructs are illegal. All of
+ them have alternatives which we think are usually better, so
+ removing these limitations is not a high priority for us.
+
+ \section2 Multiple Inheritance Requires QObject to Be First
+
+ If you are using multiple inheritance, \c moc assumes that the
+ first inherited class is a subclass of QObject. Also, be sure
+ that only the first inherited class is a QObject.
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 6
+
+ Virtual inheritance with QObject is \e not supported.
+
+ \section2 Function Pointers Cannot Be Signal or Slot Parameters
+
+ In most cases where you would consider using function pointers as
+ signal or slot parameters, we think inheritance is a better
+ alternative. Here is an example of illegal syntax:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 7
+
+ You can work around this restriction like this:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 8
+
+ It may sometimes be even better to replace the function pointer
+ with inheritance and virtual functions.
+
+ \section2 Enums and Typedefs Must Be Fully Qualified for Signal and Slot Parameters
+
+ When checking the signatures of its arguments, QObject::connect()
+ compares the data types literally. Thus,
+ \l{Qt::Alignment}{Alignment} and \l{Qt::Alignment} are treated as
+ two distinct types. To work around this limitation, make sure to
+ fully qualify the data types when declaring signals and slots,
+ and when establishing connections. For example:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 9
+
+ \section2 Type Macros Cannot Be Used for Signal and Slot Parameters
+
+ Since \c moc doesn't expand \c{#define}s, type macros that take
+ an argument will not work in signals and slots. Here is an
+ illegal example:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 10
+
+ A macro without parameters will work.
+
+ \section2 Nested Classes Cannot Have Signals or Slots
+
+ Here's an example of the offending construct:
+
+ \snippet doc/src/snippets/code/doc_src_moc.qdoc 11
+
+ \section2 Signal/Slot return types cannot be references
+
+ Signals and slots can have return types, but signals or slots returning references
+ will be treated as returning void.
+
+ \section2 Only Signals and Slots May Appear in the \c signals and \c slots Sections of a Class
+
+ \c moc will complain if you try to put other constructs in the \c
+ signals or \c slots sections of a class than signals and slots.
+
+ \sa {Meta-Object System}, {Signals and Slots}, {Qt's Property System}
+*/
diff --git a/doc/src/development/qmake-manual.qdoc b/doc/src/development/qmake-manual.qdoc
new file mode 100644
index 0000000..6a9f7b7
--- /dev/null
+++ b/doc/src/development/qmake-manual.qdoc
@@ -0,0 +1,4722 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qmake-manual.html
+ \title qmake Manual
+ \startpage {index.html}{Qt Reference Documentation}
+ \nextpage qmake Tutorial
+
+ \ingroup qttools
+ \keyword qmake
+
+ \c qmake is a tool that helps simplify the build
+ process for development project across different platforms. \c qmake
+ automates the generation of Makefiles so that only a few lines of
+ information are needed to create each Makefile. \c qmake can be used for
+ any software project, whether it is written in Qt or not.
+
+ \c qmake generates a Makefile based on the information in a project
+ file. Project files are created by the developer, and are usually
+ simple, but more sophisticated project files can be created for
+ complex projects.
+ \c qmake contains additional features to support development with Qt,
+ automatically including build rules for \l{moc.html}{moc}
+ and \l{uic.html}{uic}.
+ \c qmake can also generate projects for Microsoft Visual studio
+ without requiring the developer to change the project file.
+
+ \section1 Getting Started
+
+ The \l{qmake Tutorial} and guide to \l{qmake Common Projects} provide overviews
+ that aim to help new users get started with \c qmake.
+
+ \list
+ \o \l{qmake Tutorial}
+ \tableofcontents{1 qmake Tutorial}
+ \endlist
+
+ \list
+ \o \l{qmake Common Projects}
+ \tableofcontents{1 qmake Common Projects}
+ \endlist
+
+ \section1 Table of Contents
+
+ \list
+ \o \l{Using qmake}
+ \tableofcontents{1 Using qmake}
+ \o \l{qmake Project Files}
+ \tableofcontents{1 qmake Project Files}
+ \o \l{Running qmake}
+ \tableofcontents{1 Running qmake}
+ \o \l{qmake Platform Notes}
+ \tableofcontents{1 qmake Platform Notes}
+ \o \l{qmake Advanced Usage}
+ \tableofcontents{1 qmake Advanced Usage}
+ \o \l{Using Precompiled Headers}
+ \tableofcontents{1 Using Precompiled Headers}
+ \o \l{qmake Reference}
+ \tableofcontents{1 qmake Reference}
+ \o \l{qmake Variable Reference}
+ \tableofcontents{1 qmake Variable Reference}
+ \o \l{qmake Function Reference}
+ \tableofcontents{1 qmake Function Reference}
+ \o \l{Configuring qmake's Environment}
+ \tableofcontents{1 Configuring qmake's Environment}
+ \endlist
+*/
+
+/*!
+ \page qmake-using.html
+ \title Using qmake
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Manual
+ \nextpage qmake Project Files
+
+ \c qmake provides a project-oriented system for managing the build
+ process for applications, libraries, and other components. This
+ approach gives developers control over the source files used, and
+ allows each of the steps in the process to be described concisely,
+ typically within a single file. \c qmake expands the information in
+ each project file to a Makefile that executes the necessary commands
+ for compiling and linking.
+
+ In this document, we provide a basic introduction to project files,
+ describe some of the main features of \c qmake, and show how to use
+ \c qmake on the command line.
+
+ \section1 Describing a Project
+
+ Projects are described by the contents of project (\c .pro) files.
+ The information within these is used by \c qmake to generate a Makefile
+ containing all the commands that are needed to build each project.
+ Project files typically contain a list of source and header files,
+ general configuration information, and any application-specific details,
+ such as a list of extra libraries to link against, or a list of extra
+ include paths to use.
+
+ Project files can contain a number of different elements, including
+ comments, variable declarations, built-in functions, and some simple
+ control structures. In most simple projects, it is only necessary
+ to declare the source and header files that are used to build the
+ project with some basic configuration options.
+
+ Complete examples of project files can be found in the
+ \l{qmake Tutorial}.
+ An introduction to project files can be found in the
+ \l{qmake Project Files} chapter, and a more detailed description is
+ available in the \l{qmake Reference}.
+
+ \section1 Building a Project
+
+ For simple projects, you only need to run \c qmake in the top
+ level directory of your project. By default, \c qmake generates a
+ Makefile that you then use to build the project, and you can then
+ run your platform's \c make tool to build the project.
+
+ \c qmake can also be used to generate project files. A full
+ description of \c{qmake}'s command line options can be found in the
+ \l{Running qmake} chapter of this manual.
+
+ \section1 Using Precompiled Headers
+
+ In large projects, it is possible to take advantage of precompiled
+ header files to speed up the build process. This feature is described
+ in detail in the \l{Using Precompiled Headers} chapter.
+*/
+
+/*!
+ \page qmake-project-files.html
+ \title qmake Project Files
+ \contentspage {qmake Manual}{Contents}
+ \previouspage Using qmake
+ \nextpage Running qmake
+
+ Project files contain all the information required by \c qmake to build
+ your application, library, or plugin. The resources used by your project
+ are generally specified using a series of declarations, but support for
+ simple programming constructs allow you to describe different build
+ processes for different platforms and environments.
+
+ \tableofcontents
+
+ \section1 Project File Elements
+
+ The project file format used by \c qmake can be used to support both
+ simple and fairly complex build systems. Simple project files will
+ use a straightforward declarative style, defining standard variables
+ to indicate the source and header files that are used in the project.
+ Complex projects may use the control flow structures to fine-tune the
+ build process.
+
+ The following sections describe the different types of elements used
+ in project files.
+
+ \section2 Variables
+
+ In a project file, variables are used to hold lists of strings.
+ In the simplest projects, these variables inform \c qmake about the
+ configuration options to use, or supply filenames and paths to use
+ in the build process.
+
+ \c qmake looks for certain variables in each project file, and it
+ uses the contents of these to determine what it should write to a
+ Makefile. For example, the list of values in the \c HEADERS and
+ \c SOURCES variables are used to tell \c qmake about header and
+ source files in the same directory as the project file.
+
+ Variables can also be used internally to store temporary lists of values,
+ and existing lists of values can be overwritten or extended with new
+ values.
+
+ The following lines show how lists of values are assigned to variables:
+
+ \snippet doc/src/snippets/qmake/variables.pro 0
+
+ Note that the first assignment only includes values that are specified on
+ the same line as the \c SOURCES variable. The second assignment splits
+ the items across lines by using the \c \\ character.
+
+ The list of values in a variable is extended in the following way:
+
+ \snippet doc/src/snippets/qmake/variables.pro 1
+
+ The \c CONFIG variable is another special variable that \c qmake
+ uses when generating a Makefile. It is discussed in the section on
+ \l{#GeneralConfiguration}{general configuration} later in this chapter.
+ In the above line, \c qt is added to the list of existing values
+ contained in \c CONFIG.
+
+ The following table lists the variables that \c qmake recognizes, and
+ describes what they should contain.
+
+ \table
+ \header \o Variable \o Contents
+ \row \o CONFIG \o General project configuration options.
+ \row \o DESTDIR \o The directory in which the executable or binary file will
+ be placed.
+ \row \o FORMS \o A list of UI files to be processed by \c uic.
+ \row \o HEADERS \o A list of filenames of header (.h) files used when
+ building the project.
+ \row \o QT \o Qt-specific configuration options.
+ \row \o RESOURCES \o A list of resource (.rc) files to be included in the
+ final project. See the \l{The Qt Resource System} for
+ more information about these files.
+ \row \o SOURCES \o A list of source code files to be used when building
+ the project.
+ \row \o TEMPLATE \o The template to use for the project. This determines
+ whether the output of the build process will be an
+ application, a library, or a plugin.
+ \endtable
+
+ The contents of a variable can be read by prepending the variable name with
+ \c $$. This can be used to assign the contents of one variable to another:
+
+ \snippet doc/src/snippets/qmake/dereferencing.pro 0
+
+ The \c $$ operator is used extensively with built-in functions that operate
+ on strings and lists of values. These are described in the chapter on
+ \l{qmake Advanced Usage}.
+
+ \section3 Whitespace
+
+ Normally, variables are used to contain whitespace-separated lists
+ of values. However, it is sometimes necessary to specify values containing
+ spaces. These must be quoted by using the
+ \l{qmake Function Reference#quote-string}{quote()} function in the following way:
+
+ \snippet doc/src/snippets/qmake/quoting.pro 0
+
+ The quoted text is treated as a single item in the list of values held by
+ the variable. A similar approach is used to deal with paths that contain
+ spaces, particularly when defining the
+ \l{qmake Variable Reference#INCLUDEPATH}{INCLUDEPATH} and
+ \l{qmake Variable Reference#LIBS}{LIBS} variables for the Windows platform.
+ In cases like these, the \l{qmake Function Reference#quote(string)}{quote()}
+ function can be used in the following way:
+
+ \snippet doc/src/snippets/qmake/spaces.pro quoting include paths with spaces
+
+ \section2 Comments
+
+ You can add comments to project files. Comments begin with the \c
+ # character and continue to the end of the same line. For example:
+
+ \snippet doc/src/snippets/qmake/comments.pro 0
+
+ To include the \c # character in variable assignments, it is necessary
+ to use the contents of the built-in \c LITERAL_HASH variable. See the
+ \l{qmake Variable Reference#LITERAL_HASH}{variable reference} for more
+ information.
+
+ \section2 Built-in Functions and Control Flow
+
+ \c qmake provides a number of built-in functions to allow the contents
+ of variables to be processed. The most commonly used function in simple
+ project files is the \c include function which takes a filename as an
+ argument. The contents of the given file are included in the project
+ file at the place where the \c include function is used.
+ The \c include function is most commonly used to include other project
+ files:
+
+ \snippet doc/src/snippets/qmake/include.pro 0
+
+ Support for conditional structures is made available via
+ \l{qmake Advanced Usage#scopes}{scopes} that behave like \c if
+ statements in programming languages:
+
+ \snippet doc/src/snippets/qmake/scopes.pro 0
+
+ The assignments inside the braces are only made if the condition is
+ true. In this case, the special \c win32 variable must be set; this
+ happens automatically on Windows, but this can also be specified on
+ other platforms by running \c qmake with the \c{-win32} command line
+ option (see \l{Running qmake} for more information). The opening
+ brace must stand on the same line as the condition.
+
+ Simple loops are constructed by iterating over lists of values using
+ the built-in \c for function. The following code adds directories
+ to the \l{qmake Variable Reference#SUBDIRS}{SUBDIRS} variable, but
+ only if they exist:
+
+ \snippet doc/src/snippets/qmake/functions.pro 0
+
+ More complex operations on variables that would usually require loops
+ are provided by built-in functions such as \c find, \c unique, and
+ \c count. These functions, and many others are provided to manipulate
+ strings and paths, support user input, and call external tools. A list
+ of the functions available can be found in the
+ \l{qmake Advanced Usage} chapter of this manual.
+
+ \section1 Project Templates
+
+ The \c TEMPLATE variable is used to define the type of project that will
+ be built. If this is not declared in the project file, \c qmake assumes
+ that an application should be built, and will generate an appropriate
+ Makefile (or equivalent file) for the purpose.
+
+ The types of project available are listed in the following table with
+ information about the files that \c qmake will generate for each of them:
+
+ \table
+ \header \o Template \o Description of \c qmake output
+ \row \o app (default) \o Creates a Makefile to build an application.
+ \row \o lib \o Creates a Makefile to build a library.
+ \row \o subdirs \o Creates a Makefile containing rules for the
+ subdirectories specified using the \l{qmake Variable Reference#SUBDIRS}{SUBDIRS}
+ variable. Each subdirectory must contain its own project file.
+ \row \o vcapp \o Creates a Visual Studio Project file to build
+ an application.
+ \row \o vclib \o Creates a Visual Studio Project file to build a library.
+ \endtable
+
+ See the \l{qmake Tutorial} for advice on writing project files for
+ projects that use the \c app and \c lib templates.
+
+ When the \c subdirs template is used, \c qmake generates a Makefile
+ to examine each specified subdirectory, process any project file it finds
+ there, and run the platform's \c make tool on the newly-created Makefile.
+ The \l{qmake Variable Reference#SUBDIRS}{SUBDIRS} variable is used to
+ contain a list of all the subdirectories to be processed.
+
+ \target GeneralConfiguration
+ \section1 General Configuration
+
+ The \l{qmake Variable Reference#CONFIG}{CONFIG variable} specifies the
+ options and features that the compiler should use and the libraries that
+ should be linked against. Anything can be added to the \c CONFIG variable,
+ but the options covered below are recognized by \c qmake internally.
+
+ The following options control the compiler flags that are used to build the
+ project:
+
+ \table
+ \header \o Option \o Description
+ \row \o release \o The project is to be built in release mode.
+ This is ignored if \c debug is also specified.
+ \row \o debug \o The project is to be built in debug mode.
+ \row \o debug_and_release \o The project is built in \e both debug and
+ release modes.
+ \row \o debug_and_release_target \o The project is built in \e both debug
+ and release modes. TARGET is built into \e both the debug and release directories.
+ \row \o build_all \o If \c debug_and_release is specified, the project is
+ built in both debug and release modes by default.
+ \row \o autogen_precompile_source \o Automatically generates a \c .cpp file that includes
+ the precompiled header file specified in the .pro file.
+ \row \o ordered \o When using the \c subdirs template, this option
+ specifies that the directories listed should be processed in the
+ order in which they are given.
+ \row \o warn_on \o The compiler should output as many warnings as possible.
+ This is ignored if \c warn_off is specified.
+ \row \o warn_off \o The compiler should output as few warnings as possible.
+ \row \o copy_dir_files \o Enables the install rule to also copy directories, not just files.
+ \endtable
+
+ The \c debug_and_release option is special in that it enables \e both debug and
+ release versions of a project to be built. In such a case, the Makefile that
+ \c qmake generates includes a rule that builds both versions, and this can be
+ invoked in the following way:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 0
+
+ Adding the \c build_all option to the \c CONFIG variable makes this rule
+ the default when building the project, and installation targets will be
+ created for both debug and release builds.
+
+ Note that each of the options specified in the \c CONFIG variable can also be
+ used as a scope condition.
+ You can test for the presence of certain configuration options by using the
+ built-in \l{qmake Function Reference#CONFIG(config)}{CONFIG()} function.
+ For example, the following lines show the function as the condition in a scope
+ to test whether only the \c opengl option is in use:
+
+ \snippet doc/src/snippets/qmake/configscopes.pro 4
+ \snippet doc/src/snippets/qmake/configscopes.pro 5
+
+ This enables different configurations to be defined for \c release and
+ \c debug builds, and is described in more detail in the
+ \l{qmake Advanced Usage#Scopes}{Scopes} section of the
+ \l{qmake Advanced Usage}{Advanced Usage} chapter of this manual.
+
+ The following options define the type of project to be built. Note that some
+ of these options only take effect when used on the relevant platform. On other
+ platforms, they have no effect.
+
+ \table
+ \header \o Option \o Description
+ \row \o qt \o The project is a Qt application and should link against the Qt
+ library. You can use the \c QT variable to control any additional
+ Qt modules that are required by your application.
+ \row \o thread \o The project is a multi-threaded application.
+ \row \o x11 \o The project is an X11 application or library.
+ \endtable
+
+ When using \l{qmake Variable Reference#TEMPLATE}{application or library project
+ templates}, more specialized configuration options can be used to fine tune the
+ build process. These are explained in details in the
+ \l{qmake-common-projects.html}{Common Projects} chapter of this manual.
+
+ For example, if your application uses the Qt library and you want to
+ build it as a multi-threaded application in \c debug mode, your project
+ file will contain the following line:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 1
+
+ Note, that you must use "+=", not "=", or \c qmake will not be able to
+ use Qt's configuration to determine the settings needed for your project.
+
+ \section1 Declaring Qt Libraries
+
+ If the \c CONFIG variable contains the \c qt value, qmake's support for Qt
+ applications is enabled. This makes it possible to fine-tune which of the
+ Qt modules are used by your application. This is achieved with the \c QT
+ variable which can be used to declare the required extension modules.
+ For example, we can enable the XML and network modules in the following way:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 2
+
+ Note that \c QT includes the \c core and \c gui modules by default, so the
+ above declaration \e adds the network and XML modules to this default list.
+ The following assignment \e omits the default modules, and will lead to
+ errors when the application's source code is being compiled:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 3
+
+ If you want to build a project \e without the \c gui module, you need to
+ exclude it with the "-=" operator. By default, \c QT contains both
+ \c core and \c gui, so the following line will result in a minimal
+ Qt project being built:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 4
+
+ The table below shows the options that can be used with the \c QT variable
+ and the features that are associated with each of them:
+
+ \table
+ \header \o Option \o Features
+ \row \o core (included by default) \o QtCore module
+ \row \o gui (included by default) \o QtGui module
+ \row \o network \o QtNetwork module
+ \row \o opengl \o QtOpenGL module
+ \row \o sql \o QtSql module
+ \row \o svg \o QtSvg module
+ \row \o xml \o QtXml module
+ \row \o xmlpatterns \o QtXmlPatterns module
+ \row \o qt3support \o Qt3Support module
+ \endtable
+
+ Note that adding the \c opengl option to the \c QT variable automatically
+ causes the equivalent option to be added to the \c CONFIG variable.
+ Therefore, for Qt applications, it is not necessary to add the \c opengl
+ option to both \c CONFIG and \c{QT}.
+
+ \section1 Configuration Features
+
+ \c qmake can be set up with extra configuration features that are specified
+ in feature (.prf) files. These extra features often provide support for
+ custom tools that are used during the build process. To add a feature to
+ the build process, append the feature name (the stem of the feature filename)
+ to the \c CONFIG variable.
+
+ For example, \c qmake can configure the build process to take advantage
+ of external libraries that are supported by
+ \l{http://www.freedesktop.org/wiki/Software_2fpkgconfig}{pkg-config},
+ such as the D-Bus and ogg libraries, with the following lines:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 5
+
+ More information about features can be found in the
+ \l{qmake Advanced Usage#Adding New Configuration Features}
+ {Adding New Configuration Features} section of the \l{qmake Advanced Usage}
+ chapter.
+
+ \section1 Declaring Other Libraries
+
+ If you are using other libraries in your project in addition to those
+ supplied with Qt, you need to specify them in your project file.
+
+ The paths that \c qmake searches for libraries and the specific libraries
+ to link against can be added to the list of values in the
+ \l{qmake Variable Reference#LIBS}{LIBS} variable. The paths to the libraries
+ themselves can be given, or the familiar Unix-style notation for specifying
+ libraries and paths can be used if preferred.
+
+ For example, the following lines show how a library can be specified:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 6
+
+ The paths containing header files can also be specified in a similar way
+ using the \l{qmake Variable Reference#INCLUDEPATH}{INCLUDEPATH} variable.
+
+ For example, it is possible to add several paths to be searched for header
+ files:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 7
+*/
+
+/*!
+ \page qmake-running.html
+ \title Running qmake
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Project Files
+ \nextpage qmake Platform Notes
+
+ The behavior of \c qmake can be customized when it is run by
+ specifying various options on the command line. These allow the
+ build process to be fine-tuned, provide useful diagnostic
+ information, and can be used to specify the target platform for
+ your project.
+
+ \tableofcontents
+
+ \target Commands
+ \section1 Command-Line Options
+
+ \section2 Syntax
+
+ The syntax used to run \c qmake takes the following simple form:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 8
+
+ \c qmake supports two different modes of operation: In the default mode,
+ \c qmake will use the description in a project file to generate a Makefile,
+ but it is also possible to use \c qmake to generate project files.
+ If you want to explicitly set the mode, you must specify it before all
+ other options. The \c mode can be either of the following two values:
+
+ \list
+ \o \c -makefile \BR
+ \c qmake output will be a Makefile.
+ \o \c -project \BR
+ \c qmake output will be a project file. \BR
+\bold{Note:} It is likely that the created file will need to be edited for example adding the \c QT variable to suit what modules are required for the project.
+ \endlist
+
+ The following \c options are used to specify both general and mode-specific
+ settings. Options that only apply to the Makefile mode are described in the
+ \l{#MakefileMode}{Makefile Mode Options} section; options that influence the
+ creation of project files are described in the
+ \l{#ProjectMode}{Project File Options} section.
+
+ The \c files argument represents a list of one or more project files, separated
+ by spaces.
+
+ \section2 Options
+
+ A wide range of options can be specified on the command line to \c qmake in
+ order to customize the build process, and to override default settings for
+ your platform. The following basic options provide usage information, specify
+ where \c qmake writes the output file, and control the level of debugging
+ information that will be written to the console:
+
+ \list
+ \o \c -help \BR
+ \c qmake will go over these features and give some useful help.
+ \o \c -o file \BR
+ \c qmake output will be directed to \e file. If this option
+ is not specified, \c qmake will try to use a suitable file name for its
+ output, depending on the mode it is running in.\BR
+ If '-' is specified, output is directed to stdout.
+ \o \c -d \BR
+ \c qmake will output debugging information.
+ \endlist
+
+ For projects that need to be built differently on each target platform, with
+ many subdirectories, you can run \c qmake with each of the following
+ options to set the corresponding platform-specific variable in each
+ project file:
+
+ \list
+ \o \c -unix \BR
+ \c qmake will run in unix mode. In this mode, Unix file
+ naming and path conventions will be used, additionally testing for \c unix
+ (as a scope) will succeed. This is the default mode on all Unices.
+ \o \c -macx \BR
+ \c qmake will run in Mac OS X mode. In this mode, Unix file
+ naming and path conventions will be used, additionally testing for \c macx
+ (as a scope) will succeed. This is the default mode on Mac OS X.
+ \o \c -win32 \BR
+ \c qmake will run in win32 mode. In this mode, Windows file naming and path
+ conventions will be used, additionally testing for \c win32 (as a scope)
+ will succeed. This is the default mode on Windows.
+ \endlist
+
+ The template used for the project is usually specified by the \c TEMPLATE
+ variable in the project file. We can override or modify this by using the
+ following options:
+
+ \list
+ \o \c -t tmpl \BR
+ \c qmake will override any set \c TEMPLATE variables with tmpl, but only
+ \e after the .pro file has been processed.
+ \o \c -tp prefix \BR
+ \c qmake will add the prefix to the \c TEMPLATE variable.
+ \endlist
+
+ The level of warning information can be fine-tuned to help you find problems in
+ your project file:
+
+ \list
+ \o \c -Wall \BR
+ \c qmake will report all known warnings.
+ \o \c -Wnone \BR
+ No warning information will be generated by \c qmake.
+ \o \c -Wparser \BR
+ \c qmake will only generate parser warnings. This will alert
+ you to common pitfalls and potential problems in the parsing of your
+ project files.
+ \o \c -Wlogic \BR
+ \c qmake will warn of common pitfalls and potential problems in your
+ project file. For example, \c qmake will report whether a file is placed
+ into a list of files multiple times, or if a file cannot be found.
+ \endlist
+
+ \target MakefileMode
+ \section2 Makefile Mode Options
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 9
+
+ In Makefile mode, \c qmake will generate a Makefile that is used to build the
+ project. Additionally, the following options may be used in this mode to
+ influence the way the project file is generated:
+
+ \list
+ \o \c -after \BR
+ \c qmake will process assignments given on the command line after
+ the specified files.
+ \o \c -nocache \BR
+ \c qmake will ignore the .qmake.cache file.
+ \o \c -nodepend \BR
+ \c qmake will not generate any dependency information.
+ \o \c -cache file \BR
+ \c qmake will use \e file as the cache file, ignoring any other
+ .qmake.cache files found.
+ \o \c -spec spec \BR
+ \c qmake will use \e spec as a path to platform and compiler information,
+ and the value of \c QMAKESPEC will be ignored.
+ \endlist
+
+ You may also pass \c qmake assignments on the command line;
+ they will be processed before all of the files specified. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 10
+
+ This will generate a Makefile, from test.pro with Unix pathnames. However
+ many of the specified options aren't necessary as they are the default.
+ Therefore, the line can be simplified on Unix to:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 11
+
+ If you are certain you want your variables processed after the
+ files specified, then you may pass the \c -after option. When this
+ is specified, all assignments on the command line after the \c -after
+ option will be postponed until after the specified files are parsed.
+
+ \target ProjectMode
+ \section2 Project Mode Options
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 12
+
+ In project mode, \c qmake will generate a project file. Additionally, you
+ may supply the following options in this mode:
+
+ \list
+ \o \c -r \BR
+ \c qmake will look through supplied directories recursively
+ \o \c -nopwd \BR
+ \c qmake will not look in your current working directory for
+ source code and only use the specified \c files
+ \endlist
+
+ In this mode, the \c files argument can be a list of files or directories.
+ If a directory is specified, it will be included in the \c DEPENDPATH
+ variable, and relevant code from there will be included in the generated
+ project file. If a file is given, it will be appended to the correct
+ variable, depending on its extension; for example, UI files are added
+ to \c FORMS, and C++ files are added to \c SOURCES.
+
+ You may also pass assignments on the command line in this mode. When doing
+ so, these assignments will be placed last in the generated project file.
+*/
+
+/*!
+ \page qmake-platform-notes.html
+ \title qmake Platform Notes
+ \contentspage {qmake Manual}{Contents}
+ \previouspage Running qmake
+ \nextpage qmake Advanced Usage
+
+ Many cross-platform projects can be handled by the \c{qmake}'s basic
+ configuration features. On some platforms, it is sometimes useful, or even
+ necessary, to take advantage of platform-specific features. \c qmake knows
+ about many of these features, and these can be accessed via specific
+ variables that only have an effect on the platforms where they are relevant.
+
+ \tableofcontents
+
+ \section1 Mac OS X
+
+ Features specific to this platform include support for creating universal
+ binaries, frameworks and bundles.
+
+ \section2 Source and Binary Packages
+
+ The version of \c qmake supplied in source packages is configured slightly
+ differently to that supplied in binary packages in that it uses a different
+ feature specification. Where the source package typically uses the
+ \c macx-g++ specification, the binary package is typically configured to
+ use the \c macx-xcode specification.
+
+ Users of each package can override this configuration by invoking \c qmake
+ with the \c -spec option (see \l{Running qmake} for more information). This
+ makes it possible, for example, to use \c qmake from a binary package to
+ create a Makefile in a project directory with the following command line
+ invocation:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 13
+
+ \section2 Using Frameworks
+
+ \c qmake is able to automatically generate build rules for linking against
+ frameworks in the standard framework directory on Mac OS X, located at
+ \c{/Library/Frameworks/}.
+
+ Directories other than the standard framework directory need to be specified
+ to the build system, and this is achieved by appending linker options to the
+ \l{qmake Variable Reference#QMAKE_LFLAGS}{QMAKE_LFLAGS} variable, as shown
+ in the following example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 14
+
+ The framework itself is linked in by appending the \c{-framework} options and
+ the name of the framework to the \l{qmake Variable Reference#LIBS}{LIBS}
+ variable:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 15
+
+ \section2 Creating Frameworks
+
+ Any given library project can be configured so that the resulting library
+ file is placed in a
+ \l{http://developer.apple.com/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WhatAreFrameworks.html}
+ {framework}, ready for deployment. To do this, set up the project to use the
+ \l{qmake Variable Reference#TEMPLATE}{\c lib template} and add the
+ \c lib_bundle option to the
+ \l{qmake Variable Reference#CONFIG}{CONFIG} variable:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 16
+
+ The data associated with the library is specified using the
+ \l{qmake Variable Reference#QMAKE_BUNDLE_DATA}{QMAKE_BUNDLE_DATA}
+ variable. This holds items that will be installed with a library
+ bundle, and is often used to specify a collection of header files,
+ as in the following example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 17
+
+ Here, the \c FRAMEWORK_HEADERS variable is a user-defined variable that
+ is used to define the headers required to use a particular framework.
+ Appending it to the \c QMAKE_BUNDLE_DATA variable ensures that the
+ information about these headers are added to the collection of
+ resources that will be installed with the library bundle. Also, the
+ framework's name and version are specified by
+ \l{qmake Variable Reference#QMAKE_FRAMEWORK_BUNDLE_NAME}
+ {QMAKE_FRAMEWORK_BUNDLE_NAME}
+ and \l{qmake Variable Reference#QMAKE_FRAMEWORK_VERSION}
+ {QMAKE_FRAMEWORK_VERSION} variables. By default, the values used for
+ these are obtained from the \l{qmake Variable Reference#TARGET}{TARGET}
+ and \l{qmake Variable Reference#VERSION}{VERSION} variables.
+
+ See \l{Deploying an Application on Mac OS X} for more information about
+ deploying applications and libraries.
+
+ \section2 Creating Universal Binaries
+
+ To create a universal binary for your application, you need to be using
+ a version of Qt that has been configured with the \c{-universal} option.
+
+ The architectures to be supported in the binary are specified with the
+ \l{qmake Variable Reference#CONFIG}{CONFIG} variable. For example, the
+ following assignment causes \c qmake to generate build rules to create
+ a universal binary for both PowerPC and x86 architectures:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 18
+
+ Additionally, developers using a PowerPC-based platform need to set the
+ \l{qmake Variable Reference#QMAKE_MAC_SDK}{QMAKE_MAC_SDK} variable.
+ This process is discussed in more detail in the
+ \l{Deploying an Application on Mac OS X#Architecture Dependencies}{deployment guide for Mac OS X}.
+
+ \section2 Creating and Moving Xcode Projects
+
+ Developers on Mac OS X can take advantage of \c{qmake}'s support for Xcode
+ project files, as described in
+ \l{Qt is Mac OS X Native#Development Tools}{Qt is Mac OS X Native},
+ by running \c qmake to generate an Xcode project from an existing \c qmake
+ project files. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 19
+
+ Note that, if a project is later moved on the disk, \c qmake must be run
+ again to process the project file and create a new Xcode project file.
+
+ \section2 On supporting two build targets simultaneously
+
+ Implementing this is currently not feasible, because the XCode
+ concept of Active Build Configurations is conceptually different
+ from the qmake idea of build targets.
+
+ The XCode Active Build Configurations settings are for modifying
+ xcode configurations, compiler flags and similar build
+ options. Unlike Visual Studio, XCode does not allow for the
+ selection of specific library files based on whether debug or
+ release build configurations are selected. The qmake debug and
+ release settings control which library files are linked to the
+ executable.
+
+ It is currently not possible to set files in XCode configuration
+ settings from the qmake generated xcode project file. The way the
+ libraries are linked in the "Frameworks & Libraries" phase in the
+ XCode build system.
+
+ Furthermore, The selected "Active Build Configuration" is stored
+ in a .pbxuser file, which is generated by xcode on first load, not
+ created by qmake.
+
+ \section1 Windows
+
+ Features specific to this platform include support for creating Visual
+ Studio project files and handling manifest files when deploying Qt
+ applications developed using Visual Studio 2005.
+
+ \section2 Creating Visual Studio Project Files
+
+ Developers using Visual Studio to write Qt applications can use the
+ Visual Studio integration facilities provided with the
+ \l{Qt Commercial Editions} and do not need to worry about how
+ project dependencies are managed.
+
+ However, some developers may need to import an existing \c qmake project
+ into Visual Studio. \c qmake is able to take a project file and create a
+ Visual Studio project that contains all the necessary information required
+ by the development environment. This is achieved by setting the \c qmake
+ \l{qmake Variable Reference#TEMPLATE}{project template} to either \c vcapp
+ (for application projects) or \c vclib (for library projects).
+
+ This can also be set using a command line option, for example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 20
+
+ It is possible to recursively generate \c{.vcproj} files in subdirectories
+ and a \c{.sln} file in the main directory, by typing:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 21
+
+ Each time you update the project file, you need to run \c qmake to generate
+ an updated Visual Studio project.
+
+ \note If you are using the Visual Studio Add-in, you can import \c .pro
+ files via the \gui{Qt->Import from .pro file} menu item.
+
+ \section2 Visual Studio 2005 Manifest Files
+
+ When deploying Qt applications built using Visual Studio 2005, it is
+ necessary to ensure that the manifest file, created when the application
+ was linked, is handled correctly. This is handled automatically for
+ projects that generate DLLs.
+
+ Removing manifest embedding for application executables can be done with
+ the following assignment to the \l{qmake Variable Reference#CONFIG}
+ {CONFIG} variable:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 22
+
+ Also, the manifest embedding for DLLs can be removed with the following
+ assignment to the \l{qmake Variable Reference#CONFIG}{CONFIG} variable:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 23
+
+ This is discussed in more detail in the
+ \l{Deploying an Application on Windows#Visual Studio 2005 Onwards}
+ {deployment guide for Windows}.
+
+
+ \section1 S60
+
+ Features specific to this platform include handling of static data,
+ capabilities, stack and heap size, compiler specific options, and unique
+ identifiers for the application or library.
+
+ \section2 Handling of static data
+
+ If the application uses any static data, the build system needs to be
+ informed about it. This is because Symbian tries to save memory if no
+ static data is in use.
+
+ To specify that static data support is desired, add this to the project file:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 129
+
+ The default value is zero.
+
+ \section2 Stack and heap size
+
+ Symbian uses predefined sizes for stacks and heaps. If an
+ application exceeds either limit, it may crash or fail to complete its
+ task. Crashes that seem to have no reason can often be traced back to
+ insufficient stack and/or heap sizes.
+
+ The stack size has a maximum value, whereas the heap size has a
+ minimum and a maximum value, all specified in bytes. The minimum value
+ prevents the application from starting if that amount of memory is not available. The
+ minimum and maximum values are separated by a space. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 130
+
+ The default values depend on the version of the S60 SDK you're using.
+
+ \section2 Compiler specific options
+
+ General compiler options can as usual be set using \c QMAKE_CFLAGS and \c QMAKE_CXXFLAGS.
+ In order to set specific compiler options, \c QMAKE_CFLAGS.<compiler> and
+ \c QMAKE_CXXFLAGS.<compiler> can be used. \c <compiler> can be either \c CW for the WINSCW
+ architecture (emulator), or \c ARMCC for the ARMv5 architecture (hardware).
+
+ Here is an example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 131
+
+ \section2 Unique identifiers
+
+ Symbian applications may have unique identifiers attached to them.
+ Here is how to define them in a project file:
+
+ There are four types of IDs supported: \c UID2, \c UID3, \c SID, and \c VID. They
+ are specified like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 132
+
+ If \c UID2 is not specified, it defaults to the same value as \c UID3.
+ If \c UID3 is not specified, qmake will automatically generate a \c UID3
+ suitable for development and debugging. This value should be manually
+ specified for applications that are to be released. In order to optain
+ an official UID, please contact Nokia. Both \c SID and \c VID default to empty values.
+
+ For more information about unique identifiers and their meaning for
+ Symbian applications, please refer to the
+ \l{http://www.symbian.com/developer/techlib/v9.2docs/doc_source/ToolsAndUtilities/BuildTools/UsingUids.guide.html}{respective S60 SDK documentation}.
+
+ \section2 Capabilities
+
+ Capabilities define extra priviledges for the application, such as the
+ ability to list all files on the file system. Capabilities are defined
+ in the project file like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 133
+
+ It is also possible to specify which capabilities \e not to have,
+ by first specifying \c ALL and then list the unwanted capabilities
+ with a minus in front of them, like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 134
+
+ For more information about capabilities, please refer to the
+ \l{http://www.symbian.com/developer/techlib/v9.2docs/doc_source/guide/platsecsdk/index.html}{respective S60 SDK documentation}.
+*/
+
+/*!
+ \page qmake-reference.html
+ \title qmake Reference
+ \contentspage {qmake Manual}{Contents}
+ \previouspage Using Precompiled Headers
+ \nextpage qmake Variable Reference
+
+ This reference is a detailed index of all the variables and function
+ that are available for use in \c qmake project files.
+
+ \section1 Variable Reference
+
+ The \l{qmake Variable Reference} describes the variables that are
+ recognized by \c qmake when configuring the build process for
+ projects.
+
+ \section1 Function Reference
+
+ The \l{qmake Function Reference} describes the function that can be
+ used to process the contents of variables defined in project files.
+
+ \target FrequentlyUsedVariables
+ \section1 Frequently Used Variables
+
+ The following variables are frequently used in project files to describe
+ common aspects of the build process. These are fully described in the
+ \l{qmake-variable-reference.html}{Variable Reference}.
+
+ \list
+ \o \l{qmake Variable Reference#CONFIG}{CONFIG}
+ \o \l{qmake Variable Reference#DEF_FILE}{DEF_FILE}
+ \o \l{qmake Variable Reference#DEFINES}{DEFINES}
+ \o \l{qmake Variable Reference#DESTDIR}{DESTDIR}
+ \o \l{qmake Variable Reference#DISTFILES}{DISTFILES}
+ \o \l{qmake Variable Reference#DLLDESTDIR}{DLLDESTDIR}
+ \o \l{qmake Variable Reference#FORMS}{FORMS}
+ \o \l{qmake Variable Reference#FORMS3}{FORMS3}
+ \o \l{qmake Variable Reference#GUID}{GUID}
+ \o \l{qmake Variable Reference#HEADERS}{HEADERS}
+ \o \l{qmake Variable Reference#INCLUDEPATH}{INCLUDEPATH}
+ \o \l{qmake Variable Reference#LEXSOURCES}{LEXSOURCES}
+ \o \l{qmake Variable Reference#LIBS}{LIBS}
+ \o \l{qmake Variable Reference#MOC_DIR}{MOC_DIR}
+ \o \l{qmake Variable Reference#OBJECTS_DIR}{OBJECTS_DIR}
+ \o \l{qmake Variable Reference#QT}{QT}
+ \o \l{qmake Variable Reference#RCC_DIR}{RCC_DIR}
+ \o \l{qmake Variable Reference#REQUIRES}{REQUIRES}
+ \o \l{qmake Variable Reference#RESOURCES}{RESOURCES}
+ \o \l{qmake Variable Reference#SOURCES}{SOURCES}
+ \o \l{qmake Variable Reference#SUBDIRS}{SUBDIRS}
+ \o \l{qmake Variable Reference#TARGET}{TARGET}
+ \o \l{qmake Variable Reference#TEMPLATE}{TEMPLATE}
+ \o \l{qmake Variable Reference#TRANSLATIONS}{TRANSLATIONS}
+ \o \l{qmake Variable Reference#UI_DIR}{UI_DIR}
+ \o \l{qmake Variable Reference#UI_HEADERS_DIR}{UI_HEADERS_DIR}
+ \o \l{qmake Variable Reference#UI_SOURCES_DIR}{UI_SOURCES_DIR}
+ \o \l{qmake Variable Reference#VERSION}{VERSION}
+ \o \l{qmake Variable Reference#YACCSOURCES}{YACCSOURCES}
+ \endlist
+
+ \section1 Environment Variables and Configuration
+
+ The \l{Configuring qmake's Environment} chapter of this manual
+ describes the environment variables that \c qmake uses when
+ configuring the build process.
+*/
+
+/*!
+ \page qmake-variable-reference.html
+ \title qmake Variable Reference
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Reference
+ \nextpage qmake Function Reference
+
+ \c{qmake}'s fundamental behavior is influenced by variable declarations that
+ define the build process of each project. Some of these declare resources,
+ such as headers and source files, that are common to each platform; others
+ are used to customize the behavior of compilers and linkers on specific
+ platforms.
+
+ Platform-specific variables follow the naming pattern of the
+ variables which they extend or modify, but include the name of the relevant
+ platform in their name. For example, \c QMAKE_LIBS can be used to specify a list
+ of libraries that a project needs to link against, and \c QMAKE_LIBS_X11 can be
+ used to extend or override this list.
+
+ \tableofcontents{3}
+
+ \target BLD_INF_RULES
+ \section1 BLD_INF_RULES
+
+ \e {This is only used on Symbian.}
+
+ Generic \c bld.inf file content can be specified with \c BLD_INF_RULES variables.
+ The section of \c bld.inf file where each rule goes is appended to
+ \c BLD_INF_RULES with a dot.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 146
+
+ This will add the specified statements to the \c prj_exports section of the
+ generated \c bld.inf file.
+
+ It is also possible to add multiple rows in a single block. Each double
+ quoted string will be placed on a new row in the generated \c bld.inf file.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 143
+
+ Any rules you define will be added after automatically generated
+ rules in each section.
+
+ \target CONFIG
+ \section1 CONFIG
+
+ The \c CONFIG variable specifies project configuration and
+ compiler options. The values will be recognized internally by
+ \c qmake and have special meaning. They are as follows.
+
+ These \c CONFIG values control compilation flags:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o release \o The project is to be built in release mode.
+ This is ignored if \c debug is also specified.
+ \row \o debug \o The project is to be built in debug mode.
+ \row \o debug_and_release \o The project is built in \e both debug and
+ release modes. This can have some unexpected side effects (see
+ below for more information).
+ \row \o build_all \o If \c debug_and_release is specified, the project is
+ built in both debug and release modes by default.
+ \row \o ordered \o When using the \c subdirs template, this option
+ specifies that the directories listed should be processed in the
+ order in which they are given.
+ \row \o precompile_header \o Enables support for the use of
+ \l{Using Precompiled Headers}{precompiled headers} in projects.
+ \row \o warn_on \o The compiler should output as many warnings as possible.
+ This is ignored if \c warn_off is specified.
+ \row \o warn_off \o The compiler should output as few warnings as possible.
+ \omit
+ \row \o qt_debug \o Specifies that the project should be built against
+ debug versions of the Qt libraries specified using the
+ \l{#QT}{QT} variable.
+ \row \o qt_release \o Specifies that the project should be built against
+ release versions of the Qt libraries specified using the
+ \l{#QT}{QT} variable.
+ \endomit
+ \endtable
+
+ Since the \c debug option overrides the \c release option when both are
+ defined in the \c CONFIG variable, it is necessary to use the
+ \c debug_and_release option if you want to allow both debug and release
+ versions of a project to be built. In such a case, the Makefile that
+ \c qmake generates includes a rule that builds both versions, and this can
+ be invoked in the following way:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 24
+
+ When linking a library, \c qmake relies on the underlying platform to know
+ what other libraries this library links against. However, if linking
+ statically, \c qmake will not get this information unless we use the following
+ \c CONFIG options:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o create_prl \o This option enables \c qmake to track these
+ dependencies. When this option is enabled, \c qmake will create a file
+ ending in \c .prl which will save meta-information about the library
+ (see \l{LibDepend}{Library Dependencies} for more info).
+ \row \o link_prl \o When this is enabled, \c qmake will process all
+ libraries linked to by the application and find their meta-information
+ (see \l{LibDepend}{Library Dependencies} for more info).
+ \endtable
+
+ Please note that \c create_prl is required when \e {building} a
+ static library, while \c link_prl is required when \e {using} a
+ static library.
+
+ On Windows (or if Qt is configured with \c{-debug_and_release}, adding the
+ \c build_all option to the \c CONFIG variable makes this rule the default
+ when building the project, and installation targets will be created for
+ both debug and release builds.
+
+ Additionally, adding \c debug_and_release to the \c CONFIG variable will
+ cause both \c debug and \c release to be defined in the contents of
+ \c CONFIG. When the project file is processed, the
+ \l{qmake Advanced Usage#Scopes}{scopes} that test for each value will be
+ processed for \e both debug and release modes. The \c{build_pass} variable
+ will be set for each of these mode, and you can test for this to perform
+ build-specific tasks. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 25
+
+ As a result, it may be useful to define mode-specific variables, such as
+ \l{#QMAKE_LFLAGS_RELEASE}{QMAKE_LFLAGS_RELEASE}, instead of general
+ variables, such as \l{#QMAKE_LFLAGS}{QMAKE_LFLAGS}, where possible.
+
+ The following options define the application/library type:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o qt \o The target is a Qt application/library and requires the Qt
+ library and header files. The proper include and library paths for the
+ Qt library will automatically be added to the project. This is defined
+ by default, and can be fine-tuned with the \c{\l{#qt}{QT}} variable.
+ \row \o thread \o The target is a multi-threaded application or library. The
+ proper defines and compiler flags will automatically be added to
+ the project.
+ \row \o x11 \o The target is a X11 application or library. The proper
+ include paths and libraries will automatically be added to the
+ project.
+ \row \o windows \o The target is a Win32 window application (app only). The
+ proper include paths, compiler flags and libraries will
+ automatically be added to the project.
+ \row \o console \o The target is a Win32 console application (app only). The
+ proper include paths, compiler flags and libraries will
+ automatically be added to the
+ project.
+ \row \o shared \o{1,3} The target is a shared object/DLL. The proper
+ include paths, compiler flags and libraries will automatically be
+ added to the project.
+ \row \o dll \o
+ \row \o dylib \o
+ \row \o static \o{1,2} The target is a static library (lib only). The proper
+ compiler flags will automatically be added to the project.
+ \row \o staticlib \o
+ \row \o plugin \o The target is a plugin (lib only). This enables dll as well.
+ \row \o designer \o The target is a plugin for \QD.
+ \row \o uic3 \o Configures qmake to run uic3 on the content of \c FORMS3 if
+ defined; otherwise the contents of \c FORMS will be processed instead.
+ \row \o no_lflags_merge \o Ensures that the list of libraries stored in the
+ \c LIBS variable is not reduced to a list of unique values before it is used.
+ \row \o resources \o Configures qmake to run rcc on the content of \c RESOURCES
+ if defined.
+ \endtable
+
+ These options are used to set the compiler flags:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o 3dnow \o AMD 3DNow! instruction support is enabled.
+ \row \o exceptions \o Exception support is enabled.
+ \row \o mmx \o Intel MMX instruction support is enabled.
+ \row \o rtti \o RTTI support is enabled.
+ \row \o stl \o STL support is enabled.
+ \row \o sse \o SSE support is enabled.
+ \row \o sse2 \o SSE2 support is enabled.
+ \endtable
+
+ These options define specific features on Windows only:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o flat \o When using the vcapp template this will put all the source
+ files into the source group and the header files into the header group
+ regardless of what directory they reside in. Turning this
+ option off will group the files within the source/header group depending
+ on the directory they reside. This is turned on by default.
+ \row \o embed_manifest_dll \o Embeds a manifest file in the DLL created
+ as part of a library project.
+ \row \o embed_manifest_exe \o Embeds a manifest file in the DLL created
+ as part of an application project.
+ \row \o incremental \o Used to enable or disable incremental linking in Visual
+ C++, depending on whether this feature is enabled or disabled by default.
+ \endtable
+
+ See \l{qmake Platform Notes#Visual Studio 2005 Manifest Files}{qmake Platform Notes}
+ for more information on the options for embedding manifest files.
+
+ These options only have an effect on Mac OS X:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o ppc \o Builds a PowerPC binary.
+ \row \o x86 \o Builds an i386 compatible binary.
+ \row \o app_bundle \o Puts the executable into a bundle (this is the default).
+ \row \o lib_bundle \o Puts the library into a library bundle.
+ \endtable
+
+ The build process for bundles is also influenced by
+ the contents of the \l{#QMAKE_BUNDLE_DATA}{QMAKE_BUNDLE_DATA} variable.
+
+ These options only have an effect on Symbian:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o stdbinary \o Builds an Open C binary (i.e. STDDLL, STDEXE, or STDLIB,
+ depending on the target binary type.)
+ \row \o no_icon \o Doesn't generate resources needed for displaying an icon
+ for executable in application menu (app only).
+ \row \o symbian_test \o Places mmp files and extension makefiles under
+ test sections in generated bld.inf instead of their regular sections.
+ Note that this only affects automatically generated bld.inf content;
+ the content added via \c BLD_INF_RULES variable is not affected.
+ \endtable
+
+ These options have an effect on Linux/Unix platforms:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o largefile \o Includes support for large files.
+ \row \o separate_debug_info \o Puts debugging information for libraries in
+ separate files.
+ \endtable
+
+ The \c CONFIG variable will also be checked when resolving scopes. You may
+ assign anything to this variable.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 26
+
+ \target DEFINES
+ \section1 DEFINES
+
+ \c qmake adds the values of this variable as compiler C
+ preprocessor macros (-D option).
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 27
+
+ \target DEF_FILE
+ \section1 DEF_FILE
+
+ \e {This is only used on Windows when using the \c app template}.
+
+ Specifies a \c .def file to be included in the project.
+
+ \target DEPENDPATH
+ \section1 DEPENDPATH
+
+ This variable contains the list of all directories to look in to
+ resolve dependencies. This will be used when crawling through
+ \c included files.
+
+ \target DEPLOYMENT
+ \section1 DEPLOYMENT
+
+ \e {This is only used on Windows CE and Symbian.}
+
+ Specifies which additional files will be deployed. Deployment means the
+ transfer of files from the development system to the target device or
+ emulator.
+
+ Files can be deployed by either creating a Visual Studio project or using
+ the \l {Using QTestLib remotely on Windows CE}{cetest} executable.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 28
+
+ This will upload all PNG images in \c path to the same directory your
+ build target will be deployed to.
+
+ The default deployment target path for Windows CE is
+ \c{%CSIDL_PROGRAM_FILES%\target}, which usually gets expanded to
+ \c{\Program Files\target}. For Symbian, the default target is the application
+ private directory on the drive it is installed to.
+
+ It is also possible to specify multiple \c sources to be deployed on
+ target \c paths. In addition, different variables can be used for
+ deployment to different directories.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 29
+
+ \note In Windows CE all linked Qt libraries will be deployed to the path
+ specified by \c{myFiles.path}. In Symbian all libraries and executables
+ will always be deployed to the \\sys\\bin of the installation drive.
+
+ Since the Symbian build system automatically moves binaries to certain
+ directories under the epoc32 directory, custom plugins, executables or
+ dynamically loadable libraries need special handling. When deploying
+ extra executables or dynamically loadable libraries, the target path
+ must specify \\sys\\bin. For plugins, the target path must specify the
+ location where the plugin stub will be deployed to (see the
+ \l{How to Create Qt Plugins} document for more information about plugins).
+ If the binary cannot be found from the indicated source path,
+ the directory Symbian build process moves the executables to is
+ searched, e.g. \\epoc32\\release\\armv5\\urel.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 128
+
+ In Symbian, generic PKG file content can also be specified with this
+ variable. You can use either \c pkg_prerules or \c pkg_postrules to
+ pass raw data to PKG file. The strings in \c pkg_prerules are added before
+ package-body and \c pkg_postrules after. The strings defined in
+ \c pkg_postrules or \c pkg_prerules are not parsed by qmake, so they
+ should be in a format understood by Symbian package generation tools.
+ Please consult Symbian documentation for correct syntax.
+
+ For example, to deploy DLL and add a new dependency:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 140
+
+ Please note that \c pkg_prerules can also replace default statements in
+ pkg file. If no pkg_prerules is defined, qmake makes sure that PKG file
+ syntax is correct and it contains all mandatory statements such as:
+
+ \list
+ \o languages, for example \BR
+ &EN,FR
+ \o package-header, for example \BR
+ #{"MyApp-EN", "MyApp-FR"}, (0x1000001F), 1, 2, 3, TYPE=SA
+ \o localized and unique vendor, for example \BR
+ %{"Vendor-EN", ..., "Vendor-FR"}
+ :"Unique vendor name"
+ \endlist
+
+ If you decide to override any of these statements, you need to pay
+ attention that also other statements stay valid. For example if you
+ override languages statement, you must override also package-header
+ statement and all other statements which are language specific.
+
+ In Symbian, the \c default_deployment item specifies
+ default platform dependencies. It can be overwritten if a more
+ restrictive set is needed - e.g. if a specific
+ device is required to run the application.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 141
+
+ \target DEPLOYMENT_PLUGIN
+ \section1 DEPLOYMENT_PLUGIN
+
+ \e {This is only used on Windows CE and Symbian.}
+
+ This variable specifies the Qt plugins that will be deployed. All plugins
+ available in Qt can be explicitly deployed to the device. See
+ \l{Static Plugins}{Static Plugins} for a complete list.
+
+ \note In Windows CE, No plugins will be deployed automatically.
+ If the application depends on plugins, these plugins have to be specified
+ manually.
+
+ \note In Symbian, all plugins supported by this variable will be deployed
+ by default with Qt libraries, so generally using this variable is not
+ needed.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 142
+
+ This will upload the jpeg imageformat plugin to the plugins directory
+ on the Windows CE device.
+
+ \target DESTDIR
+ \section1 DESTDIR
+
+ Specifies where to put the \l{#TARGET}{target} file.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 30
+
+ \target DESTDIR_TARGET
+ \section1 DESTDIR_TARGET
+
+ This variable is set internally by \c qmake, which is basically the
+ \c DESTDIR variable with the \c TARGET variable appened at the end.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target DLLDESTDIR
+ \section1 DLLDESTDIR
+
+ Specifies where to copy the \l{#TARGET}{target} dll.
+
+ \target DISTFILES
+ \section1 DISTFILES
+
+ This variable contains a list of files to be included in the dist
+ target. This feature is supported by UnixMake specs only.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 31
+
+ \target DSP_TEMPLATE
+ \section1 DSP_TEMPLATE
+
+ This variable is set internally by \c qmake, which specifies where the
+ dsp template file for basing generated dsp files is stored. The value
+ of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target FORMS
+ \section1 FORMS
+
+ This variable specifies the UI files (see \link
+ designer-manual.html Qt Designer \endlink) to be processed through \c uic
+ before compiling. All dependencies, headers and source files required
+ to build these UI files will automatically be added to the project.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 32
+
+ If FORMS3 is defined in your project, then this variable must contain
+ forms for uic, and not uic3. If CONFIG contains uic3, and FORMS3 is not
+ defined, the this variable must contain only uic3 type forms.
+
+ \target FORMS3
+ \section1 FORMS3
+
+ This variable specifies the old style UI files to be processed
+ through \c uic3 before compiling, when \c CONFIG contains uic3.
+ All dependencies, headers and source files required to build these
+ UI files will automatically be added to the project.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 33
+
+ \target GUID
+ \section1 GUID
+
+ Specifies the GUID that is set inside a \c{.vcproj} file. The GUID is
+ usually randomly determined. However, should you require a fixed GUID,
+ it can be set using this variable.
+
+ This variable is specific to \c{.vcproj} files only; it is ignored
+ otherwise.
+
+ \target HEADERS
+ \section1 HEADERS
+
+ Defines the header files for the project.
+
+ \c qmake will generate dependency information (unless \c -nodepend
+ is specified on the \l{Running qmake#Commands}{command line})
+ for the specified headers. \c qmake will also automatically detect if
+ \c moc is required by the classes in these headers, and add the
+ appropriate dependencies and files to the project for generating and
+ linking the moc files.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 34
+
+ See also \l{#SOURCES}{SOURCES}.
+
+ \target ICON
+ \section1 ICON
+
+ This variable is used only in MAC and S60 to set the application icon.
+ Please see \l{Setting the Application Icon}{the application icon documentation}
+ for more information.
+
+ \target INCLUDEPATH
+ \section1 INCLUDEPATH
+
+ This variable specifies the #include directories which should be
+ searched when compiling the project. Use ';' or a space as the
+ directory separator.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 35
+
+ To specify a path containing spaces, quote the path using the technique
+ mentioned in the \l{qmake Project Files#Whitespace}{qmake Project Files}
+ document. For example, paths with spaces can be specified on Windows
+ and Unix platforms by using the \l{qmake Function Reference#quote-string}{quote()}
+ function in the following way:
+
+ \snippet doc/src/snippets/qmake/spaces.pro quoting include paths with spaces
+
+ \target INSTALLS
+ \section1 INSTALLS
+
+ This variable contains a list of resources that will be installed when
+ \c{make install} or a similar installation procedure is executed. Each
+ item in the list is typically defined with attributes that provide
+ information about where it will be installed.
+
+ For example, the following \c{target.path} definition describes where the
+ build target will be installed, and the \c INSTALLS assignment adds the
+ build target to the list of existing resources to be installed:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 36
+
+ \target LEXIMPLS
+ \section1 LEXIMPLS
+
+ This variable contains a list of lex implementation files. The value
+ of this variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely
+ needs to be modified.
+
+ \target LEXOBJECTS
+ \section1 LEXOBJECTS
+
+ This variable contains the names of intermediate lex object
+ files.The value of this variable is typically handled by
+ \c qmake and rarely needs to be modified.
+
+ \target LEXSOURCES
+ \section1 LEXSOURCES
+
+ This variable contains a list of lex source files. All
+ dependencies, headers and source files will automatically be added to
+ the project for building these lex files.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 37
+
+ \target LIBS
+ \section1 LIBS
+
+ This variable contains a list of libraries to be linked into the project.
+ You can use the Unix \c -l (library) and -L (library path) flags and qmake
+ will do the correct thing with these libraries on Windows and Symbian
+ (namely this means passing the full path of the library to the linker). The
+ only limitation to this is the library must exist, for qmake to find which
+ directory a \c -l lib lives in.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 38
+
+ To specify a path containing spaces, quote the path using the technique
+ mentioned in the \l{qmake Project Files#Whitespace}{qmake Project Files}
+ document. For example, paths with spaces can be specified on Windows
+ and Unix platforms by using the \l{qmake Function Reference#quote-string}{quote()}
+ function in the following way:
+
+ \snippet doc/src/snippets/qmake/spaces.pro quoting library paths with spaces
+
+ \bold{Note:} On Windows, specifying libraries with the \c{-l} option,
+ as in the above example, will cause the library with the highest version
+ number to be used; for example, \c{libmath2.lib} could potentially be used
+ instead of \c{libmathlib}. To avoid this ambiguity, we recommend that you
+ explicitly specify the library to be used by including the \c{.lib}
+ file name suffix.
+
+ \bold{Note:} On S60, the build system makes a distinction between shared and
+ static libraries. In most cases, qmake will figure out which library you
+ are refering to, but in some cases you may have to specify it explicitly to
+ get the expected behavior. This typically happens if you are building a
+ library and using it in the same project. To specify that the library is
+ either shared or static, add a ".dll" or ".lib" suffix, respectively, to the
+ library name.
+
+ By default, the list of libraries stored in \c LIBS is reduced to a list of
+ unique names before it is used. To change this behavior, add the
+ \c no_lflags_merge option to the \c CONFIG variable:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 39
+
+ \target LITERAL_HASH
+ \section1 LITERAL_HASH
+
+ This variable is used whenever a literal hash character (\c{#}) is needed in
+ a variable declaration, perhaps as part of a file name or in a string passed
+ to some external application.
+
+ For example:
+
+ \snippet doc/src/snippets/qmake/comments.pro 1
+
+ By using \c LITERAL_HASH in this way, the \c # character can be used
+ to construct a URL for the \c message() function to print to the console.
+
+ \target MAKEFILE
+ \section1 MAKEFILE
+
+ This variable specifies the name of the Makefile which
+ \c qmake should use when outputting the dependency information
+ for building a project. The value of this variable is typically
+ handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target MAKEFILE_GENERATOR
+ \section1 MAKEFILE_GENERATOR
+
+ This variable contains the name of the Makefile generator to use
+ when generating a Makefile. The value of this variable is typically
+ handled internally by \c qmake and rarely needs to be modified.
+
+ \target MMP_RULES
+ \section1 MMP_RULES
+
+ \e {This is only used on Symbian.}
+
+ Generic MMP file content can be specified with this variable.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 137
+
+ This will add the specified statement to the end of the generated MMP file.
+
+ It is also possible to add multiple rows in a single block. Each double
+ quoted string will be placed on a new row in the generated MMP file.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 138
+
+ If you need to include a hash (\c{#}) character inside the
+ \c MMP_RULES statement, it can be done with the variable
+ \c LITERAL_HASH as follows:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 139
+
+ \note You should not use this variable to add MMP statements that are
+ explicitly supported by their own variables, such as
+ \c TARGET.EPOCSTACKSIZE.
+ Doing so could result in duplicate statements in the MMP file.
+
+ \target MOC_DIR
+ \section1 MOC_DIR
+
+ This variable specifies the directory where all intermediate moc
+ files should be placed.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 40
+
+ \target OBJECTS
+ \section1 OBJECTS
+
+ This variable is generated from the \link #SOURCES SOURCES
+ \endlink variable. The extension of each source file will have been
+ replaced by .o (Unix) or .obj (Win32). The value of this variable is
+ typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and
+ rarely needs to be modified.
+
+ \target OBJECTS_DIR
+ \section1 OBJECTS_DIR
+
+ This variable specifies the directory where all intermediate
+ objects should be placed.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 41
+
+ \target OBJMOC
+ \section1 OBJMOC
+
+ This variable is set by \c qmake if files can be found that
+ contain the Q_OBJECT macro. \c OBJMOC contains the
+ name of all intermediate moc object files. The value of this variable
+ is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \target POST_TARGETDEPS
+ \section1 POST_TARGETDEPS
+
+ All libraries that the \l{#TARGET}{target} depends on can be
+ listed in this variable. Some backends do not support this, these include
+ MSVC Dsp, and ProjectBuilder .pbproj files. Generally this is supported
+ internally by these build tools, this is useful for explicitly listing
+ dependant static libraries.
+
+ This list will go after all builtin (and \link #PRE_TARGETDEPS
+ $$PRE_TARGETDEPS \endlink) dependencies.
+
+ \target PRE_TARGETDEPS
+ \section1 PRE_TARGETDEPS
+
+ All libraries that the \l{#TARGET}{target} depends on can be
+ listed in this variable. Some backends do not support this, these include
+ MSVC Dsp, and ProjectBuilder .pbproj files. Generally this is supported
+ internally by these build tools, this is useful for explicitly listing
+ dependant static libraries.
+
+ This list will go before all builtin dependencies.
+
+ \target PRECOMPILED_HEADER
+ \section1 PRECOMPILED_HEADER
+
+ This variable indicates the header file for creating a precompiled
+ header file, to increase the compilation speed of a project.
+ Precompiled headers are currently only supported on some platforms
+ (Windows - all MSVC project types, Mac OS X - Xcode, Makefile,
+ Unix - gcc 3.3 and up).
+
+ On other platforms, this variable has different meaning, as noted
+ below.
+
+ This variable contains a list of header files that require some
+ sort of pre-compilation step (such as with moc). The value of this
+ variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \target PWD
+ \section1 PWD
+
+ This variable contains the full path leading to the directory where
+ the \c qmake project file (project.pro) is located.
+
+ \target OUT_PWD
+ \section1 OUT_PWD
+
+ This variable contains the full path leading to the directory where
+ \c qmake places the generated Makefile.
+
+ \target QMAKE_systemvariable
+ \section1 QMAKE
+
+ This variable contains the name of the \c qmake program
+ itself and is placed in generated Makefiles. The value of this
+ variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \target QMAKESPEC_systemvariable
+ \section1 QMAKESPEC
+
+ This variable contains the name of the \c qmake
+ configuration to use when generating Makefiles. The value of this
+ variable is typically handled by \c qmake and rarely needs to be modified.
+
+ Use the \c{QMAKESPEC} environment variable to override the \c qmake configuration.
+ Note that, due to the way \c qmake reads project files, setting the \c{QMAKESPEC}
+ environment variable from within a project file will have no effect.
+
+ \target QMAKE_APP_FLAG
+ \section1 QMAKE_APP_FLAG
+
+ This variable is empty unless the \c app
+ \l{#TEMPLATE}{TEMPLATE} is specified. The value of this
+ variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified. Use the following instead:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 42
+
+ \target QMAKE_APP_OR_DLL
+ \section1 QMAKE_APP_OR_DLL
+
+ This variable is empty unless the \c app or \c dll
+ \l{#TEMPLATE}{TEMPLATE} is specified. The value of this
+ variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \target QMAKE_AR_CMD
+ \section1 QMAKE_AR_CMD
+
+ \e {This is used on Unix platforms only.}
+
+ This variable contains the command for invoking the program which
+ creates, modifies and extracts archives. The value of this variable is
+ typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf}
+ and rarely needs to be modified.
+
+ \target QMAKE_BUNDLE_DATA
+ \section1 QMAKE_BUNDLE_DATA
+
+ This variable is used to hold the data that will be installed with a library
+ bundle, and is often used to specify a collection of header files.
+
+ For example, the following lines add \c path/to/header_one.h
+ and \c path/to/header_two.h to a group containing information about the
+ headers supplied with the framework:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 43
+
+ The last line adds the information about the headers to the collection of
+ resources that will be installed with the library bundle.
+
+ Library bundles are created when the \c lib_bundle option is added to the
+ \l{#CONFIG}{CONFIG} variable.
+
+ See \l{qmake Platform Notes#Creating Frameworks}{qmake Platform Notes} for
+ more information about creating library bundles.
+
+ \e{This is used on Mac OS X only.}
+
+ \section1 QMAKE_BUNDLE_EXTENSION
+
+ This variable defines the extension to be used for library bundles.
+ This allows frameworks to be created with custom extensions instead of the
+ standard \c{.framework} directory name extension.
+
+ For example, the following definition will result in a framework with the
+ \c{.myframework} extension:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 44
+
+ \e{This is used on Mac OS X only.}
+
+ \section1 QMAKE_CC
+
+ This variable specifies the C compiler that will be used when building
+ projects containing C source code. Only the file name of the compiler
+ executable needs to be specified as long as it is on a path contained
+ in the \c PATH variable when the Makefile is processed.
+
+ \target QMAKE_CFLAGS_DEBUG
+ \section1 QMAKE_CFLAGS_DEBUG
+
+ This variable contains the flags for the C compiler in debug mode.The value of this variable is
+ typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf}
+ and rarely needs to be modified.
+
+ \target QMAKE_CFLAGS_MT
+ \section1 QMAKE_CFLAGS_MT
+
+ This variable contains the compiler flags for creating a
+ multi-threaded application or when the version of Qt that you link
+ against is a multi-threaded statically linked library. The value of
+ this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_CFLAGS_MT_DBG
+ \section1 QMAKE_CFLAGS_MT_DBG
+
+ This variable contains the compiler flags for creating a debuggable
+ multi-threaded application or when the version of Qt that you link
+ against is a debuggable multi-threaded statically linked library. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_CFLAGS_MT_DLL
+ \section1 QMAKE_CFLAGS_MT_DLL
+
+ \e {This is used on Windows only.}
+
+ This variable contains the compiler flags for creating a
+ multi-threaded dll or when the version of Qt that you link
+ against is a multi-threaded dll. The value of this variable is typically
+ handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and
+ rarely needs to be modified.
+
+ \target QMAKE_CFLAGS_MT_DLLDBG
+ \section1 QMAKE_CFLAGS_MT_DLLDBG
+
+ \e {This is used on Windows only.}
+
+ This variable contains the compiler flags for creating a debuggable
+ multi-threaded dll or when the version of Qt that you link
+ against is a debuggable multi-threaded statically linked library.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_CFLAGS_RELEASE
+ \section1 QMAKE_CFLAGS_RELEASE
+
+ This variable contains the compiler flags for creating a non-debuggable
+ application. The value of this variable is typically
+ handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and
+ rarely needs to be modified.
+
+ \target QMAKE_CFLAGS_SHLIB
+ \section1 QMAKE_CFLAGS_SHLIB
+
+ \e {This is used on Unix platforms only.}
+
+ This variable contains the compiler flags for creating a shared
+ library. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CFLAGS_THREAD
+ \section1 QMAKE_CFLAGS_THREAD
+
+ This variable contains the compiler flags for creating a multi-threaded
+ application. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CFLAGS_WARN_OFF
+ \section1 QMAKE_CFLAGS_WARN_OFF
+
+ This variable is not empty if the warn_off
+ \l{#TEMPLATE}{TEMPLATE} option is specified. The value of this
+ variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf}
+ and rarely needs to be modified.
+
+ \target QMAKE_CFLAGS_WARN_ON
+ \section1 QMAKE_CFLAGS_WARN_ON
+
+ This variable is not empty if the warn_on
+ \l{#TEMPLATE}{TEMPLATE} option is specified.
+ The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CLEAN
+ \section1 QMAKE_CLEAN
+
+ This variable contains any files which are not generated files (such as moc and uic
+ generated files) and object files that should be removed when using "make clean".
+
+ \section1 QMAKE_CXX
+
+ This variable specifies the C++ compiler that will be used when building
+ projects containing C++ source code. Only the file name of the compiler
+ executable needs to be specified as long as it is on a path contained
+ in the \c PATH variable when the Makefile is processed.
+
+ \section1 QMAKE_CXXFLAGS
+
+ This variable contains the C++ compiler flags that are used when building
+ a project. The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. The flags
+ specific to debug and release modes can be adjusted by modifying
+ the \c QMAKE_CXXFLAGS_DEBUG and \c QMAKE_CXXFLAGS_RELEASE variables,
+ respectively.
+
+ \bold{Note:} On S60, this variable can be used to pass architecture specific
+ options to each compiler in the Symbian build system. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 131
+
+ For more information, see
+ \l{qmake Platform Notes#Compiler specific options}{qmake Platform Notes}.
+
+ \target QMAKE_CXXFLAGS_DEBUG
+ \section1 QMAKE_CXXFLAGS_DEBUG
+
+ This variable contains the C++ compiler flags for creating a debuggable
+ application. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CXXFLAGS_MT
+ \section1 QMAKE_CXXFLAGS_MT
+
+ This variable contains the C++ compiler flags for creating a multi-threaded
+ application. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CXXFLAGS_MT_DBG
+ \section1 QMAKE_CXXFLAGS_MT_DBG
+
+ This variable contains the C++ compiler flags for creating a debuggable multi-threaded
+ application. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CXXFLAGS_MT_DLL
+ \section1 QMAKE_CXXFLAGS_MT_DLL
+
+ \c {This is used on Windows only.}
+
+ This variable contains the C++ compiler flags for creating a multi-threaded
+ dll. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CXXFLAGS_MT_DLLDBG
+ \section1 QMAKE_CXXFLAGS_MT_DLLDBG
+
+ \c {This is used on Windows only.}
+
+ This variable contains the C++ compiler flags for creating a multi-threaded debuggable
+ dll. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CXXFLAGS_RELEASE
+ \section1 QMAKE_CXXFLAGS_RELEASE
+
+ This variable contains the C++ compiler flags for creating an
+ application. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CXXFLAGS_SHLIB
+ \section1 QMAKE_CXXFLAGS_SHLIB
+
+ This variable contains the C++ compiler flags for creating a
+ shared library. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CXXFLAGS_THREAD
+ \section1 QMAKE_CXXFLAGS_THREAD
+
+ This variable contains the C++ compiler flags for creating a
+ multi-threaded application. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs
+ to be modified.
+
+ \target QMAKE_CXXFLAGS_WARN_OFF
+ \section1 QMAKE_CXXFLAGS_WARN_OFF
+
+ This variable contains the C++ compiler flags for suppressing compiler warnings.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_CXXFLAGS_WARN_ON
+ \section1 QMAKE_CXXFLAGS_WARN_ON
+
+ This variable contains C++ compiler flags for generating compiler warnings.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_DISTCLEAN
+ \section1 QMAKE_DISTCLEAN
+
+ This variable removes extra files upon the invocation of \c{make distclean}.
+
+ \target QMAKE_EXTENSION_SHLIB
+ \section1 QMAKE_EXTENSION_SHLIB
+
+ This variable contains the extention for shared libraries. The value of this
+ variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf}
+ and rarely needs to be modified.
+
+ Note that platform-specific variables that change the extension will override
+ the contents of this variable.
+
+ \section1 QMAKE_EXT_MOC
+
+ This variable changes the extention used on included moc files.
+
+ See also \l{Configuring qmake's Environment#Extensions}{File Extensions}.
+
+ \section1 QMAKE_EXT_UI
+
+ This variable changes the extention used on /e Designer UI files.
+
+ See also \l{Configuring qmake's Environment#Extensions}{File Extensions}.
+
+ \section1 QMAKE_EXT_PRL
+
+ This variable changes the extention used on created PRL files.
+
+ See also \l{Configuring qmake's Environment#Extensions}{File Extensions},
+ \l{Configuring qmake's Environment#libdepend}{Library Dependencies}.
+
+ \section1 QMAKE_EXT_LEX
+
+ This variable changes the extention used on files given to lex.
+
+ See also \l{Configuring qmake's Environment#Extensions}{File Extensions},
+ \l{#LEXSOURCES}{LEXSOURCES}.
+
+ \section1 QMAKE_EXT_YACC
+ This variable changes the extention used on files given to yacc.
+
+ See also \l{Configuring qmake's Environment#Extensions}{File Extensions},
+ \l{#YACCSOURCES}{YACCSOURCES}.
+
+ \section1 QMAKE_EXT_OBJ
+
+ This variable changes the extention used on generated object files.
+
+ See also \l{Configuring qmake's Environment#Extensions}{File Extensions}.
+
+ \section1 QMAKE_EXT_CPP
+
+ This variable changes the interpretation of all suffixes in this
+ list of values as files of type C++ source code.
+
+ See also \l{Configuring qmake's Environment#Extensions}{File Extensions}.
+
+ \section1 QMAKE_EXT_H
+
+ This variable changes the interpretation of all suffixes in this
+ list of values as files of type C header files.
+
+ See also \l{Configuring qmake's Environment#Extensions}{File Extensions}.
+
+ \section1 QMAKE_EXTRA_COMPILERS
+
+ This variable contains the extra compilers/preprocessors that have been added
+
+ See also \l{Configuring qmake's Environment#Customizing}{Customizing Makefile Output}
+
+ \section1 QMAKE_EXTRA_TARGETS
+
+ This variable contains the extra targets that have been added
+
+ See also \l{Configuring qmake's Environment#Customizing}{Customizing Makefile Output}
+
+ \target QMAKE_FAILED_REQUIREMENTS
+ \section1 QMAKE_FAILED_REQUIREMENTS
+
+ This variable contains the list of requirements that were failed to be met when
+ \c qmake was used. For example, the sql module is needed and wasn't compiled into Qt. The
+ value of this variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf}
+ and rarely needs to be modified.
+
+ \target QMAKE_FILETAGS
+ \section1 QMAKE_FILETAGS
+
+ This variable contains the file tags needed to be entered into the Makefile, such as SOURCES
+ and HEADERS. The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_FRAMEWORK_BUNDLE_NAME
+
+ In a framework project, this variable contains the name to be used for the
+ framework that is built.
+
+ By default, this variable contains the same value as the \l{#TARGET}{TARGET}
+ variable.
+
+ See \l{qmake Platform Notes#Creating Frameworks}{qmake Platform Notes} for
+ more information about creating frameworks and library bundles.
+
+ \e{This is used on Mac OS X only.}
+
+ \target QMAKE_FRAMEWORK_VERSION
+ \section1 QMAKE_FRAMEWORK_VERSION
+
+ For projects where the build target is a Mac OS X framework, this variable
+ is used to specify the version number that will be applied to the framework
+ that is built.
+
+ By default, this variable contains the same value as the \l{#VERSION}{VERSION}
+ variable.
+
+ See \l{qmake Platform Notes#Creating Frameworks}{qmake Platform Notes} for
+ more information about creating frameworks.
+
+ \e{This is used on Mac OS X only.}
+
+ \target QMAKE_INCDIR
+ \section1 QMAKE_INCDIR
+
+ This variable contains the location of all known header files to be added to
+ INCLUDEPATH when building an application. The value of this variable is
+ typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely
+ needs to be modified.
+
+ \target QMAKE_INCDIR_EGL
+ \section1 QMAKE_INCDIR_EGL
+
+ This variable contains the location of EGL header files to be added
+ to INCLUDEPATH when building an application with OpenGL/ES or
+ OpenVG support. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_INCDIR_OPENGL
+ \section1 QMAKE_INCDIR_OPENGL
+
+ This variable contains the location of OpenGL header files to be added
+ to INCLUDEPATH when building an application with OpenGL support. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ If the OpenGL implementation uses EGL (most OpenGL/ES systems),
+ then QMAKE_INCDIR_EGL may also need to be set.
+
+ \target QMAKE_INCDIR_OPENVG
+ \section1 QMAKE_INCDIR_OPENVG
+
+ This variable contains the location of OpenVG header files to be added
+ to INCLUDEPATH when building an application with OpenVG support. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ If the OpenVG implementation uses EGL then QMAKE_INCDIR_EGL may also
+ need to be set.
+
+ \target QMAKE_INCDIR_QT
+ \section1 QMAKE_INCDIR_QT
+
+ This variable contains the location of all known header file
+ paths to be added to INCLUDEPATH when building a Qt application. The value
+ of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_INCDIR_THREAD
+ \section1 QMAKE_INCDIR_THREAD
+
+ This variable contains the location of all known header file
+ paths to be added to INCLUDEPATH when building a multi-threaded application.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_INCDIR_X11
+ \section1 QMAKE_INCDIR_X11
+
+ \e {This is used on Unix platforms only.}
+
+ This variable contains the location of X11 header file paths to be
+ added to INCLUDEPATH when building a X11 application. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target QMAKE_INFO_PLIST
+ \section1 QMAKE_INFO_PLIST
+
+ \e {This is used on Mac OS X platforms only.}
+
+ This variable contains the name of the property list file, \c{.plist}, you
+ would like to include in your Mac OS X application bundle.
+
+ In the \c{.plist} file, you can define some variables, e.g., @EXECUTABLE@,
+ which qmake will replace with the actual executable name. Other variables
+ include @ICON@, @TYPEINFO@, @LIBRARY@, and @SHORT_VERSION@.
+
+ \note Most of the time, the default \c{Info.plist} is good enough.
+
+ \section1 QMAKE_LFLAGS
+
+ This variable contains a general set of flags that are passed to
+ the linker. If you need to change the flags used for a particular
+ platform or type of project, use one of the specialized variables
+ for that purpose instead of this variable.
+
+ \target QMAKE_LFLAGS_CONSOLE
+ \section1 QMAKE_LFLAGS_CONSOLE
+
+ \e {This is used on Windows only.}
+
+ This variable contains link flags when building console
+ programs. The value of this variable is typically handled by
+ \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_CONSOLE_DLL
+
+ \e {This is used on Windows only.}
+
+ This variable contains link flags when building console
+ dlls. The value of this variable is typically handled by
+ \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_DEBUG
+
+ This variable contains link flags when building debuggable applications. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_PLUGIN
+
+ This variable contains link flags when building plugins. The value
+ of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_QT_DLL
+
+ This variable contains link flags when building programs that
+ use the Qt library built as a dll. The value of this variable is
+ typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_RELEASE
+
+ This variable contains link flags when building applications for
+ release. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_SHAPP
+
+ This variable contains link flags when building applications which are using
+ the \c app template. The value of this variable is typically handled by
+ \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_SHLIB
+
+ This variable contains link flags when building shared libraries
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_SONAME
+
+ This variable specifies the link flags to set the name of shared objects,
+ such as .so or .dll. The value of this variable is typically handled by \c
+ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_THREAD
+
+ This variable contains link flags when building multi-threaded projects.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_WINDOWS
+
+ \e {This is used on Windows only.}
+
+ This variable contains link flags when building Windows GUI projects
+ (i.e. non-console applications).
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LFLAGS_WINDOWS_DLL
+
+ \e {This is used on Windows only.}
+
+ This variable contains link flags when building Windows DLL projects.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBDIR
+
+ This variable contains the location of all known library
+ directories.The value of this variable is typically handled by
+ \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBDIR_FLAGS
+
+ \e {This is used on Unix platforms only.}
+
+ This variable contains the location of all library
+ directory with -L prefixed. The value of this variable is typically handled by
+ \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBDIR_EGL
+
+ This variable contains the location of the EGL library
+ directory, when EGL is used with OpenGL/ES or OpenVG. The value
+ of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBDIR_OPENGL
+
+ This variable contains the location of the OpenGL library
+ directory.The value of this variable is typically handled by
+ \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ If the OpenGL implementation uses EGL (most OpenGL/ES systems),
+ then QMAKE_LIBDIR_EGL may also need to be set.
+
+ \section1 QMAKE_LIBDIR_OPENVG
+
+ This variable contains the location of the OpenVG library
+ directory. The value of this variable is typically handled by
+ \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ If the OpenVG implementation uses EGL, then QMAKE_LIBDIR_EGL
+ may also need to be set.
+
+ \section1 QMAKE_LIBDIR_QT
+
+ This variable contains the location of the Qt library
+ directory.The value of this variable is typically handled by
+ \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBDIR_X11
+
+ \e {This is used on Unix platforms only.}
+
+ This variable contains the location of the X11 library
+ directory.The value of this variable is typically handled by
+ \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS
+
+ This variable contains all project libraries. The value of this
+ variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_CONSOLE
+
+ \e {This Windows-specific variable is no longer used.}
+
+ Prior to Qt 4.2, this variable was used to list the libraries
+ that should be linked against when building a console application
+ project on Windows. \l{#QMAKE_LIBS_WINDOW}{QMAKE_LIBS_WINDOW}
+ should now be used instead.
+
+ \section1 QMAKE_LIBS_EGL
+
+ This variable contains all EGL libraries when building Qt with
+ OpenGL/ES or OpenVG. The value of this variable is typically
+ handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely
+ needs to be modified. The usual value is \c{-lEGL}.
+
+ \section1 QMAKE_LIBS_OPENGL
+
+ This variable contains all OpenGL libraries. The value of this
+ variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ If the OpenGL implementation uses EGL (most OpenGL/ES systems),
+ then QMAKE_LIBS_EGL may also need to be set.
+
+ \section1 QMAKE_LIBS_OPENGL_QT
+
+ This variable contains all OpenGL Qt libraries.The value of this
+ variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_OPENVG
+
+ This variable contains all OpenVG libraries. The value of this
+ variable is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf}
+ and rarely needs to be modified. The usual value is \c{-lOpenVG}.
+
+ Some OpenVG engines are implemented on top of OpenGL. This will
+ be detected at configure time and QMAKE_LIBS_OPENGL will be implicitly
+ added to QMAKE_LIBS_OPENVG wherever the OpenVG libraries are linked.
+
+ If the OpenVG implementation uses EGL, then QMAKE_LIBS_EGL may also
+ need to be set.
+
+ \section1 QMAKE_LIBS_QT
+
+ This variable contains all Qt libraries.The value of this
+ variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_QT_DLL
+
+ \e {This is used on Windows only.}
+
+ This variable contains all Qt libraries when Qt is built as a dll. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_QT_OPENGL
+
+ This variable contains all the libraries needed to link against if
+ OpenGL support is turned on. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_QT_THREAD
+
+ This variable contains all the libraries needed to link against if
+ thread support is turned on. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_RT
+
+ \e {This is used with Borland compilers only.}
+
+ This variable contains the runtime library needed to link against when
+ building an application. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_RTMT
+
+ \e {This is used with Borland compilers only.}
+
+ This variable contains the runtime library needed to link against when
+ building a multi-threaded application. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_THREAD
+
+ \e {This is used on Unix platforms only.}
+
+ This variable contains all libraries that need to be linked against
+ when building a multi-threaded application. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_WINDOWS
+
+ \e {This is used on Windows only.}
+
+ This variable contains all windows libraries.The value of this
+ variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_X11
+
+ \e {This is used on Unix platforms only.}
+
+ This variable contains all X11 libraries.The value of this
+ variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIBS_X11SM
+
+ \e {This is used on Unix platforms only.}
+
+ This variable contains all X11 session management libraries. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LIB_FLAG
+
+ This variable is not empty if the \c lib template is specified. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_LINK_SHLIB_CMD
+
+ This variable contains the command to execute when creating a
+ shared library. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_POST_LINK
+
+ This variable contains the command to execute after linking the TARGET
+ together. This variable is normally empty and therefore nothing is
+ executed, additionally some backends will not support this - mostly only
+ Makefile backends.
+
+ \section1 QMAKE_PRE_LINK
+
+ This variable contains the command to execute before linking the TARGET
+ together. This variable is normally empty and therefore nothing is
+ executed, additionally some backends will not support this - mostly only
+ Makefile backends.
+
+ \section1 QMAKE_LN_SHLIB
+
+ This variable contains the command to execute when creating a link
+ to a shared library. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_MAC_SDK
+
+ This variable is used on Mac OS X when building universal binaries.
+ This process is described in more detail in the
+ \l{Deploying an Application on Mac OS X#Architecture Dependencies}{Deploying
+ an Application on Mac OS X} document.
+
+ \section1 QMAKE_MACOSX_DEPLOYMENT_TARGET
+ This variable only has an effect when building on Mac OS X. On that
+ platform, the variable will be forwarded to the MACOSX_DEPLOYMENT_TARGET
+ environment variable, which is interpreted by the compiler or linker.
+ For more information, see the
+ \l{Deploying an Application on Mac OS X#Mac OS X Version Dependencies}{Deploying
+ an Application on Mac OS X} document.
+
+ \section1 QMAKE_MAKEFILE
+
+ This variable contains the name of the Makefile to create. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_MOC_SRC
+
+ This variable contains the names of all moc source files to
+ generate and include in the project. The value of this variable is
+ typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_QMAKE
+
+ This variable contains the location of qmake if it is not in the path.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_QT_DLL
+
+ This variable is not empty if Qt was built as a dll. The
+ value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_RESOURCE_FLAGS
+
+ This variable is used to customize the list of options passed to the
+ \l{rcc}{Resource Compiler} in each of the build rules where it is used.
+ For example, the following line ensures that the \c{-threshold} and
+ \c{-compress} options are used with particular values each time that
+ \c rcc is invoked:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 45
+
+ \section1 QMAKE_RUN_CC
+
+ This variable specifies the individual rule needed to build an object.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_RUN_CC_IMP
+
+ This variable specifies the individual rule needed to build an object.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_RUN_CXX
+
+ This variable specifies the individual rule needed to build an object.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_RUN_CXX_IMP
+
+ This variable specifies the individual rule needed to build an object.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_TARGET
+
+ This variable contains the name of the project target. The value of
+ this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 QMAKE_UIC
+
+ This variable contains the location of uic if it is not in the path.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ It can be used to specify arguments to uic as well, such as additional plugin
+ paths. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 46
+
+ \section1 QT
+
+ The values stored in the \c QT variable control which of the Qt modules are
+ used by your project.
+
+ The table below shows the options that can be used with the \c QT variable
+ and the features that are associated with each of them:
+
+ \table
+ \header \o Option \o Features
+ \row \o core (included by default) \o QtCore module
+ \row \o gui (included by default) \o QtGui module
+ \row \o network \o QtNetwork module
+ \row \o opengl \o QtOpenGL module
+ \row \o phonon \o Phonon Multimedia Framework
+ \row \o sql \o QtSql module
+ \row \o svg \o QtSvg module
+ \row \o xml \o QtXml module
+ \row \o webkit \o WebKit integration
+ \row \o qt3support \o Qt3Support module
+ \endtable
+
+ By default, \c QT contains both \c core and \c gui, ensuring that standard
+ GUI applications can be built without further configuration.
+
+ If you want to build a project \e without the QtGui module, you need to
+ exclude the \c gui value with the "-=" operator; the following line will
+ result in a minimal Qt project being built:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 47
+
+ Note that adding the \c opengl option to the \c QT variable automatically
+ causes the equivalent option to be added to the \c CONFIG variable.
+ Therefore, for Qt applications, it is not necessary to add the \c opengl
+ option to both \c CONFIG and \c{QT}.
+
+ \section1 QTPLUGIN
+
+ This variable contains a list of names of static plugins that are to be
+ compiled with an application so that they are available as built-in
+ resources.
+
+ \target QT_VERSION
+ \section1 QT_VERSION
+
+ This variable contains the current version of Qt.
+
+ \target QT_MAJOR_VERSION
+ \section1 QT_MAJOR_VERSION
+
+ This variable contains the current major version of Qt.
+
+ \target QT_MINOR_VERSION
+ \section1 QT_MINOR_VERSION
+
+ This variable contains the current minor version of Qt.
+
+ \target QT_PATCH_VERSION
+ \section1 QT_PATCH_VERSION
+
+ This variable contains the current patch version of Qt.
+
+ \section1 RC_FILE
+
+ This variable contains the name of the resource file for the application.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target RCC_DIR
+ \section1 RCC_DIR
+
+ This variable specifies the directory where all intermediate
+ resource files should be placed.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 48
+
+ \target REQUIRES
+ \section1 REQUIRES
+
+ This is a special variable processed by \c qmake. If the
+ contents of this variable do not appear in CONFIG by the time this
+ variable is assigned, then a minimal Makefile will be generated that
+ states what dependencies (the values assigned to REQUIRES) are
+ missing.
+
+ This is mainly used in Qt's build system for building the examples.
+
+ \section1 RESOURCES
+
+ This variable contains the name of the resource collection file (qrc)
+ for the application. Further information about the resource collection
+ file can be found at \l{The Qt Resource System}.
+
+ \section1 RES_FILE
+
+ This variable contains the name of the resource file for the application.
+ The value of this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target RSS_RULES
+ \section1 RSS_RULES
+
+ \e {This is only used on Symbian.}
+
+ Generic RSS file content can be specified with this variable. The syntax is
+ similar to \c MMP_RULES and \c BLD_INF_RULES.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 144
+
+ This will add the specified statement to the end of the generated
+ registration resource file. As an impact of this statement, the application
+ will not be visible in application shell.
+
+ It is also possible to add multiple rows in a single block. Each double
+ quoted string will be placed on a new row in the registration resource file.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 145
+
+ This example will install the application to MyFolder in S60 application
+ shell. In addition it will make the application to be launched in background.
+
+ For detailed list of possible RSS statements, please refer to Symbian OS help.
+
+ \note You should not use \c RSS_RULES variable to set the following RSS statements:
+
+ app_file
+ localisable_resource_file
+ localisable_resource_id
+
+ These statements are internally handled by qmake.
+
+ \target S60_VERSION
+ \section1 S60_VERSION
+
+ \e {This is only used on Symbian.}
+
+ Contains the version number of the underlying S60 SDK; e.g. "5.0".
+
+ \target SIGNATURE_FILE
+ \section1 SIGNATURE_FILE
+
+ \e {This is only used on Windows CE.}
+
+ Specifies which signature file should be used to sign the project target.
+
+ \note This variable will overwrite the setting you have specified in configure,
+ with the \c -signature option.
+
+ \target SOURCES
+ \section1 SOURCES
+
+ This variable contains the name of all source files in the project.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 49
+
+ See also \l{#HEADERS}{HEADERS}
+
+ \section1 SRCMOC
+
+ This variable is set by \c qmake if files can be found that
+ contain the Q_OBJECT macro. \c SRCMOC contains the
+ name of all the generated moc files. The value of this variable
+ is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \target SUBDIRS
+ \section1 SUBDIRS
+
+ This variable, when used with the \l{#TEMPLATE}{\c subdirs template}
+ contains the names of all subdirectories that contain parts of the project
+ that need be built. Each subdirectory must contain its own project file.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 50
+
+ It is essential that the project file in each subdirectory has the same
+ name as the subdirectory itself, so that \c qmake can find it.
+ For example, if the subdirectory is called \c myapp then the project file
+ in that directory should be called \c myapp.pro.
+
+ If you need to ensure that the subdirectories are built in the order in
+ which they are specified, update the \l{#CONFIG}{CONFIG} variable to
+ include the \c ordered option:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 51
+
+ \target TARGET
+ \section1 TARGET
+
+ This specifies the name of the target file.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 52
+
+ The project file above would produce an executable named \c myapp on
+ unix and 'myapp.exe' on windows.
+
+ \target TARGET.CAPABILITY
+ \section1 TARGET.CAPABILITY
+
+ \e {This is only used on Symbian.}
+
+ Specifies which platform capabilities the application should have. For more
+ information, please refer to the S60 SDK documentation.
+
+ \target TARGET.EPOCALLOWDLLDATA
+ \section1 TARGET.EPOCALLOWDLLDATA
+
+ \e {This is only used on Symbian.}
+
+ Specifies whether static data should be allowed in the application. Symbian
+ disallows this by default in order to save memory. To use it, set this to 1.
+
+ \target TARGET.EPOCHEAPSIZE
+ \section1 TARGET.EPOCHEAPSIZE
+
+ \e {This is only used on Symbian.}
+
+ Specifies the minimum and maximum heap size of the application. The program
+ will refuse to run if the minimum size is not available when it starts. For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 135
+
+ \target TARGET.EPOCSTACKSIZE
+ \section1 TARGET.EPOCSTACKSIZE
+
+ \e {This is only used on Symbian.}
+
+ Specifies the maximum stack size of the application. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 136
+
+ \target TARGET.SID
+ \section1 TARGET.SID
+
+ \e {This is only used on Symbian.}
+
+ Specifies which secure identifier to use for the target application or
+ library. For more information, see the S60 SDK documentation.
+
+ \target TARGET.UID2
+ \section1 TARGET.UID2
+
+ \e {This is only used on Symbian.}
+
+ Specifies which unique identifier 2 to use for the target application or
+ library. If this variable is not specified, it defaults to the same value
+ as TARGET.UID3. For more information, see the S60 SDK documentation.
+
+ \target TARGET.UID3
+ \section1 TARGET.UID3
+
+ \e {This is only used on Symbian.}
+
+ Specifies which unique identifier 3 to use for the target application or
+ library. If this variable is not specified, a UID3 suitable for development
+ and debugging will be generated automatically. However, applications being
+ released should always define this variable. For more information, see the
+ S60 SDK documentation.
+
+ \target TARGET.VID
+ \section1 TARGET.VID
+
+ \e {This is only used on Symbian.}
+
+ Specifies which vendor identifier to use for the target application or
+ library. For more information, see the S60 SDK documentation.
+
+ \section1 TARGET_EXT
+
+ This variable specifies the target's extension. The value of this variable
+ is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \section1 TARGET_x
+
+ This variable specifies the target's extension with a major version number. The value of this variable
+ is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \section1 TARGET_x.y.z
+
+ This variable specifies the target's extension with version number. The value of this variable
+ is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \target TEMPLATE
+ \section1 TEMPLATE
+
+ This variable contains the name of the template to use when
+ generating the project. The allowed values are:
+
+ \table
+ \header \o Option \o Description
+ \row \o app \o Creates a Makefile for building applications (the default). (See
+ \l{qmake Common Projects#Application}{qmake Common Projects} for more information.)
+ \row \o lib \o Creates a Makefile for building libraries. (See
+ \l{qmake Common Projects#Library}{qmake Common Projects} for more information.)
+ \row \o subdirs \o Creates a Makefile for building targets in subdirectories.
+ The subdirectories are specified using the \l{#SUBDIRS}{SUBDIRS}
+ variable.
+ \row \o vcapp \o \e {Windows only} Creates an application project for Visual Studio.
+ (See \l{qmake Platform Notes#Creating Visual Studio Project Files}{qmake Platform Notes}
+ for more information.)
+ \row \o vclib \o \e {Windows only} Creates a library project for Visual Studio.
+ (See \l{qmake Platform Notes#Creating Visual Studio Project Files}{qmake Platform Notes}
+ for more information.)
+ \endtable
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 53
+
+ The template can be overridden by specifying a new template type with the
+ \c -t command line option. This overrides the template type \e after the .pro
+ file has been processed. With .pro files that use the template type to
+ determine how the project is built, it is necessary to declare TEMPLATE on
+ the command line rather than use the \c -t option.
+
+ \section1 TRANSLATIONS
+
+ This variable contains a list of translation (.ts) files that contain
+ translations of the user interface text into non-native languages.
+
+ See the \l{Qt Linguist Manual} for more information about
+ internationalization (i18n) and localization (l10n) with Qt.
+
+ \section1 UICIMPLS
+
+ This variable contains a list of the generated implementation files by UIC.
+ The value of this variable
+ is typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be
+ modified.
+
+ \section1 UICOBJECTS
+
+ This variable is generated from the UICIMPLS variable. The extension of each
+ file will have been replaced by .o (Unix) or .obj (Win32). The value of this variable is
+ typically handled by \c qmake or \l{#QMAKESPEC}{qmake.conf} and
+ rarely needs to be modified.
+
+ \target UI_DIR
+ \section1 UI_DIR
+
+ This variable specifies the directory where all intermediate files from uic
+ should be placed. This variable overrides both UI_SOURCES_DIR and
+ UI_HEADERS_DIR.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 54
+
+ \target UI_HEADERS_DIR
+ \section1 UI_HEADERS_DIR
+
+ This variable specifies the directory where all declaration files (as
+ generated by uic) should be placed.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 55
+
+ \target UI_SOURCES_DIR
+ \section1 UI_SOURCES_DIR
+
+ This variable specifies the directory where all implementation files (as generated
+ by uic) should be placed.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 56
+
+ \target VERSION
+ \section1 VERSION
+
+ This variable contains the version number of the application or library if
+ either the \c app \l{#TEMPLATE}{TEMPLATE} or the \c lib \l{#TEMPLATE}{TEMPLATE}
+ is specified.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 57
+
+ \section1 VER_MAJ
+
+ This variable contains the major version number of the library, if the
+ \c lib \l{#TEMPLATE}{template} is specified.
+
+ \section1 VER_MIN
+
+ This variable contains the minor version number of the library, if the
+ \c lib \l{#TEMPLATE}{template} is specified.
+
+ \section1 VER_PAT
+
+ This variable contains the patch version number of the library, if the
+ \c lib \l{#TEMPLATE}{template} is specified.
+
+ \section1 VPATH
+
+ This variable tells \c qmake where to search for files it cannot
+ open. With this you may tell \c qmake where it may look for things
+ like SOURCES, and if it finds an entry in SOURCES that cannot be
+ opened it will look through the entire VPATH list to see if it can
+ find the file on its own.
+
+ See also \l{#DEPENDPATH}{DEPENDPATH}.
+
+ \section1 YACCIMPLS
+
+ This variable contains a list of yacc source files. The value of
+ this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \section1 YACCOBJECTS
+
+ This variable contains a list of yacc object files. The value of
+ this variable is typically handled by \c qmake or
+ \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified.
+
+ \target YACCSOURCES
+ \section1 YACCSOURCES
+
+ This variable contains a list of yacc source files to be included
+ in the project. All dependencies, headers and source files will
+ automatically be included in the project.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 58
+
+ \section1 _PRO_FILE_
+
+ This variable contains the path to the project file in use.
+
+ For example, the following line causes the location of the project
+ file to be written to the console:
+
+ \snippet doc/src/snippets/qmake/project_location.pro project file
+
+ \section1 _PRO_FILE_PWD_
+
+ This variable contains the path to the directory containing the project
+ file in use.
+
+ For example, the following line causes the location of the directory
+ containing the project file to be written to the console:
+
+ \snippet doc/src/snippets/qmake/project_location.pro project file directory
+*/
+
+/*!
+ \page qmake-function-reference.html
+ \title qmake Function Reference
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Variable Reference
+ \nextpage Configuring qmake's Environment
+
+ \c qmake provides built-in functions to allow the contents of
+ variables to be processed, and to enable tests to be performed
+ during the configuration process. Functions that process the
+ contents of variables typically return values that can be assigned
+ to other variables, and these values are obtained by prefixing
+ function with the \c $$ operator. Functions that perform tests
+ are usually used as the conditional parts of scopes; these are
+ indicated in the function descriptions below.
+
+ \tableofcontents{2}
+
+ \section1 basename(variablename)
+
+ Returns the basename of the file specified. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 59
+
+ \section1 CONFIG(config)
+ [Conditional]
+
+ This function can be used to test for variables placed into the
+ \c CONFIG variable. This is the same as regular old style (tmake) scopes,
+ but has the added advantage a second parameter can be passed to test for
+ the active config. As the order of values is important in \c CONFIG
+ variables (i.e. the last one set will be considered the active config for
+ mutually exclusive values) a second parameter can be used to specify a set
+ of values to consider. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 60
+
+ Because release is considered the active setting (for feature parsing)
+ it will be the CONFIG used to generate the build file. In the common
+ case a second parameter is not needed, but for specific mutual
+ exclusive tests it is invaluable.
+
+ \section1 contains(variablename, value)
+ [Conditional]
+
+ Succeeds if the variable \e variablename contains the value \e value;
+ otherwise fails. You can check the return value of this function using
+ a scope.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 61
+
+ The contents of the scope are only processed if the \c drivers
+ variable contains the value, \c network. If this is the case, the
+ appropriate files are added to the \c SOURCES and \c HEADERS
+ variables.
+
+ \section1 count(variablename, number)
+ [Conditional]
+
+ Succeeds if the variable \e variablename contains a list with the
+ specified \e number of value; otherwise fails.
+
+ This function is used to ensure that declarations inside a scope are
+ only processed if the variable contains the correct number of values;
+ for example:
+
+ \snippet doc/src/snippets/qmake/functions.pro 2
+
+ \section1 dirname(file)
+
+ Returns the directory name part of the specified file. For example:
+
+ \snippet doc/src/snippets/qmake/dirname.pro 0
+
+ \section1 error(string)
+
+ This function never returns a value. \c qmake displays the given
+ \e string to the user, and exits. This function should only be used
+ for unrecoverable errors.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 62
+
+ \section1 eval(string)
+ [Conditional]
+
+ Evaluates the contents of the string using \c qmake's syntax rules
+ and returns true.
+ Definitions and assignments can be used in the string to modify the
+ values of existing variables or create new definitions.
+
+ For example:
+ \snippet doc/src/snippets/qmake/functions.pro 4
+
+ Note that quotation marks can be used to delimit the string, and that
+ the return value can be discarded if it is not needed.
+
+ \section1 exists(filename)
+ [Conditional]
+
+ Tests whether a file with the given \e filename exists.
+ If the file exists, the function succeeds; otherwise it fails.
+ If a regular expression is specified for the filename, this function
+ succeeds if any file matches the regular expression specified.
+
+ For example:
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 63
+
+ Note that "/" can be used as a directory separator, regardless of the
+ platform in use.
+
+ \section1 find(variablename, substr)
+
+ Places all the values in \e variablename that match \e substr. \e
+ substr may be a regular expression, and will be matched accordingly.
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 64
+
+ MY_VAR2 will contain '-Lone -Ltwo -Lthree -Lfour -Lfive', and MY_VAR3 will
+ contains 'three two three'.
+
+ \section1 for(iterate, list)
+
+ This special test function will cause a loop to be started that
+ iterates over all values in \e list, setting \e iterate to each
+ value in turn. As a convenience, if \e list is 1..10 then iterate will
+ iterate over the values 1 through 10.
+
+ The use of an else scope afer a condition line with a for() loop is
+ disallowed.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 65
+
+ \section1 include(filename)
+ [Conditional]
+
+ Includes the contents of the file specified by \e filename into the
+ current project at the point where it is included. This function
+ succeeds if \e filename is included; otherwise it fails. The included
+ file is processed immediately.
+
+ You can check whether the file was included by using this function as
+ the condition for a scope; for example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 66
+
+ \section1 infile(filename, var, val)
+ [Conditional]
+
+ Succeeds if the file \e filename (when parsed by \c qmake itself)
+ contains the variable \e var with a value of \e val; otherwise fails.
+ If you do not specify a third argument (\e val), the function will
+ only test whether \e var has been declared in the file.
+
+ \section1 isEmpty(variablename)
+ [Conditional]
+
+ Succeeds if the variable \e variablename is empty; otherwise fails.
+ This is the equivalent of \c{count( variablename, 0 )}.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 67
+
+ \section1 join(variablename, glue, before, after)
+
+ Joins the value of \e variablename with \c glue. If this value is
+ non-empty it prefixes the value with \e before and suffix it with \e
+ after. \e variablename is the only required field, the others default
+ to empty strings. If you need to encode spaces in \e glue, \e before, or \e
+ after you must quote them.
+
+ \section1 member(variablename, position)
+
+ Returns the value at the given \e position in the list of items in
+ \e variablename.
+ If an item cannot be found at the position specified, an empty string is
+ returned. \e variablename is the only required field. If not specified,
+ \c position defaults to 0, causing the first value in the list to be
+ returned.
+
+ \section1 message(string)
+
+ This function simply writes a message to the console. Unlike the
+ \c error() function, this function allows processing to continue.
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 68
+
+ The above line causes "This is a message" to be written to the console.
+ The use of quotation marks is optional.
+
+ \note By default, messages are written out for each Makefile generated by
+ qmake for a given project. If you want to ensure that messages only appear
+ once for each project, test the \c build_pass variable
+ \l{qmake Advanced Usage}{in conjunction with a scope} to filter out
+ messages during builds; for example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 69
+
+ \section1 prompt(question)
+
+ Displays the specified \e question, and returns a value read from stdin.
+
+ \section1 quote(string)
+
+ Converts a whole \e string into a single entity and returns the result.
+ Newlines, carriage returns, and tabs can be specified in the string
+ with \\n \\r and \\t. The return value does not contain either single
+ or double quotation marks unless you explicitly include them yourself,
+ but will be placed into a single entry (for literal expansion).
+
+ \section1 replace(string, old_string, new_string)
+
+ Replaces each instance of \c old_string with \c new_string in the
+ contents of the variable supplied as \c string. For example, the
+ code
+
+ \snippet doc/src/snippets/qmake/replace.pro 0
+
+ prints the message:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 70
+
+ \section1 sprintf(string, arguments...)
+
+ Replaces %1-%9 with the arguments passed in the comma-separated list
+ of function \e arguments and returns the processed string.
+
+ \section1 system(command)
+ [Conditional]
+
+ Executes the given \c command in a secondary shell, and succeeds
+ if the command returns with a zero exit status; otherwise fails.
+ You can check the return value of this function using a scope:
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 71
+
+ Alternatively, you can use this function to obtain stdout and stderr
+ from the command, and assign it to a variable. For example, you can
+ use this to interrogate information about the platform:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 72
+
+ \target unique
+ \section1 unique(variablename)
+
+ This will return a list of values in variable that are unique (that is
+ with repetitive entries removed). For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 73
+
+ \section1 warning(string)
+
+ This function will always succeed, and will display the given
+ \e string to the user. message() is a synonym for warning().
+*/
+
+/*!
+ \page qmake-environment-reference.html
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Function Reference
+
+ \title Configuring qmake's Environment
+
+ \tableofcontents
+
+ \target Properties
+ \section1 Properties
+
+ \c qmake has a system of persistant information, this allows you to
+ \c set a variable in qmake once, and each time qmake is invoked this
+ value can be queried. Use the following to set a property in qmake:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 74
+
+ The appropriate variable and value should be substituted for
+ \c VARIABLE and \c VALUE.
+
+ To retrieve this information back from qmake you can do:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 75
+
+ \note \c{qmake -query} will only list variables that you have
+ previously set with \c{qmake -set VARIABLE VALUE}.
+
+ This information will be saved into a QSettings object (meaning it
+ will be stored in different places for different platforms). As
+ \c VARIABLE is versioned as well, you can set one value in an older
+ version of \c qmake, and newer versions will retrieve this value. However,
+ if you set \c VARIABLE for a newer version of \c qmake, the older version
+ will not use this value. You can however query a specific version of a
+ variable if you prefix that version of \c qmake to \c VARIABLE, as in
+ the following example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 76
+
+ \c qmake also has the notion of \c builtin properties, for example you can
+ query the installation of Qt for this version of \c qmake with the
+ \c QT_INSTALL_PREFIX property:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 77
+
+ These built-in properties cannot have a version prefixed to them as
+ they are not versioned, and each version of \c qmake will have its own
+ built-in set of these values. The list below outlines the built-in
+ properties:
+
+ \list
+ \o \c QT_INSTALL_PREFIX - Where the version of Qt this qmake is built for resides
+ \o \c QT_INSTALL_DATA - Where data for this version of Qt resides
+ \o \c QMAKE_VERSION - The current version of qmake
+ \endlist
+
+ Finally, these values can be queried in a project file with a special
+ notation such as:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 78
+
+ \target QMAKESPEC
+ \section1 QMAKESPEC
+
+ \c qmake requires a platform and compiler description file which
+ contains many default values used to generate appropriate Makefiles.
+ The standard Qt distribution comes with many of these files, located
+ in the \c mkspecs subdirectory of the Qt installation.
+
+ The \c QMAKESPEC environment variable can contain any of the following:
+
+ \list
+ \o A complete path to a directory containing a \c{qmake.conf} file.
+ In this case \c qmake will open the \c{qmake.conf} file from within that
+ directory. If the file does not exist, \c qmake will exit with an
+ error.
+ \o The name of a platform-compiler combination. In this case, \c qmake
+ will search in the directory specified by the \c mkspecs subdirectory
+ of the data path specified when Qt was compiled (see
+ QLibraryInfo::DataPath).
+ \endlist
+
+ \bold{Note:} The \c QMAKESPEC path will automatically be added to the
+ \l{qmake Variable Reference#INCLUDEPATH}{INCLUDEPATH} system variable.
+
+ \target INSTALLS
+ \section1 INSTALLS
+
+ It is common on Unix to also use the build tool to install applications
+ and libraries; for example, by invoking \c{make install}. For this reason,
+ \c qmake has the concept of an install set, an object which contains
+ instructions about the way part of a project is to be installed.
+ For example, a collection of documentation files can be described in the
+ following way:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 79
+
+ The \c path member informs \c qmake that the files should be installed in
+ \c /usr/local/program/doc (the path member), and the \c files member
+ specifies the files that should be copied to the installation directory.
+ In this case, everything in the \c docs directory will be coped to
+ \c /usr/local/program/doc.
+
+ Once an install set has been fully described, you can append it to the
+ install list with a line like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 80
+
+ \c qmake will ensure that the specified files are copied to the installation
+ directory. If you require greater control over this process, you can also
+ provide a definition for the \c extra member of the object. For example,
+ the following line tells \c qmake to execute a series of commands for this
+ install set:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 81
+
+ The \c unix scope
+ (see \l{qmake Advanced Usage#Scopes and Conditions}{Scopes and Conditions})
+ ensures that these particular commands are only executed on Unix platforms.
+ Appropriate commands for other platforms can be defined using other scope
+ rules.
+
+ Commands specified in the \c extra member are executed before the instructions
+ in the other members of the object are performed.
+
+ If you append a built-in install set to the \c INSTALLS variable and do
+ not specify \c files or \c extra members, \c qmake will decide what needs to
+ be copied for you. Currently, the only supported built-in install set is
+ \c target:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 82
+
+ In the above lines, \c qmake knows what needs to be copied, and will handle
+ the installation process automatically.
+
+ \target cache
+ \section1 Cache File
+
+ The cache file is a special file \c qmake reads to find settings not specified
+ in the \c qmake.conf file, project files, or at the command line. If
+ \c -nocache is not specified when \c qmake is run, it will try to find a file
+ called \c{.qmake.cache} in parent directories of the current directory. If
+ it fails to find this file, it will silently ignore this step of processing.
+
+ If it finds a \c{.qmake.cache} file then it will process this file first before
+ it processes the project file.
+
+ \target LibDepend
+ \section1 Library Dependencies
+
+ Often when linking against a library, \c qmake relies on the underlying
+ platform to know what other libraries this library links against, and
+ lets the platform pull them in. In many cases, however, this is not
+ sufficent. For example, when statically linking a library, no other
+ libraries are linked to, and therefore no dependencies to those
+ libraries are created. However, an application that later links
+ against this library will need to know where to find the symbols that
+ the static library will require. To help with this situation, \c qmake
+ attempts to follow a library's dependencies where appropriate, but
+ this behavior must be explicitly enabled by following two steps.
+
+ The first step is to enable dependency tracking in the library itself.
+ To do this you must tell \c qmake to save information about the library:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 83
+
+ This is only relevant to the \c lib template, and will be ignored for
+ all others. When this option is enabled, \c qmake will create a file
+ ending in .prl which will save some meta-information about the
+ library. This metafile is just like an ordinary project file, but only
+ contains internal variable declarations. You are free to view this file
+ and, if it is deleted, \c qmake will know to recreate it when necessary,
+ either when the project file is later read, or if a dependent library
+ (described below) has changed. When installing this library, by
+ specifying it as a target in an \c INSTALLS declaration, \c qmake will
+ automatically copy the .prl file to the installation path.
+
+ The second step in this process is to enable reading of this meta
+ information in the applications that use the static library:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 84
+
+ When this is enabled, \c qmake will process all libraries linked to
+ by the application and find their meta-information. \c qmake will use
+ this to determine the relevant linking information, specifically adding
+ values to the application project file's list of \c DEFINES as well as
+ \c LIBS. Once \c qmake has processed this file, it will then look through
+ the newly introduced libraries in the \c LIBS variable, and find their
+ dependent .prl files, continuing until all libraries have been resolved.
+ At this point, the Makefile is created as usual, and the libraries are
+ linked explicitlyy against the application.
+
+ The internals of the .prl file are left closed so they can easily
+ change later. They are not designed to be changed by hand, should only
+ be created by \c qmake, and should not be transferred between operating
+ systems as they may contain platform-dependent information.
+
+ \target Extensions
+ \section1 File Extensions
+
+ Under normal circumstances \c qmake will try to use appropriate file extensions
+ for your platform. However, it is sometimes necessary to override the default
+ choices for each platform and explicitly define file extensions for \c qmake to use.
+ This is achieved by redefining certain built-in variables; for example the extension
+ used for \l moc files can be redefined with the following assignment in a project
+ file:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 85
+
+ The following variables can be used to redefine common file extensions recognized
+ by \c qmake:
+
+ \list
+ \o QMAKE_EXT_MOC - This modifies the extension placed on included moc files.
+ \o QMAKE_EXT_UI - This modifies the extension used for designer UI files (usually
+ in \c FORMS).
+ \o QMAKE_EXT_PRL - This modifies the extension placed on
+ \l{#LibDepend}{library dependency files}.
+ \o QMAKE_EXT_LEX - This changes the suffix used in files (usually in \c LEXSOURCES).
+ \o QMAKE_EXT_YACC - This changes the suffix used in files (usually in \c YACCSOURCES).
+ \o QMAKE_EXT_OBJ - This changes the suffix used on generated object files.
+ \endlist
+
+ All of the above accept just the first value, so you must assign to it just one
+ value that will be used throughout your project file. There are two variables that
+ accept a list of values:
+
+ \list
+ \o QMAKE_EXT_CPP - Causes \c qmake to interpret all files with these suffixes as
+ C++ source files.
+ \o QMAKE_EXT_H - Causes \c qmake to interpret all files with these suffixes as
+ C and C++ header files.
+ \endlist
+
+ \target Customizing
+ \section1 Customizing Makefile Output
+
+ \c qmake tries to do everything expected of a cross-platform build tool.
+ This is often less than ideal when you really need to run special
+ platform-dependent commands. This can be achieved with specific instructions
+ to the different \c qmake backends.
+
+ Customization of the Makefile output is performed through an object-style
+ API as found in other places in \c qmake. Objects are defined automatically
+ by specifying their members; for example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 86
+
+ The definitions above define a \c qmake target called \c mytarget, containing
+ a Makefile target called \c{.buildfile} which in turn is generated with
+ the \c touch command. Finally, the \c{.depends} member specifies that
+ \c mytarget depends on \c mytarget2, another target that is defined afterwards.
+ \c mytarget2 is a dummy target; it is only defined to echo some text to
+ the console.
+
+ The final step is to instruct \c qmake that this object is a target to be built:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 87
+
+ This is all you need to do to actually build custom targets. Of course, you may
+ want to tie one of these targets to the
+ \l{qmake Variable Reference#TARGET}{qmake build target}. To do this, you simply need to
+ include your Makefile target in the list of
+ \l{qmake Variable Reference#PRE_TARGETDEPS}{PRE_TARGETDEPS}.
+
+ The following tables are an overview of the options available to you with the QMAKE_EXTRA_TARGETS
+ variable.
+
+ \table
+ \header
+ \o Member
+ \o Description
+ \row
+ \o commands
+ \o The commands for generating the custom build target.
+ \row
+ \o CONFIG
+ \o Specific configuration options for the custom build target. See the CONFIG table for details.
+ \row
+ \o depends
+ \o The existing build targets that the custom build target depends on.
+ \row
+ \o recurse
+ \o Specifies which sub-targets should used when creating the rules in the Makefile to call in
+ the sub-target specific Makefile. This is only used when \c recursive is set in the CONFIG.
+ \row
+ \o recurse_target
+ \o Specifies the target that should be built via the sub-target Makefile for the rule in the Makefile.
+ This adds something like $(MAKE) -f Makefile.[subtarget] [recurse_target]. This is only used when
+ \c recursive is set in the CONFIG.
+ \row
+ \o target
+ \o The file being created by the custom build target.
+ \endtable
+
+ List of members specific to the CONFIG option:
+
+ \table
+ \header
+ \o Member
+ \o Description
+ \row
+ \o recursive
+ \o Indicates that rules should be created in the Makefile and thus call
+ the relevant target inside the sub-target specific Makefile. This defaults to creating
+ an entry for each of the sub-targets.
+ \endtable
+
+ For convenience, there is also a method of customizing projects
+ for new compilers or preprocessors:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 88
+
+ With the above definitions, you can use a drop-in replacement for moc if one
+ is available. The commands is executed on all arguments given to the
+ \c NEW_HEADERS variable (from the \c input member), and the result is written
+ to the file defined by the \c output member; this file is added to the
+ other source files in the project.
+ Additionally, \c qmake will execute \c depend_command to generate dependency
+ information, and place this information in the project as well.
+
+ These commands can easily be placed into a cache file, allowing subsequent
+ project files to add arguments to \c NEW_HEADERS.
+
+ The following tables are an overview of the options available to you with the QMAKE_EXTRA_COMPILERS
+ variable.
+
+ \table
+ \header
+ \o Member
+ \o Description
+ \row
+ \o commands
+ \o The commands used for for generating the output from the input.
+ \row
+ \o CONFIG
+ \o Specific configuration options for the custom compiler. See the CONFIG table for details.
+ \row
+ \o depend_command
+ \o Specifies a command used to generate the list of dependencies for the output.
+ \row
+ \o dependency_type
+ \o Specifies the type of file the output is, if it is a known type (such as TYPE_C,
+ TYPE_UI, TYPE_QRC) then it is handled as one of those type of files.
+ \row
+ \o depends
+ \o Specifies the dependencies of the output file.
+ \row
+ \o input
+ \o The variable that contains the files that should be processed with the custom compiler.
+ \row
+ \o name
+ \o A description of what the custom compiler is doing. This is only used in some backends.
+ \row
+ \o output
+ \o The filename that is created from the custom compiler.
+ \row
+ \o output_function
+ \o Specifies a custom qmake function that is used to specify the filename to be created.
+ \row
+ \o variable_out
+ \o The variable that the files created from the output should be added to.
+ \endtable
+
+ List of members specific to the CONFIG option:
+
+ \table
+ \header
+ \o Member
+ \o Description
+ \row
+ \o commands
+ \o The commands used for for generating the output from the input.
+ \row
+ \o CONFIG
+ \o Specific configuration options for the custom compiler. See the CONFIG table for details.
+ \row
+ \o depend_command
+ \o Specifies a command used to generate the list of dependencies for the output.
+ \row
+ \o dependency_type
+ \o Specifies the type of file the output is, if it is a known type (such as TYPE_C,
+ TYPE_UI, TYPE_QRC) then it is handled as one of those type of files.
+ \row
+ \o depends
+ \o Specifies the dependencies of the output file.
+ \row
+ \o input
+ \o The variable that contains the files that should be processed with the custom compiler.
+ \row
+ \o name
+ \o A description of what the custom compiler is doing. This is only used in some backends.
+ \row
+ \o output
+ \o The filename that is created from the custom compiler.
+ \row
+ \o output_function
+ \o Specifies a custom qmake function that is used to specify the filename to be created.
+ \row
+ \o variables
+ \o Indicates that the variables specified here are replaced with $(QMAKE_COMP_VARNAME) when refered to
+ in the pro file as $(VARNAME).
+ \row
+ \o variable_out
+ \o The variable that the files created from the output should be added to.
+ \endtable
+
+ List of members specific to the CONFIG option:
+
+ \table
+ \header
+ \o Member
+ \o Description
+ \row
+ \o combine
+ \o Indicates that all of the input files are combined into a single output file.
+ \row
+ \o target_predeps
+ \o Indicates that the output should be added to the list of PRE_TARGETDEPS.
+ \row
+ \o explicit_dependencies
+ \o The dependencies for the output only get generated from the depends member and from
+ nowhere else.
+ \row
+ \o no_link
+ \o Indicates that the output should not be added to the list of objects to be linked in.
+ \endtable
+
+ \note Symbian specific: Generating objects to be linked in is not supported in Symbian,
+ so either the \c CONFIG option \c no_link or variable \c variable_out
+ should always be defined for extra compilers.
+
+*/
+
+/*!
+ \page qmake-advanced-usage.html
+ \title qmake Advanced Usage
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Platform Notes
+ \nextpage Using Precompiled Headers
+
+ Many \c qmake project files simply describe the sources and header files used
+ by the project, using a list of \c{name = value} and \c{name += value}
+ definitions. \c qmake also provides other operators, functions, and scopes
+ that can be used to process the information supplied in variable declarations.
+ These advanced features allow Makefiles to be generated for multiple platforms
+ from a single project file.
+
+ \tableofcontents
+
+ \section1 Operators
+
+ In many project files, the assignment (\c{=}) and append (\c{+=}) operators can
+ be used to include all the information about a project. The typical pattern of
+ use is to assign a list of values to a variable, and append more values
+ depending on the result of various tests. Since \c qmake defines certain
+ variables using default values, it is sometimes necessary to use the removal
+ (\c{-=}) operator to filter out values that are not required. The following
+ operators can be used to manipulate the contents of variables.
+
+ The \c = operator assigns a value to a variable:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 89
+
+ The above line sets the \c TARGET variable to \c myapp. This will overwrite any
+ values previously set for \c TARGET with \c myapp.
+
+ The \c += operator appends a new value to the list of values in a variable:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 90
+
+ The above line appends \c QT_DLL to the list of pre-processor defines to be put
+ in the generated Makefile.
+
+ The \c -= operator removes a value from the list of values in a variable:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 91
+
+ The above line removes \c QT_DLL from the list of pre-processor defines to be
+ put in the generated Makefile.
+
+ The \c *= operator adds a value to the list of values in a variable, but only
+ if it is not already present. This prevents values from being included many
+ times in a variable. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 92
+
+ In the above line, \c QT_DLL will only be added to the list of pre-processor
+ defines if it is not already defined. Note that the
+ \l{qmake Function Reference#unique}{unique()}
+ function can also be used to ensure that a variables only contains one
+ instance of each value.
+
+ The \c ~= operator replaces any values that match a regular expression with
+ the specified value:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 93
+
+ In the above line, any values in the list that start with \c QT_D or \c QT_T are
+ replaced with \c QT.
+
+ The \c $$ operator is used to extract the contents of a variable, and can be
+ used to pass values between variables or supply them to functions:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 94
+
+ \target Scopes
+ \section1 Scopes
+
+ Scopes are similar to \c if statements in procedural programming languages.
+ If a certain condition is true, the declarations inside the scope are processed.
+
+ \section2 Syntax
+
+ Scopes consist of a condition followed by an opening brace on the same line,
+ a sequence of commands and definitions, and a closing brace on a new line:
+
+ \snippet doc/src/snippets/qmake/scopes.pro syntax
+
+ The opening brace \e{must be written on the same line as the condition}.
+ Scopes may be concatenated to include more than one condition; see below
+ for examples.
+
+ \section2 Scopes and Conditions
+
+ A scope is written as a condition followed by a series of declarations
+ contained within a pair of braces; for example:
+
+ \snippet doc/src/snippets/qmake/scopes.pro 0
+
+ The above code will add the \c paintwidget_win.cpp file to the sources listed
+ in the generated Makefile if \c qmake is used on a Windows platform.
+ If \c qmake is used on a platform other than Windows, the define will be
+ ignored.
+
+ The conditions used in a given scope can also be negated to provide an
+ alternative set of declarations that will be processed only if the
+ original condition is false. For example, suppose we want to process
+ something on all platforms \e except for Windows. We can achieve this by
+ negating the scope like this:
+
+ \snippet doc/src/snippets/qmake/scopes.pro 1
+
+ Scopes can be nested to combine more than one condition. For instance, if
+ you want to include a particular file for a certain platform only if
+ debugging is enabled then you write the following:
+
+ \snippet doc/src/snippets/qmake/scopes.pro 2
+
+ To save writing many nested scopes, you can nest scopes using the \c :
+ operator. The nested scopes in the above example can be rewritten in
+ the following way:
+
+ \snippet doc/src/snippets/qmake/scopes.pro 3
+
+ You may also use the \c : operator to perform single line conditional
+ assignments; for example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 95
+
+ The above line adds \c QT_DLL to the \c DEFINES variable only on the
+ Windows platform.
+ Generally, the \c : operator behaves like a logical AND operator, joining
+ together a number of conditions, and requiring all of them to be true.
+
+ There is also the \c | operator to act like a logical OR operator, joining
+ together a number of conditions, and requiring only one of them to be true.
+
+ \snippet doc/src/snippets/qmake/scopes.pro 4
+
+ You can also provide alternative declarations to those within a scope by
+ using an \c else scope. Each \c else scope is processed if the conditions
+ for the preceding scopes are false.
+ This allows you to write complex tests when combined with other scopes
+ (separated by the \c : operator as above). For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 96
+
+ \section2 Configuration and Scopes
+
+ The values stored in the
+ \l{qmake-project-files.html#GeneralConfiguration}{\c CONFIG variable}
+ are treated specially by \c qmake. Each of the possible values can be
+ used as the condition for a scope. For example, the list of values
+ held by \c CONFIG can be extended with the \c opengl value:
+
+ \snippet doc/src/snippets/qmake/configscopes.pro 0
+
+ As a result of this operation, any scopes that test for \c opengl will
+ be processed. We can use this feature to give the final executable an
+ appropriate name:
+
+ \snippet doc/src/snippets/qmake/configscopes.pro 1
+ \snippet doc/src/snippets/qmake/configscopes.pro 2
+ \snippet doc/src/snippets/qmake/configscopes.pro 3
+
+ This feature makes it easy to change the configuration for a project
+ without losing all the custom settings that might be needed for a specific
+ configuration. In the above code, the declarations in the first scope are
+ processed, and the final executable will be called \c application-gl.
+ However, if \c opengl is not specified, the declarations in the second
+ scope are processed instead, and the final executable will be called
+ \c application.
+
+ Since it is possible to put your own values on the \c CONFIG
+ line, this provides you with a convenient way to customize project files
+ and fine-tune the generated Makefiles.
+
+ \section2 Platform Scope Values
+
+ In addition to the \c win32, \c macx, and \c unix values used in many
+ scope conditions, various other built-in platform and compiler-specific
+ values can be tested with scopes. These are based on platform
+ specifications provided in Qt's \c mkspecs directory. For example, the
+ following lines from a project file show the current specification in
+ use and test for the \c linux-g++ specification:
+
+ \snippet doc/src/snippets/qmake/specifications.pro 0
+
+ You can test for any other platform-compiler combination as long as a
+ specification exists for it in the \c mkspecs directory.
+
+ \section1 Variables
+
+ Many of the variables used in project files are special variables that
+ \c qmake uses when generating Makefiles, such as \c DEFINES, \c SOURCES,
+ and \c HEADERS. It is possible for you to create variables for your own
+ use; \c qmake creates new variables with a given name when it encounters
+ an assignment to that name. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 97
+
+ There are no restricitions on what you do to your own variables, as \c
+ qmake will ignore them unless it needs to evaluate them when processing
+ a scope.
+
+ You can also assign the value of a current variable to another
+ variable by prefixing $$ to the variable name. For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 98
+
+ Now the MY_DEFINES variable contains what is in the DEFINES variable at
+ this point in the project file. This is also equivalent to:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 99
+
+ The second notation allows you to append the contents of the variable to
+ another value without separating the two with a space. For example, the
+ following will ensure that the final executable will be given a name
+ that includes the project template being used:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 100
+
+ Variables can be used to store the contents of environment variables.
+ These can be evaluated at the time that \c qmake is run, or included
+ in the generated Makefile for evaluation when the project is built.
+
+ To obtain the contents of an environment value when \c qmake is run,
+ use the \c $$(...) operator:
+
+ \snippet doc/src/snippets/qmake/environment.pro 0
+
+ In the above assignment, the value of the \c PWD environment variable
+ is read when the project file is processed.
+
+ To obtain the contents of an environment value at the time when the
+ generated Makefile is processed, use the \c $(...) operator:
+
+ \snippet doc/src/snippets/qmake/environment.pro 1
+
+ In the above assignment, the value of \c PWD is read immediately
+ when the project file is processed, but \c $(PWD) is assigned to
+ \c DESTDIR in the generated Makefile. This makes the build process
+ more flexible as long as the environment variable is set correctly
+ when the Makefile is processed.
+
+ The special \c $$[...] operator can be used to access various
+ configuration options that were set when Qt was built:
+
+ \snippet doc/src/snippets/qmake/qtconfiguration.pro 0
+
+ The variables accessible with this operator are typically used to
+ enable third party plugins and components to be integrated with Qt.
+ For example, a \QD plugin can be installed alongside \QD's built-in
+ plugins if the following declaration is made in its project file:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 101
+
+ \target VariableProcessingFunctions
+ \section1 Variable Processing Functions
+
+ \c qmake provides a selection of built-in functions to allow the
+ contents of variables to be processed. These functions process the
+ arguments supplied to them and return a value, or list of values, as
+ a result. In order to assign a result to a variable, it is necessary
+ to use the \c $$ operator with this type of function in the same way
+ used to assign contents of one variable to another:
+
+ \snippet doc/src/snippets/qmake/functions.pro 1
+
+ This type of function should be used on the right-hand side of
+ assignments (i.e, as an operand).
+
+ It is possible to define your own functions for processing the
+ contents of variables. These functions can be defined in the following
+ way:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 102
+
+ The following example function takes a variable name as its only
+ argument, extracts a list of values from the variable with the
+ \l{qmake-function-reference.html}{eval()} built-in function,
+ and compiles a list of files:
+
+ \snippet doc/src/snippets/qmake/replacefunction.pro 0
+
+ \target ConditionalFunctions
+ \section1 Conditional Functions
+
+ \c qmake provides built-in functions that can be used as conditions
+ when writing scopes. These functions do not return a value, but
+ instead indicate "success" or "failure":
+
+ \snippet doc/src/snippets/qmake/functions.pro 3
+
+ This type of function should be used in conditional expressions
+ only.
+
+ It is possible to define your own functions to provide conditions
+ for scopes. The following example tests whether each file in a list
+ exists and returns true if they all exist, or false if not:
+
+ \snippet doc/src/snippets/qmake/testfunction.pro 0
+
+ \section1 Adding New Configuration Features
+
+ \c qmake lets you create your own \e features that can be included in
+ project files by adding their names to the list of values specified by
+ the \c CONFIG variable. Features are collections of custom functions and
+ definitions in \c{.prf} files that can reside in one of many standard
+ directories. The locations of these directories are defined in a number
+ of places, and \c qmake checks each of them in the following order when
+ it looks for \c{.prf} files:
+
+ \list 1
+ \o In a directory listed in the \c QMAKEFEATURES environment variable;
+ this contains a colon-separated list of directories.
+ \o In a directory listed in the \c QMAKEFEATURES property variable; this
+ contains a colon-spearated list of directories.
+ \omit
+ \o In a features directory beneath the project's root directory (where
+ the \c{.qmake.cache} file is generated).
+ \endomit
+ \o In a features directory residing within a \c mkspecs directory.
+ \c mkspecs directories can be located beneath any of the directories
+ listed in the \c QMAKEPATH environment variable (a colon-separated list
+ of directories). (\c{$QMAKEPATH/mkspecs/<features>})
+ \o In a features directory residing beneath the directory provided by the
+ \c QMAKESPEC environment variable. (\c{$QMAKESPEC/<features>})
+ \o In a features directory residing in the \c data_install/mkspecs directory.
+ (\c{data_install/mkspecs/<features>})
+ \o In a features directory that exists as a sibling of the directory
+ specified by the \c QMAKESPEC environment variable.
+ (\c{$QMAKESPEC/../<features>})
+ \endlist
+
+ The following features directories are searched for features files:
+
+ \list 1
+ \o \c{features/unix}, \c{features/win32}, or \c{features/macx}, depending on
+ the platform in use
+ \o \c features/
+ \endlist
+
+ For example, consider the following assignment in a project file:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 103
+
+ With this addition to the \c CONFIG variable, \c qmake will search the
+ locations listed above for the \c myfeatures.prf file after it has
+ finished parsing your project file. On Unix systems, it will look for
+ the following file:
+
+ \list 1
+ \o \c $QMAKEFEATURES/myfeatures.prf (for each directory listed in the
+ \c QMAKEFEATURES environment variable)
+ \o \c $$QMAKEFEATURES/myfeatures.prf (for each directory listed in the
+ \c QMAKEFEATURES property variable)
+ \o \c myfeatures.prf (in the project's root directory)
+ \o \c $QMAKEPATH/mkspecs/features/unix/myfeatures.prf and
+ \c $QMAKEPATH/mkspecs/features/myfeatures.prf (for each directory
+ listed in the \c QMAKEPATH environment variable)
+ \o \c $QMAKESPEC/features/unix/myfeatures.prf and
+ \c $QMAKESPEC/features/myfeatures.prf
+ \o \c data_install/mkspecs/features/unix/myfeatures.prf and
+ \c data_install/mkspecs/features/myfeatures.prf
+ \o \c $QMAKESPEC/../features/unix/myfeatures.prf and
+ \c $QMAKESPEC/../features/myfeatures.prf
+ \endlist
+
+ \note The \c{.prf} files must have names in lower case.
+
+
+*/
+
+/*!
+ \page qmake-precompiledheaders.html
+ \title Using Precompiled Headers
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Advanced Usage
+ \nextpage qmake Reference
+
+ \target Introduction
+
+ Precompiled headers are a performance feature supported by some
+ compilers to compile a stable body of code, and store the compiled
+ state of the code in a binary file. During subsequent compilations,
+ the compiler will load the stored state, and continue compiling the
+ specified file. Each subsequent compilation is faster because the
+ stable code does not need to be recompiled.
+
+ \c qmake supports the use of precompiled headers (PCH) on some
+ platforms and build environments, including:
+ \list
+ \o Windows
+ \list
+ \o nmake
+ \o Dsp projects (VC 6.0)
+ \o Vcproj projects (VC 7.0 \& 7.1)
+ \endlist
+ \o Mac OS X
+ \list
+ \o Makefile
+ \o Xcode
+ \endlist
+ \o Unix
+ \list
+ \o GCC 3.4 and above
+ \endlist
+ \endlist
+
+ \target ADD_PCH
+ \section1 Adding Precompiled Headers to Your Project
+
+ \target PCH_CONTENTS
+ \section2 Contents of the Precompiled Header File
+
+ The precompiled header must contain code which is \e stable
+ and \e static throughout your project. A typical PCH might look
+ like this:
+
+ \section3 Example: \c stable.h
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 104
+
+ Note that a precompiled header file needs to separate C includes from
+ C++ includes, since the precompiled header file for C files may not
+ contain C++ code.
+
+ \target PROJECT_OPTIONS
+ \section2 Project Options
+
+ To make your project use PCH, you only need to define the
+ \c PRECOMPILED_HEADER variable in your project file:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 105
+
+ \c qmake will handle the rest, to ensure the creation and use of the
+ precompiled header file. You do not need to include the precompiled
+ header file in \c HEADERS, as \c qmake will do this if the configuration
+ supports PCH.
+
+ All platforms that support precompiled headers have the configuration
+ option \c precompile_header set. Using this option, you may trigger
+ conditional blocks in your project file to add settings when using PCH.
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 106
+
+ \section1 Notes on Possible Issues
+
+ On some platforms, the file name suffix for precompiled header files is
+ the same as that for other object files. For example, the following
+ declarations may cause two different object files with the same name to
+ be generated:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 107
+
+ To avoid potential conflicts like these, it is good practice to ensure
+ that header files that will be precompiled are given distinctive names.
+
+ \target EXAMPLE_PROJECT
+ \section1 Example Project
+
+ You can find the following source code in the
+ \c{examples/qmake/precompile} directory in the Qt distribution:
+
+ \section2 \c mydialog.ui
+
+ \quotefromfile examples/qmake/precompile/mydialog.ui
+ \printuntil
+
+ \section2 \c stable.h
+
+ \snippet examples/qmake/precompile/stable.h 0
+
+ \section2 \c myobject.h
+
+ \snippet examples/qmake/precompile/myobject.h 0
+
+ \section2 \c myobject.cpp
+
+ \snippet examples/qmake/precompile/myobject.cpp 0
+
+ \section2 \c util.cpp
+
+ \snippet examples/qmake/precompile/util.cpp 0
+
+ \section2 \c main.cpp
+
+ \snippet examples/qmake/precompile/main.cpp 0
+
+ \section2 \c precompile.pro
+
+ \snippet examples/qmake/precompile/precompile.pro 0
+*/
+
+/*!
+ \page qmake-tutorial.html
+ \title qmake Tutorial
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Manual
+ \nextpage qmake Common Projects
+
+ This tutorial teaches you how to use \c qmake. We recommend that
+ you read the \c qmake user guide after completing this tutorial.
+
+ \section1 Starting off Simple
+
+ Let's assume that you have just finished a basic implementation of
+ your application, and you have created the following files:
+
+ \list
+ \o hello.cpp
+ \o hello.h
+ \o main.cpp
+ \endlist
+
+ You will find these files in the \c{examples/qmake/tutorial} directory
+ of the Qt distribution. The only other thing you know about the setup of
+ the application is that it's written in Qt. First, using your favorite
+ plain text editor, create a file called \c hello.pro in
+ \c{examples/qmake/tutorial}. The first thing you need to do is add the
+ lines that tell \c qmake about the source and header files that are part
+ of your development project.
+
+ We'll add the source files to the project file first. To do this you
+ need to use the \l{qmake Variable Reference#SOURCES}{SOURCES} variable.
+ Just start a new line with \c {SOURCES +=} and put hello.cpp after it.
+ You should have something like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 108
+
+ We repeat this for each source file in the project, until we end up
+ with the following:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 109
+
+ If you prefer to use a Make-like syntax, with all the files listed in
+ one go you can use the newline escaping like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 110
+
+ Now that the source files are listed in the project file, the header
+ files must be added. These are added in exactly the same way as source
+ files, except that the variable name we use is
+ \l{qmake Variable Reference#HEADERS}{HEADERS}.
+
+ Once you have done this, your project file should look something like
+ this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 111
+
+ The target name is set automatically; it is the same as the project
+ file, but with the suffix appropriate to the platform. For example, if
+ the project file is called \c hello.pro, the target will be \c hello.exe
+ on Windows and \c hello on Unix. If you want to use a different name
+ you can set it in the project file:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 112
+
+ The final step is to set the \l{qmake Variable Reference#CONFIG}{CONFIG}
+ variable. Since this is a Qt application, we need to put \c qt on the
+ \c CONFIG line so that \c qmake will add the relevant libraries to be
+ linked against and ensure that build lines for \c moc and \c uic are
+ included in the generated Makefile.
+
+ The finished project file should look like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 113
+
+ You can now use \c qmake to generate a Makefile for your application.
+ On the command line, in your project's directory, type the following:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 114
+
+ Then type \c make or \c nmake depending on the compiler you use.
+
+ For Visual Studio users, \c qmake can also generate \c .dsp or
+ \c .vcproj files, for example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 115
+
+ \section1 Making an Application Debuggable
+
+ The release version of an application doesn't contain any debugging
+ symbols or other debugging information. During development it is useful
+ to produce a debugging version of the application that has the
+ relevant information. This is easily achieved by adding \c debug to the
+ \c CONFIG variable in the project file.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 116
+
+ Use \c qmake as before to generate a Makefile and you will be able to
+ obtain useful information about your application when running it in
+ a debugging environment.
+
+ \section1 Adding Platform-Specific Source Files
+
+ After a few hours of coding, you might have made a start on the
+ platform-specific part of your application, and decided to keep the
+ platform-dependent code separate. So you now have two new files to
+ include into your project file: \c hellowin.cpp and \c
+ hellounix.cpp. We can't just add these to the \c SOURCES
+ variable since this will put both files in the Makefile. So, what we
+ need to do here is to use a scope which will be processed depending on
+ which platform \c qmake is run on.
+
+ A simple scope that will add in the platform-dependent file for
+ Windows looks like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 117
+
+ So if \c qmake is run on Windows, it will add \c hellowin.cpp to the
+ list of source files. If \c qmake is run on any other platform, it
+ will simply ignore it. Now all that is left to be done is to create a
+ scope for the Unix-specific file.
+
+ When you have done that, your project file should now look
+ something like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 118
+
+ Use \c qmake as before to generate a Makefile.
+
+ \section1 Stopping qmake If a File Doesn't Exist
+
+ You may not want to create a Makefile if a certain file doesn't exist.
+ We can check if a file exists by using the exists() function. We can
+ stop \c qmake from processing by using the error() function. This
+ works in the same way as scopes do. Simply replace the scope condition
+ with the function. A check for a \c main.cpp file looks like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 119
+
+ The \c{!} symbol is used to negate the test; i.e. \c{exists( main.cpp )}
+ is true if the file exists, and \c{!exists( main.cpp )} is true if the
+ file doesn't exist.
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 120
+
+ Use \c qmake as before to generate a makefile. If you rename \c
+ main.cpp temporarily, you will see the message and \c qmake will stop
+ processing.
+
+ \section1 Checking for More than One Condition
+
+ Suppose you use Windows and you want to be able to see statement
+ output with qDebug() when you run your application on the command line.
+ Unless you build your application with the appropriate console setting,
+ you won't see the output. We can easily put \c console on the \c CONFIG
+ line so that on Windows the makefile will have this setting. However,
+ let's say that we only want to add the \c CONFIG line if we are running
+ on Windows \e and when \c debug is already on the \c CONFIG line.
+ This requires using two nested scopes; just create one scope, then create
+ the other inside it. Put the settings to be processed inside the last
+ scope, like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 121
+
+ Nested scopes can be joined together using colons, so the final
+ project file looks like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 122
+
+ That's it! You have now completed the tutorial for \c qmake, and are
+ ready to write project files for your development projects.
+*/
+
+/*!
+ \page qmake-common-projects.html
+ \title qmake Common Projects
+ \contentspage {qmake Manual}{Contents}
+ \previouspage qmake Tutorial
+ \nextpage Using qmake
+
+ This chapter describes how to set up \c qmake project files for three
+ common project types that are based on Qt. Although all kinds of
+ projects use many of the same variables, each of them use project-specific
+ variables to customize output files.
+
+ Platform-specific variables are not described here; we refer the reader to
+ the \l{Deploying Qt Applications} document for information on issues such as
+ \l{Deploying an Application on Mac OS X#Architecture Dependencies}{building
+ universal binaries for Mac OS X} and
+ \l{Deploying an Application on Windows#Visual Studio 2005 Onwards}
+ {handling Visual Studio manifest files}.
+
+ \tableofcontents
+
+ \target Application
+ \section1 Building an Application
+
+ \section2 The app Template
+
+ The \c app template tells \c qmake to generate a Makefile that will build
+ an application. With this template, the type of application can be specified
+ by adding one of the following options to the \c CONFIG variable definition:
+
+ \table
+ \header \o Option \o Description
+ \row \o windows \o The application is a Windows GUI application.
+ \row \o console \o \c app template only: the application is a Windows console
+ application.
+ \endtable
+
+ When using this template the following \c qmake system variables are recognized.
+ You should use these in your .pro file to specify information about your
+ application.
+
+ \list
+ \o HEADERS - A list of all the header files for the application.
+ \o SOURCES - A list of all the source files for the application.
+ \o FORMS - A list of all the UI files (created using \c{Qt Designer})
+ for the application.
+ \o LEXSOURCES - A list of all the lex source files for the application.
+ \o YACCSOURCES - A list of all the yacc source files for the application.
+ \o TARGET - Name of the executable for the application. This defaults
+ to the name of the project file. (The extension, if any, is added
+ automatically).
+ \o DESTDIR - The directory in which the target executable is placed.
+ \o DEFINES - A list of any additional pre-processor defines needed for the application.
+ \o INCLUDEPATH - A list of any additional include paths needed for the application.
+ \o DEPENDPATH - The dependency search path for the application.
+ \o VPATH - The search path to find supplied files.
+ \o DEF_FILE - Windows only: A .def file to be linked against for the application.
+ \o RC_FILE - Windows only: A resource file for the application.
+ \o RES_FILE - Windows only: A resource file to be linked against for the application.
+ \endlist
+
+ You only need to use the system variables that you have values for,
+ for instance, if you do not have any extra INCLUDEPATHs then you do not
+ need to specify any, \c qmake will add in the default ones needed.
+ For instance, an example project file might look like this:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 123
+
+ For items that are single valued, e.g. the template or the destination
+ directory, we use "="; but for multi-valued items we use "+=" to \e
+ add to the existing items of that type. Using "=" replaces the item's
+ value with the new value, for example if we wrote \c{DEFINES=QT_DLL},
+ all other definitions would be deleted.
+
+ \target Library
+ \section1 Building a Library
+
+ \section2 The lib Template
+
+ The \c lib template tells \c qmake to generate a Makefile that will
+ build a library. When using this template, in addition to the system variables
+ mentioned above for the \c app template the \c VERSION variable is
+ supported. You should use these in your .pro file to specify
+ information about the library.
+
+ When using the \c lib template, the following options can be added to the
+ \c CONFIG variable to determine the type of library that is built:
+
+ \table
+ \header \o Option \o Description
+ \row \o dll \o The library is a shared library (dll).
+ \row \o staticlib \o The library is a static library.
+ \row \o plugin \o The library is a plugin; this also enables the dll option.
+ \endtable
+
+ The following option can also be defined to provide additional information about
+ the library.
+
+ \list
+ \o VERSION - The version number of the target library, for example, 2.3.1.
+ \endlist
+
+ The target file name for the library is platform-dependent. For example, on
+ X11 and Mac OS X, the library name will be prefixed by \c lib; on Windows,
+ no prefix is added to the file name.
+
+ \target Plugin
+ \section1 Building a Plugin
+
+ Plugins are built using the \c lib template, as described in the previous
+ section. This tells \c qmake to generate a Makefile for the project that will
+ build a plugin in a suitable form for each platform, usually in the form of a
+ library. As with ordinary libraries, the \c VERSION variable is used to specify
+ information about the plugin.
+
+ \list
+ \o VERSION - The version number of the target library, for example, 2.3.1.
+ \endlist
+
+ \section2 Building a Qt Designer Plugin
+
+ \QD plugins are built using a specific set of configuration settings that
+ depend on the way Qt was configured for your system. For convenience, these
+ settings can be enabled by adding \c designer to the project's \c CONFIG
+ variable. For example:
+
+ \snippet examples/designer/worldtimeclockplugin/worldtimeclockplugin.pro 0
+
+ See the \l{Qt Designer Examples} for more examples of plugin-based projects.
+
+ \section1 Building and Installing in Debug and Release Modes
+
+ Sometimes, it is necessary to build a project in both debug and release
+ modes. Although the \c CONFIG variable can hold both \c debug and \c release
+ options, the \c debug option overrides the \c release option.
+
+ \section2 Building in Both Modes
+
+ To enable a project to be built in both modes, you must add the
+ \c debug_and_release option to your project's \c CONFIG definition:
+
+ \snippet doc/src/snippets/qmake/debug_and_release.pro 0
+ \snippet doc/src/snippets/qmake/debug_and_release.pro 1
+
+ The scope in the above snippet modifies the build target in each mode to
+ ensure that the resulting targets have different names. Providing different
+ names for targets ensures that one will not overwrite the other.
+
+ When \c qmake processes the project file, it will generate a Makefile rule
+ to allow the project to be built in both modes. This can be invoked in the
+ following way:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 124
+
+ The \c build_all option can be added to the \c CONFIG variable in the
+ project file to ensure that the project is built in both modes by default:
+
+ \snippet doc/src/snippets/qmake/debug_and_release.pro 2
+
+ This allows the Makefile to be processed using the default rule:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 125
+
+ \section2 Installing in Both Modes
+
+ The \c build_all option also ensures that both versions of the target
+ will be installed when the installation rule is invoked:
+
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 126
+
+ It is possible to customize the names of the build targets depending on
+ the target platform. For example, a library or plugin may be named using a
+ different convention on Windows to the one used on Unix platforms:
+
+ \omit
+ Note: This was originally used in the customwidgetplugin.pro file, but is
+ no longer needed there.
+ \endomit
+ \snippet doc/src/snippets/code/doc_src_qmake-manual.qdoc 127
+
+ The default behavior in the above snippet is to modify the name used for
+ the build target when building in debug mode. An \c else clause could be
+ added to the scope to do the same for release mode; left as it is, the
+ target name remains unmodified.
+*/
+
diff --git a/doc/src/development/qmsdev.qdoc b/doc/src/development/qmsdev.qdoc
new file mode 100644
index 0000000..61894d4
--- /dev/null
+++ b/doc/src/development/qmsdev.qdoc
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/* NOT DOCUMENTED !
+ \page qmsdev.html
+
+ \title The QMsDev Plugin
+
+ The Visual Studio Integration Plugin is currently available only to users of
+ Visual Studio 6. It offers simple ways of doing common tasks when writing a
+ Qt application.
+
+ \tableofcontents
+
+ \section1 How to install the Visual Studio Integration Plugin
+
+ When you install Qt, the integration plugin should be installed for you,
+ however, sometimes this does not happen, so to install the integration
+ plugin manually just carry out the following steps.
+
+ \list
+ \i Start up Visual Studio.
+ \i Select Tools|Customize|Add-ins and Macro Files.
+ \i Ensure that there is a tick next to QMsDev Developer Studio Add-In.
+ \i Click Close.
+ \endlist
+
+ Now the integration plugin should be installed. If this doesn't
+ work, then contact Qt technical support giving details of
+ what went wrong.
+
+ \section1 How to uninstall the Visual Studio Integration Plugin
+
+ When you want to uninstall the integration plugin, just carry out the
+ following steps.
+
+ \list
+ \i Close down any instances of Visual Studio.
+ \i Delete the file '%MSDevDir%\\addins\\qmsdev.dll'
+ \endlist
+
+ \section1 What can the Visual Studio Integration Plugin do?
+
+ The integration plugin adds the following options to Visual Studio:
+
+ \list
+ \i New Qt Project
+ \i New Qt Dialog
+ \i Qt Designer
+ \i Open Qt Project
+ \i Write Qt Project
+ \i Use Qt In Current Project
+ \i Add MOC
+ \endlist
+
+ \section2 Using the 'New Qt Project' button
+
+ The 'New Qt Project' button allows you to create a simple Qt project
+ ready for development. Simply fill in the form and if you select
+ 'Dialog' or 'Main Window' without MDI support then it will
+ automatically start up \e{Qt Designer}. When you have finished with
+ the form in \e{Qt Designer} just save it and it will appear in a
+ ready made Qt project.
+
+ If you select 'Main Window' with 'MDI Support' then it will simply
+ give you a code skeleton in a project ready for you to populate with
+ your own code.
+
+ \section2 Using the 'New Qt Dialog' button
+
+ The 'New Qt Dialog' button works in two ways: You can use it to create a new
+ dialog for your project; or you can use it to insert an existing
+ dialog into your project.
+
+ If you want to create a new dialog then all you need to do is specify where
+ the dialog file should be saved and give it a name. This will start up
+ \e{Qt Designer} to allow you to design your new dialog, and will add it to
+ the existing project.
+
+ If you want to add an existing dialog to your project, then just select the
+ relevant UI file. This will then add it to your existing project and add
+ the relevant steps to create the generated code.
+
+ \section2 Using the 'Qt Designer' button
+
+ The 'Qt Designer' button simply starts up \e{Qt Designer}, it has no ties to
+ your existing project so whatever you do with it will not affect your
+ existing projects. It can also be started up by using the Ctrl+Shift+D key
+ combination in Visual Studio.
+
+ \section2 Using the 'Open Qt Project' button
+
+ The 'Open Qt Project' button allows you to convert an existing \c
+ qmake project file into a \c .dsp file which you can insert into
+ your existing workspace. When you click the 'Open Qt Project'
+ button, just select an existing \c qmake project file (a \c .pro
+ file) and then click OK. You will get a message box at the end
+ which asks you to insert the newly created \c .dsp file into your
+ existing workspace.
+
+ \section2 Using the 'Write Qt Project' button
+
+ The 'Write Qt Project' button creates a \c qmake project (\c .pro)
+ file for your current project so that you can easily copy the files
+ onto another platform and be able to use \c qmake to create a Makefile
+ on that other platform. All you need to do is make the project you
+ want to create a \c .pro file for, and click on the button. Just
+ name your \c qmake project file and click Save.
+
+ \section2 Using the 'Use Qt In Current Project' button
+
+ The 'Use Qt In Current Project' button simply adds in the necessary
+ information for the current project so that it links against Qt and
+ sets any other settings needed to use Qt in that project.
+
+ \section2 Using the 'Add MOC' button
+
+ The 'Add MOC' button will add in the custom build step for the selected file
+ so that it creates any needed MOC files and it will add these generated
+ files to the project. All you need to do to use it is click on a file that
+ has Q_OBJECT and click the button.
+
+ You only need to use this button if you added a file that has
+ Q_OBJECT in it by hand, you don't need to use this if you used any
+ of the previously mentioned buttons. It can also be invoked by using
+ the \key{Ctrl+Shift+M} key combination in Visual Studio.
+
+*/
diff --git a/doc/src/development/qtestlib.qdoc b/doc/src/development/qtestlib.qdoc
new file mode 100644
index 0000000..48da108
--- /dev/null
+++ b/doc/src/development/qtestlib.qdoc
@@ -0,0 +1,778 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qtestlib-manual.html
+ \title QTestLib Manual
+ \brief An overview of Qt's unit testing framework.
+
+ \ingroup frameworks-technologies
+ \keyword qtestlib
+
+ The QTestLib framework, provided by Nokia, is a tool for unit
+ testing Qt based applications and libraries. QTestLib provides
+ all the functionality commonly found in unit testing frameworks as
+ well as extensions for testing graphical user interfaces.
+
+ Table of contents:
+
+ \tableofcontents
+
+ \section1 QTestLib Features
+
+ QTestLib is designed to ease the writing of unit tests for Qt
+ based applications and libraries:
+
+ \table
+ \header \o Feature \o Details
+ \row
+ \o \bold Lightweight
+ \o QTestLib consists of about 6000 lines of code and 60
+ exported symbols.
+ \row
+ \o \bold Self-contained
+ \o QTestLib requires only a few symbols from the Qt Core library
+ for non-gui testing.
+ \row
+ \o \bold {Rapid testing}
+ \o QTestLib needs no special test-runners; no special
+ registration for tests.
+ \row
+ \o \bold {Data-driven testing}
+ \o A test can be executed multiple times with different test data.
+ \row
+ \o \bold {Basic GUI testing}
+ \o QTestLib offers functionality for mouse and keyboard simulation.
+ \row
+ \o \bold {Benchmarking}
+ \o QTestLib supports benchmarking and provides several measurement back-ends.
+ \row
+ \o \bold {IDE friendly}
+ \o QTestLib outputs messages that can be interpreted by Visual
+ Studio and KDevelop.
+ \row
+ \o \bold Thread-safety
+ \o The error reporting is thread safe and atomic.
+ \row
+ \o \bold Type-safety
+ \o Extensive use of templates prevent errors introduced by
+ implicit type casting.
+ \row
+ \o \bold {Easily extendable}
+ \o Custom types can easily be added to the test data and test output.
+ \endtable
+
+ Note: For higher-level GUI and application testing needs, please
+ see the \l{Third-Party Tools}{Qt testing products provided by
+ Nokia partners}.
+
+
+ \section1 QTestLib API
+
+ All public methods are in the \l QTest namespace. In addition, the
+ \l QSignalSpy class provides easy introspection for Qt's signals and slots.
+
+
+ \section1 Using QTestLib
+
+ \section2 Creating a Test
+
+ To create a test, subclass QObject and add one or more private slots to it. Each
+ private slot is a testfunction in your test. QTest::qExec() can be used to execute
+ all testfunctions in the test object.
+
+ In addition, there are four private slots that are \e not treated as testfunctions.
+ They will be executed by the testing framework and can be used to initialize and
+ clean up either the entire test or the current test function.
+
+ \list
+ \o \c{initTestCase()} will be called before the first testfunction is executed.
+ \o \c{cleanupTestCase()} will be called after the last testfunction was executed.
+ \o \c{init()} will be called before each testfunction is executed.
+ \o \c{cleanup()} will be called after every testfunction.
+ \endlist
+
+ If \c{initTestCase()} fails, no testfunction will be executed. If \c{init()} fails,
+ the following testfunction will not be executed, the test will proceed to the next
+ testfunction.
+
+ Example:
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 0
+
+ For more examples, refer to the \l{QTestLib Tutorial}.
+
+ \section2 Building a Test
+
+ If you are using \c qmake as your build tool, just add the
+ following to your project file:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 1
+
+ If you are using other buildtools, make sure that you add the location
+ of the QTestLib header files to your include path (usually \c{include/QtTest}
+ under your Qt installation directory). If you are using a release build
+ of Qt, link your test to the \c QtTest library. For debug builds, use
+ \c{QtTest_debug}.
+
+ See \l {Chapter 1: Writing a Unit Test}{Writing a Unit Test} for a step by
+ step explanation.
+
+ \section2 QTestLib Command Line Arguments
+
+ \section3 Syntax
+
+ The syntax to execute an autotest takes the following simple form:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 2
+
+ Substitute \c testname with the name of your executable. \c
+ testfunctions can contain names of test functions to be
+ executed. If no \c testfunctions are passed, all tests are run. If you
+ append the name of an entry in \c testdata, the test function will be
+ run only with that test data.
+
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 3
+
+ Runs the test function called \c toUpper with all available test data.
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 4
+
+ Runs the \c toUpper test function with all available test data,
+ and the \c toInt test function with the testdata called \c
+ zero (if the specified test data doesn't exist, the associated test
+ will fail).
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 5
+
+ Runs the testMyWidget function test, outputs every signal
+ emission and waits 500 milliseconds after each simulated
+ mouse/keyboard event.
+
+ \section3 Options
+
+ The following command line arguments are understood:
+
+ \list
+ \o \c -help \BR
+ outputs the possible command line arguments and give some useful help.
+ \o \c -functions \BR
+ outputs all test functions available in the test.
+ \o \c -o \e filename \BR
+ write output to the specified file, rather than to standard output
+ \o \c -silent \BR
+ silent output, only shows warnings, failures and minimal status messages
+ \o \c -v1 \BR
+ verbose output; outputs information on entering and exiting test functions.
+ \o \c -v2 \BR
+ extended verbose output; also outputs each \l QCOMPARE() and \l QVERIFY()
+ \o \c -vs \BR
+ outputs every signal that gets emitted
+ \o \c -xml \BR
+ outputs XML formatted results instead of plain text
+ \o \c -lightxml \BR
+ outputs results as a stream of XML tags
+ \o \c -eventdelay \e ms \BR
+ if no delay is specified for keyboard or mouse simulation
+ (\l QTest::keyClick(),
+ \l QTest::mouseClick() etc.), the value from this parameter
+ (in milliseconds) is substituted.
+ \o \c -keydelay \e ms \BR
+ like -eventdelay, but only influences keyboard simulation and not mouse
+ simulation.
+ \o \c -mousedelay \e ms \BR
+ like -eventdelay, but only influences mouse simulation and not keyboard
+ simulation.
+ \o \c -keyevent-verbose \BR
+ output more verbose output for keyboard simulation
+ \o \c -maxwarnings \e number\BR
+ sets the maximum number of warnings to output. 0 for unlimited, defaults to 2000.
+ \endlist
+
+ \section2 Creating a Benchmark
+
+ To create a benchmark, follow the instructions for crating a test and then add a
+ QBENCHMARK macro to the test function that you want to benchmark.
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 12
+
+ The code insde the QBENCHMARK macro will be measured, and possibly also repeated
+ several times in order to get an accurate measurement. This depends on the selected
+ measurement back-end. Several back-ends are available an can be selected on the
+ command line:
+
+ \target testlib-benchmarking-measurement
+
+ \table
+ \header \o Name
+ \o Commmand-line Arguemnt
+ \o Availability
+ \row \o Walltime
+ \o (default)
+ \o All platforms
+ \row \o CPU tick counter
+ \o -tickcounter
+ \o Windows, Mac OS X, Linux, many UNIX-like systems.
+ \row \o Valgrind/Callgrind
+ \o -callgrind
+ \o Linux (if installed)
+ \row \o Event Counter
+ \o -eventcounter
+ \o All platforms
+ \endtable
+
+ In short, walltime is always available but requires many repetitions to
+ get a useful result.
+ Tick counters are usually available and can provide
+ results with fewer repetitions, but can be susceptible to CPU frequency
+ scaling issues.
+ Valgrind provides exact results, but does not take
+ I/O waits into account, and is only available on a limited number of
+ platforms.
+ Event counting is available on all platforms and it provides the number of events
+ that were received by the event loop before they are sent to their corresponding
+ targets (this might include non-Qt events).
+
+ \note Depending on the device configuration, Tick counters on the
+ Windows CE platform may not be as fine-grained, compared to other platforms.
+ Devices that do not support high-resolution timers default to
+ one-millisecond granularity.
+
+ See the chapter 5 in the \l{QTestLib Tutorial} for more benchmarking examples.
+
+ \section1 Using QTestLib remotely on Windows CE
+ \c cetest is a convenience application which helps the user to launch an
+ application remotely on a Windows CE device or emulator.
+
+ It needs to be executed after the unit test has been successfully compiled.
+
+ Prior to launching, the following files are copied to the device:
+
+ \list
+ \o all Qt libraries the project links to
+ \o \l {QtRemote}{QtRemote.dll}
+ \o the c runtime library specified during installation
+ \o all files specified in the \c .pro file following the \l DEPLOYMENT rules.
+ \endlist
+
+ \section2 Using \c cetest
+ \section3 Syntax
+ The syntax to execute an autotest takes the following simple form:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 6
+
+ \section3 Options
+ \c cetest provides the same options as those for unit-testing on non cross-compiled
+ platforms. See \l {QTestLib Command Line Arguments} {Command Line Arguments} for
+ more information.
+
+ The following commands are also included:
+
+ \list
+ \o \c -debug \BR
+ Test version compiled in debug mode.
+ \o \c -release \BR
+ Test version compiled in release mode.
+ \o \c -libpath \e path \BR
+ Target path to copy Qt libraries to.
+ \o \c -qt-delete \BR
+ Delete Qt libraries after execution.
+ \o \c -project-delete \BR
+ Delete project files after execution.
+ \o \c -delete \BR
+ Delete project and Qt libraries after execution.
+ \o \c -conf \BR
+ Specifies a qt.conf file to be deployed to remote directory.
+ \endlist
+
+ \note \c{debug} is the default build option.
+
+ \section2 QtRemote
+ \c QtRemote is a small library which is build after QTestLib. It allows the host
+ system to create a process on a remote device and waits until its execution has
+ been finished.
+
+ \section2 Requirements
+ \c cetest uses Microsoft ActiveSync to establish a remote connection between the
+ host computer and the device. Thus header files and libraries are needed to compile
+ cetest and QtRemote successfully.
+
+ Prior to \l{Installing Qt on Windows CE}{installation} of Qt, you need to set your
+ \c INCLUDE and \c LIB environment variables properly.
+
+ A default installation of Windows Mobile 5 for Pocket PC can be obtained by:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 7
+
+ Note that Qt will remember the path, so you do not need to set it again
+ after switching the environments for cross-compilation.
+
+ \section1 3rd Party Code
+
+ The CPU tick counters used for benchmarking is licensed under the following
+ license: (from src/testlib/3rdparty/cycle.h)
+
+ \legalese
+ Copyright (c) 2003, 2006 Matteo Frigo\br
+ Copyright (c) 2003, 2006 Massachusetts Institute of Technology
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ \endlegalese
+*/
+
+/*!
+ \page qtestlib-tutorial.html
+ \brief A short introduction to testing with QTestLib.
+ \contentspage QTestLib Manual
+ \nextpage {Chapter 1: Writing a Unit Test}{Chapter 1}
+
+ \title QTestLib Tutorial
+
+ This tutorial gives a short introduction to how to use some of the
+ features of the QTestLib framework. It is divided into four
+ chapters:
+
+ \list 1
+ \o \l {Chapter 1: Writing a Unit Test}{Writing a Unit Test}
+ \o \l {Chapter 2: Data Driven Testing}{Data Driven Testing}
+ \o \l {Chapter 3: Simulating GUI Events}{Simulating GUI Events}
+ \o \l {Chapter 4: Replaying GUI Events}{Replaying GUI Events}
+ \o \l {Chapter 5: Writing a Benchmark}{Writing a Benchmark}
+ \endlist
+
+*/
+
+
+/*!
+ \example qtestlib/tutorial1
+
+ \contentspage {QTestLib Tutorial}{Contents}
+ \nextpage {Chapter 2: Data Driven Testing}{Chapter 2}
+
+ \title Chapter 1: Writing a Unit Test
+
+ In this first chapter we will see how to write a simple unit test
+ for a class, and how to execute it.
+
+ \section1 Writing a Test
+
+ Let's assume you want to test the behavior of our QString class.
+ First, you need a class that contains your test functions. This class
+ has to inherit from QObject:
+
+ \snippet examples/qtestlib/tutorial1/testqstring.cpp 0
+
+ Note that you need to include the QTest header, and that the
+ test functions have to be declared as private slots so the
+ test framework finds and executes it.
+
+ Then you need to implement the test function itself. The
+ implementation could look like this:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 8
+
+ The \l QVERIFY() macro evaluates the expression passed as its
+ argument. If the expression evaluates to true, the execution of
+ the test function continues. Otherwise, a message describing the
+ failure is appended to the test log, and the test function stops
+ executing.
+
+ But if you want a more verbose output to the test log, you should
+ use the \l QCOMPARE() macro instead:
+
+ \snippet examples/qtestlib/tutorial1/testqstring.cpp 1
+
+ If the strings are not equal, the contents of both strings is
+ appended to the test log, making it immediately visible why the
+ comparison failed.
+
+ Finally, to make our test case a stand-alone executable, the
+ following two lines are needed:
+
+ \snippet examples/qtestlib/tutorial1/testqstring.cpp 2
+
+ The \l QTEST_MAIN() macro expands to a simple \c main()
+ method that runs all the test functions. Note that if both the
+ declaration and the implementation of our test class are in a \c
+ .cpp file, we also need to include the generated moc file to make
+ Qt's introspection work.
+
+ \section1 Executing a Test
+
+ Now that we finished writing our test, we want to execute
+ it. Assuming that our test was saved as \c testqstring.cpp in an
+ empty directory: we build the test using qmake to create a project
+ and generate a makefile.
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 9
+
+ \bold {Note:}If you're using windows, replace \c make with \c
+ nmake or whatever build tool you use.
+
+ Running the resulting executable should give you the following
+ output:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 10
+
+ Congratulations! You just wrote and executed your first unit test
+ using the QTestLib framework.
+*/
+
+/*!
+ \example qtestlib/tutorial2
+
+ \previouspage {Chapter 1: Writing a Unit Test}{Chapter 1}
+ \contentspage {QTestLib Tutorial}{Contents}
+ \nextpage {Chapter 3: Simulating Gui Events}{Chapter 3}
+
+ \title Chapter 2: Data Driven Testing
+
+ In this chapter we will demonstrate how to execute a test
+ multiple times with different test data.
+
+ So far, we have hard coded the data we wanted to test into our
+ test function. If we add more test data, the function might look like
+ this:
+
+ \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 11
+
+ To prevent that the function ends up being cluttered by repetitive
+ code, QTestLib supports adding test data to a test function. All
+ we need is to add another private slot to our test class:
+
+ \snippet examples/qtestlib/tutorial2/testqstring.cpp 0
+
+ \section1 Writing the Data Function
+
+ A test function's associated data function carries the same name,
+ appended by \c{_data}. Our data function looks like this:
+
+ \snippet examples/qtestlib/tutorial2/testqstring.cpp 1
+
+ First, we define the two elements of our test table using the \l
+ QTest::addColumn() function: A test string, and the
+ expected result of applying the QString::toUpper() function to
+ that string.
+
+ Then we add some data to the table using the \l
+ QTest::newRow() function. Each set of data will become a
+ separate row in the test table.
+
+ \l QTest::newRow() takes one argument: A name that will be
+ associated with the data set. If the test fails, the name will be
+ used in the test log, referencing the failed data. Then we
+ stream the data set into the new table row: First an arbitrary
+ string, and then the expected result of applying the
+ QString::toUpper() function to that string.
+
+ You can think of the test data as a two-dimensional table. In
+ our case, it has two columns called \c string and \c result and
+ three rows. In addition a name as well as an index is associated
+ with each row:
+
+ \table
+ \header
+ \o index
+ \o name
+ \o string
+ \o result
+ \row
+ \o 0
+ \o all lower
+ \o "hello"
+ \o HELLO
+ \row
+ \o 1
+ \o mixed
+ \o "Hello"
+ \o HELLO
+ \row
+ \o 2
+ \o all upper
+ \o "HELLO"
+ \o HELLO
+ \endtable
+
+ \section1 Rewriting the Test Function
+
+ Our test function can now be rewritten:
+
+ \snippet examples/qtestlib/tutorial2/testqstring.cpp 2
+
+ The TestQString::toUpper() function will be executed three times,
+ once for each entry in the test table that we created in the
+ associated TestQString::toUpper_data() function.
+
+ First, we fetch the two elements of the data set using the \l
+ QFETCH() macro. \l QFETCH() takes two arguments: The data type of
+ the element and the element name. Then we perform the test using
+ the \l QCOMPARE() macro.
+
+ This approach makes it very easy to add new data to the test
+ without modifying the test itself.
+
+ And again, to make our test case a stand-alone executable,
+ the following two lines are needed:
+
+ \snippet examples/qtestlib/tutorial2/testqstring.cpp 3
+
+ As before, the QTEST_MAIN() macro expands to a simple main()
+ method that runs all the test functions, and since both the
+ declaration and the implementation of our test class are in a .cpp
+ file, we also need to include the generated moc file to make Qt's
+ introspection work.
+*/
+
+/*!
+ \example qtestlib/tutorial3
+
+ \previouspage {Chapter 2 Data Driven Testing}{Chapter 2}
+ \contentspage {QTestLib Tutorial}{Contents}
+ \nextpage {Chapter 4: Replaying GUI Events}{Chapter 4}
+
+ \title Chapter 3: Simulating GUI Events
+
+ QTestLib features some mechanisms to test graphical user
+ interfaces. Instead of simulating native window system events,
+ QTestLib sends internal Qt events. That means there are no
+ side-effects on the machine the tests are running on.
+
+ In this chapter we will se how to write a simple GUI test.
+
+ \section1 Writing a GUI test
+
+ This time, let's assume you want to test the behavior of our
+ QLineEdit class. As before, you will need a class that contains
+ your test function:
+
+ \snippet examples/qtestlib/tutorial3/testgui.cpp 0
+
+ The only difference is that you need to include the QtGui class
+ definitions in addition to the QTest namespace.
+
+ \snippet examples/qtestlib/tutorial3/testgui.cpp 1
+
+ In the implementation of the test function we first create a
+ QLineEdit. Then we simulate writing "hello world" in the line edit
+ using the \l QTest::keyClicks() function.
+
+ \note The widget must also be shown in order to correctly test keyboard
+ shortcuts.
+
+ QTest::keyClicks() simulates clicking a sequence of keys on a
+ widget. Optionally, a keyboard modifier can be specified as well
+ as a delay (in milliseconds) of the test after each key click. In
+ a similar way, you can use the QTest::keyClick(),
+ QTest::keyPress(), QTest::keyRelease(), QTest::mouseClick(),
+ QTest::mouseDClick(), QTest::mouseMove(), QTest::mousePress()
+ and QTest::mouseRelease() functions to simulate the associated
+ GUI events.
+
+ Finally, we use the \l QCOMPARE() macro to check if the line edit's
+ text is as expected.
+
+ As before, to make our test case a stand-alone executable, the
+ following two lines are needed:
+
+ \snippet examples/qtestlib/tutorial3/testgui.cpp 2
+
+ The QTEST_MAIN() macro expands to a simple main() method that
+ runs all the test functions, and since both the declaration and
+ the implementation of our test class are in a .cpp file, we also
+ need to include the generated moc file to make Qt's introspection
+ work.
+*/
+
+/*!
+ \example qtestlib/tutorial4
+
+ \previouspage {Chapter 3: Simulating GUI Event}{Chapter 3}
+ \contentspage {QTestLib Tutorial}{Contents}
+ \nextpage {Chapter 5: Writing a Benchmark}{Chapter 5}
+
+ \title Chapter 4: Replaying GUI Events
+
+ In this chapter, we will show how to simulate a GUI event,
+ and how to store a series of GUI events as well as replay them on
+ a widget.
+
+ The approach to storing a series of events and replay them, is
+ quite similar to the approach explained in \l {Chapter 2:
+ Data Driven Testing}{chapter 2}; all you need is to add a data
+ function to your test class:
+
+ \snippet examples/qtestlib/tutorial4/testgui.cpp 0
+
+ \section1 Writing the Data Function
+
+ As before, a test function's associated data function carries the
+ same name, appended by \c{_data}.
+
+ \snippet examples/qtestlib/tutorial4/testgui.cpp 1
+
+ First, we define the elements of the table using the
+ QTest::addColumn() function: A list of GUI events, and the
+ expected result of applying the list of events on a QWidget. Note
+ that the type of the first element is \l QTestEventList.
+
+ A QTestEventList can be populated with GUI events that can be
+ stored as test data for later usage, or be replayed on any
+ QWidget.
+
+ In our current data function, we create two \l
+ {QTestEventList}s. The first list consists of a single click to
+ the 'a' key. We add the event to the list using the
+ QTestEventList::addKeyClick() function. Then we use the
+ QTest::newRow() function to give the data set a name, and
+ stream the event list and the expected result into the table.
+
+ The second list consists of two key clicks: an 'a' with a
+ following 'backspace'. Again we use the
+ QTestEventList::addKeyClick() to add the events to the list, and
+ QTest::newRow() to put the event list and the expected
+ result into the table with an associated name.
+
+ \section1 Rewriting the Test Function
+
+ Our test can now be rewritten:
+
+ \snippet examples/qtestlib/tutorial4/testgui.cpp 2
+
+ The TestGui::testGui() function will be executed two times,
+ once for each entry in the test data that we created in the
+ associated TestGui::testGui_data() function.
+
+ First, we fetch the two elements of the data set using the \l
+ QFETCH() macro. \l QFETCH() takes two arguments: The data type of
+ the element and the element name. Then we create a QLineEdit, and
+ apply the list of events on that widget using the
+ QTestEventList::simulate() function.
+
+ Finally, we use the QCOMPARE() macro to check if the line edit's
+ text is as expected.
+
+ As before, to make our test case a stand-alone executable,
+ the following two lines are needed:
+
+ \snippet examples/qtestlib/tutorial4/testgui.cpp 3
+
+ The QTEST_MAIN() macro expands to a simple main() method that
+ runs all the test functions, and since both the declaration and
+ the implementation of our test class are in a .cpp file, we also
+ need to include the generated moc file to make Qt's introspection
+ work.
+*/
+
+/*!
+ \example qtestlib/tutorial5
+
+ \previouspage {Chapter 4: Replaying GUI Events}{Chapter 4}
+ \contentspage {QTestLib Tutorial}{Contents}
+
+ \title Chapter 5: Writing a Benchmark
+
+ In this final chapter we will demonstrate how to write benchmarks
+ using QTestLib.
+
+ \section1 Writing a Benchmark
+ To create a benchmark we extend a test function with a QBENCHMARK macro.
+ A benchmark test function will then typically consist of setup code and
+ a QBENCHMARK macro that contains the code to be measured. This test
+ function benchmarks QString::localeAwareCompare().
+
+ \snippet examples/qtestlib/tutorial5/benchmarking.cpp 0
+
+ Setup can be done at the beginning of the function, the clock is not
+ running at this point. The code inside the QBENCHMARK macro will be
+ measured, and possibly repeated several times in order to get an
+ accurate measurement.
+
+ Several \l {testlib-benchmarking-measurement}{back-ends} are available
+ and can be selected on the command line.
+
+ \section1 Data Functions
+
+ Data functions are useful for creating benchmarks that compare
+ multiple data inputs, for example locale aware compare against standard
+ compare.
+
+ \snippet examples/qtestlib/tutorial5/benchmarking.cpp 1
+
+ The test function then uses the data to determine what to benchmark.
+
+ \snippet examples/qtestlib/tutorial5/benchmarking.cpp 2
+
+ The "if(useLocaleCompare)" switch is placed outside the QBENCHMARK
+ macro to avoid measuring its overhead. Each benchmark test function
+ can have one active QBENCHMARK macro.
+
+ \section1 External Tools
+
+ Tools for handling and visualizing test data are available as part of
+ the \l{qtestlib-tools} project on the Qt Labs Web site. These include
+ a tool for comparing performance data obtained from test runs and a
+ utility to generate Web-based graphs of performance data.
+
+ See the \l{qtestlib-tools Announcement} for more information on these
+ tools and a simple graphing example.
+
+*/
+
+
+
diff --git a/doc/src/development/rcc.qdoc b/doc/src/development/rcc.qdoc
new file mode 100644
index 0000000..7069674
--- /dev/null
+++ b/doc/src/development/rcc.qdoc
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page rcc.html
+ \title Resource Compiler (rcc)
+ \ingroup qttools
+ \keyword rcc
+
+ The \c rcc tool is used to embed resources into a Qt application during
+ the build process. It works by generating a C++ source file containing
+ data specified in a Qt resource (.qrc) file.
+
+ Usage:
+ \snippet doc/src/snippets/code/doc_src_rcc.qdoc 0
+
+ RCC accepts the following command line options:
+
+ \table
+ \header \o Option \o Argument \o Description
+
+ \row \o \c{-o} \o \o Writes output to file rather than
+ stdout.
+
+ \row \o \c{-name} \o \c name \o Creates an external initialization
+ function with name.
+
+ \row \o \c{-threshold} \o \c level \o Specifies a threshold (in bytes)
+ to use when compressing files. If
+ the file is smaller than the
+ threshold, it will not be
+ compressed, independent of what
+ the compression level is.
+
+ \row \o \c{-compress} \o \c level \o Compresses input files with the
+ given level. Level is an integer
+ from 1 to 9 - 1 being the fastest,
+ producing the least compression;
+ 9 being the slowest, producing
+ the most compression.
+
+ \row \o \c{-root} \o \c path \o Prefixes the resource access path
+ with root path.
+
+ \row \o \c{-no-compress} \o \o Disables all compression.
+
+ \row \o \c{-binary} \o \o Outputs a binary file for use as
+ a dynamic resource.
+
+ \row \o \c{-version} \o \o Displays version information.
+
+ \row \o \c{-help} \o \o Displays usage information.
+ \endtable
+
+ See also \l{The Qt Resource System} for more information about embedding
+ resources in Qt applications.
+*/
diff --git a/doc/src/development/tools-list.qdoc b/doc/src/development/tools-list.qdoc
new file mode 100644
index 0000000..8533a6f
--- /dev/null
+++ b/doc/src/development/tools-list.qdoc
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group qttools
+ \title Qt's Tools
+
+ Qt is supplied with several command line and graphical tools to
+ ease and speed the development process. Each tool is listed here
+ with a link to its documentation.
+
+ \table
+ \header \o Tool \o Description
+ \row \o \l{Qt Designer Manual}{Qt Designer}
+ \o Create forms visually.
+ \row \o \l{Qt Assistant Manual}{Qt Assistant}
+ \o Quickly find the help you need.
+ \row \o \l{Qt Linguist Manual}{Qt Linguist, lupdate, lrelease, lconvert}
+ \o Translate applications to reach international markets.
+ \row \o \l{qmake Manual}{qmake}
+ \o Create makefiles from simple platform-independent project files (\c .pro files).
+ \row \o \l{The Virtual Framebuffer}{qvfb}
+ \o Run and test embedded applications on the desktop.
+ \row \o \l{makeqpf}
+ \o Create pre-rendered fonts for embedded devices.
+ \row \o \l{moc}{Meta-Object Compiler (moc)}
+ \o Generate meta-object information for QObject subclasses.
+ \row \o \l{User Interface Compiler (uic)}
+ \o Generate C++ code from user interface files.
+ \row \o \l{Resource Compiler (rcc)}
+ \o Embed resources into Qt applications during the build process.
+ \row \o \l{Configuring Qt}{Configuring Qt (qtconfig)}
+ \o X11-based Qt configuration tool with online help.
+ \row \o \l{Fine-Tuning Features in Qt}{Configuring Qt Embedded (qconfig)}
+ \o Qt Embedded (Linux and Windows CE) configuration tool.
+ \row \o \l{Examples and Demos Launcher}
+ \o A launcher for Qt's Examples and Demonstration programs.
+ \row \o \l{qt3to4 - The Qt 3 to 4 Porting Tool}
+ \o A tool to assist in porting applications from Qt 3 to Qt 4.
+ \row \o \l{QtDBus XML compiler (qdbusxml2cpp)}
+ \o A tool to convert D-Bus interface descriptions to C++ source code.
+ \row \o \l{D-Bus Viewer}
+ \o A tool to introspect D-Bus objects and messages.
+ \endtable
+
+*/
diff --git a/doc/src/development/uic.qdoc b/doc/src/development/uic.qdoc
new file mode 100644
index 0000000..ce20c7a
--- /dev/null
+++ b/doc/src/development/uic.qdoc
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page uic.html
+ \title User Interface Compiler (uic)
+ \ingroup qttools
+ \keyword uic
+
+ \omit KEEP THIS FILE SYNCHRONIZED WITH uic.1 \endomit
+
+ This page documents the \e{User Interface Compiler} for the Qt GUI
+ toolkit. The \c uic reads an XML format user interface definition
+ (\c .ui) file as generated by \l{designer-manual.html}{Qt
+ Designer} and creates a corresponding C++ header file.
+
+ Usage:
+ \snippet doc/src/snippets/code/doc_src_uic.qdoc 0
+
+ \section1 Options
+
+ The following table lists the command-line options recognized by
+ \c uic.
+
+ \table
+ \header \o Option \o Description
+ \row \o \c{-o <file>} \o Write output to \c <file> instead of to standard output.
+ \row \o \c{-tr <func>} \o Use \c <func> for translating strings instead of \c tr().
+ \row \o \c{-p} \o Don't generate guards against multiple inclusion (\c #ifndef FOO_H ...).
+ \row \o \c{-h} \o Display the usage and the list of options.
+ \row \o \c{-v} \o Display \c{uic}'s version number.
+ \endtable
+
+ \section1 Examples
+
+ If you use \c qmake, \c uic will be invoked automatically for
+ header files.
+
+ Here are useful makefile rules if you only use GNU make:
+
+ \snippet doc/src/snippets/code/doc_src_uic.qdoc 1
+
+ If you want to write portably, you can use individual rules of the
+ following form:
+
+ \snippet doc/src/snippets/code/doc_src_uic.qdoc 2
+
+ You must also remember to add \c{ui_foo.h} to your \c HEADERS
+ (substitute your favorite name).
+*/
diff --git a/doc/src/diagrams/animations-architecture.svg b/doc/src/diagrams/animations-architecture.svg
new file mode 100644
index 0000000..0246510
--- /dev/null
+++ b/doc/src/diagrams/animations-architecture.svg
@@ -0,0 +1,351 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="950.00006"
+ height="365.28983"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="animations-architecture.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.0">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible">
+ <path
+ id="path3736"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path3730"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3712"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutL"
+ style="overflow:visible">
+ <path
+ id="path3852"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="scale(0.8,0.8)" />
+ </marker>
+ <linearGradient
+ id="linearGradient3165">
+ <stop
+ style="stop-color:#c8c8dc;stop-opacity:1;"
+ offset="0"
+ id="stop3167" />
+ <stop
+ style="stop-color:#b4b4c8;stop-opacity:0;"
+ offset="1"
+ id="stop3169" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="linearGradient3171"
+ x1="249.25"
+ y1="89.862183"
+ x2="475.75"
+ y2="89.862183"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2195969,0,0,3.7006494,-257.93754,-842.42203)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="linearGradient3183"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2195969,0,0,3.7006494,-383.02298,-676.69717)"
+ x1="249.25"
+ y1="89.862183"
+ x2="475.75"
+ y2="89.862183" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="linearGradient3191"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2195969,0,0,3.7006494,-382.93759,-1004.922)"
+ x1="249.25"
+ y1="89.862183"
+ x2="475.75"
+ y2="89.862183" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="linearGradient7165"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2195969,0,0,3.7006494,-483.69907,-593.77419)"
+ x1="249.25"
+ y1="89.862183"
+ x2="475.75"
+ y2="89.862183" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="linearGradient7195"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2195969,0,0,3.7006494,-571.87523,-1167.422)"
+ x1="249.25"
+ y1="89.862183"
+ x2="475.75"
+ y2="89.862183" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="linearGradient7203"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2195969,0,0,3.7006494,-572.46592,-841.2256)"
+ x1="249.25"
+ y1="89.862183"
+ x2="475.75"
+ y2="89.862183" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.98994949"
+ inkscape:cx="276.75951"
+ inkscape:cy="155.06417"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:snap-bbox="true"
+ inkscape:window-width="1592"
+ inkscape:window-height="1124"
+ inkscape:window-x="0"
+ inkscape:window-y="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2383"
+ visible="true"
+ enabled="true"
+ units="pt"
+ spacingx="2pt"
+ spacingy="2pt" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-121.77519,-152.95286)">
+ <rect
+ style="opacity:1;fill:url(#linearGradient3171);fill-opacity:1;stroke:#202020;stroke-width:1.35220754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2385"
+ width="49.409317"
+ height="277.54871"
+ x="-203.03828"
+ y="-648.64777"
+ ry="12.582828"
+ rx="10.562523"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono"
+ x="380.311"
+ y="185.86879"
+ id="text3173"
+ sodipodi:linespacing="100%"><tspan
+ sodipodi:role="line"
+ id="tspan3175"
+ x="380.311"
+ y="185.86879">QAbstractAnimation</tspan></text>
+ <rect
+ style="opacity:1;fill:url(#linearGradient3183);fill-opacity:1;stroke:#202020;stroke-width:1.35220754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3177"
+ width="49.409317"
+ height="277.54871"
+ x="-328.12369"
+ y="-482.92297"
+ ry="12.582828"
+ rx="10.562523"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono"
+ x="221.80489"
+ y="310.95419"
+ id="text3179"
+ sodipodi:linespacing="100%"><tspan
+ sodipodi:role="line"
+ id="tspan3181"
+ x="221.80489"
+ y="310.95419">QVariantAnimation</tspan></text>
+ <rect
+ style="opacity:1;fill:url(#linearGradient3191);fill-opacity:1;stroke:#202020;stroke-width:1.35220754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3185"
+ width="49.409317"
+ height="277.54871"
+ x="-328.03827"
+ y="-811.14777"
+ ry="12.582828"
+ rx="10.562523"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono"
+ x="564.13324"
+ y="310.86877"
+ id="text3187"
+ sodipodi:linespacing="100%"><tspan
+ sodipodi:role="line"
+ id="tspan3189"
+ x="564.13324"
+ y="310.86877">QAnimationGroup</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 346.77519,279.39048 L 346.77519,241.89048 L 509.27519,241.89048 L 509.27519,204.39048"
+ id="path3195"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 671.77519,279.39048 L 671.77519,241.89048 L 509.27519,241.89048"
+ id="path7137"
+ sodipodi:nodetypes="ccc" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient7165);fill-opacity:1;stroke:#202020;stroke-width:1.35220754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7159"
+ width="49.409317"
+ height="277.54871"
+ x="-428.7998"
+ y="-400"
+ ry="12.582828"
+ rx="10.562523"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono"
+ x="131.66315"
+ y="411.63031"
+ id="text7161"
+ sodipodi:linespacing="100%"><tspan
+ sodipodi:role="line"
+ id="tspan7163"
+ x="131.66315"
+ y="411.63031">QPropertyAnimation</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 309.27519,379.39048 L 309.27519,329.39048"
+ id="path7167"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient7195);fill-opacity:1;stroke:#202020;stroke-width:1.35220754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7189"
+ width="49.409317"
+ height="375"
+ x="-516.97589"
+ y="-1071.0991"
+ ry="12.582828"
+ rx="10.562523"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono"
+ x="703.17139"
+ y="499.8064"
+ id="text7191"
+ sodipodi:linespacing="100%"><tspan
+ sodipodi:role="line"
+ id="tspan7193"
+ x="703.17139"
+ y="499.8064">QSequentialAnimationGroup</tspan></text>
+ <rect
+ style="opacity:1;fill:url(#linearGradient7203);fill-opacity:1;stroke:#202020;stroke-width:1.35220754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect7197"
+ width="50"
+ height="350"
+ x="-517.56659"
+ y="-647.45129"
+ ry="12.582828"
+ rx="10.562523"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono"
+ x="306.46109"
+ y="500.39709"
+ id="text7199"
+ sodipodi:linespacing="100%"><tspan
+ sodipodi:role="line"
+ id="tspan7201"
+ x="306.46109"
+ y="500.39709">QParallelAnimationGroup</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 859.27519,466.89048 L 859.27519,391.89048 L 671.77519,391.89048"
+ id="path7205"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;marker-mid:none;marker-end:url(#Arrow2Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 496.77519,466.89048 L 496.77519,391.89048 L 671.77519,391.89048 L 671.77519,329.39048"
+ id="path7207"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/doc/src/diagrams/dbus-examples.png b/doc/src/diagrams/dbus-examples.png
new file mode 100644
index 0000000..816a9ab
--- /dev/null
+++ b/doc/src/diagrams/dbus-examples.png
Binary files differ
diff --git a/doc/src/diagrams/dependencies.lout b/doc/src/diagrams/dependencies.lout
index d20f4f1..256f7de 100644
--- a/doc/src/diagrams/dependencies.lout
+++ b/doc/src/diagrams/dependencies.lout
@@ -1,7 +1,13 @@
+# This file is used to create x11_dependencies.sk, which is then converted to a PNG image.
+#
+# lout -EPS -o dependencies.eps dependencies.lout
+# pstoedit -f sk dependencies.eps x11_dependencies.sk
+# makeimage.py x11_dependencies.sk x11_dependencies.png 0.25 --anti-alias
+
@SysInclude { picture }
@SysInclude { tbl }
@SysInclude { diag }
-# lout -EPS dependencies.lout > dependencies.eps
+
macro @TTGreenColour { {cmyk 0.40 0.00 1.00 0.01} }
macro @TTPurpleColour { {cmyk 0.39 0.39 0.00 0.00} }
macro @DefaultColour { rgb { 0.961 0.961 0.863 } }
@@ -41,31 +47,33 @@ macro @GlibColour { rgb { 0.7 0.7 0.7 } }
div { top }
# fmarginbelow { 0c }
- aformat { @Cell A | @Cell B | @Cell marginbelow { 0c } font { +2p } C | @Cell D | @Cell E }
- bformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F }
- cformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell marginleft { 1.5c } E | @Cell F }
- dformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F }
- eformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F }
- fformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F }
- gformat { @Cell A | @Cell B | @Cell C | @Cell D | @StartHSpan @Cell E | @HSpan }
+ aformat { @Cell A | @Cell B | @StartHSpan @Cell marginbelow { 0c } font { +2p } C | @HSpan | @HSpan | @Cell F | @Cell G}
+ bformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F | @Cell G }
+ cformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell marginleft { 1.5c } F | @Cell G }
+ dformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F | @Cell G }
+ eformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F | @Cell G }
+ fformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F | @Cell G }
+ gformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @StartHSpan @Cell F | @HSpan }
{
@Rowa C { Qt"/"X11 library dependencies }
- @Rowb C { QTGUI:: @Node paint { @TTGreenColour } QtGui }
- @Rowc B { XCURSOR:: @Node paint { @OptionalColour } Xcursor }
- C { XRANDR:: @Node paint { @OptionalColour } Xrandr }
- D { XINERAMA:: @Node paint { @OptionalColour } Xinerama }
- E { Xi:: @Node paint { @OptionalColour } Xi }
- @Rowd C { XRENDER:: @Node paint { @OptionalColour } XRender }
- F { Xt:: @Node paint { @DefaultColour } Xt* }
- @Rowe A { QTCORE:: @Node paint { @TTPurpleColour } QtCore }
- C { XFIXES:: @Node paint { @OptionalColour } Xfixes }
- D { XEXT:: @Node paint { @DefaultColour } Xext }
- F { SM:: @Node paint { @SMColour } SM }
- @Rowf A { PTHREAD:: @Node paint { @PthreadColour } pthread }
- B { GLIB:: @Node paint { @GlibColour } Glib }
- D { X:: @Node paint { @DefaultColour } X11 }
- F { ICE:: @Node paint { @SMColour } ICE }
- @Rowg E {
+ @Rowb D { QTGUI:: @Node paint { @TTGreenColour } QtGui }
+ @Rowc C { XCURSOR:: @Node paint { @OptionalColour } Xcursor }
+ D { XRANDR:: @Node paint { @OptionalColour } Xrandr }
+ E { XINERAMA:: @Node paint { @OptionalColour } Xinerama }
+ F { Xi:: @Node paint { @OptionalColour } Xi }
+ @Rowd A { FONTCONFIG:: @Node paint { @OptionalColour } Fontconfig }
+ D { XRENDER:: @Node paint { @OptionalColour } XRender }
+ G { Xt:: @Node paint { @DefaultColour } Xt* }
+ @Rowe A { FREETYPE:: @Node paint { @OptionalColour } FreeType }
+ B { QTCORE:: @Node paint { @TTPurpleColour } QtCore }
+ D { XFIXES:: @Node paint { @OptionalColour } Xfixes }
+ E { XEXT:: @Node paint { @DefaultColour } Xext }
+ G { SM:: @Node paint { @SMColour } SM }
+ @Rowf B { PTHREAD:: @Node paint { @PthreadColour } pthread }
+ C { GLIB:: @Node paint { @GlibColour } Glib }
+ E { X:: @Node paint { @DefaultColour } X11 }
+ G { ICE:: @Node paint { @SMColour } ICE }
+ @Rowg F {
@Tbl
font { -2p }
margin { 0.15f }
@@ -101,6 +109,9 @@ macro @GlibColour { rgb { 0.7 0.7 0.7 } }
@Arrow from { XEXT } to { X }
@VHCurveArrow from { XCURSOR } to { XFIXES }
@VHVCurveArrow from { XFIXES } to { X }
+@HVCurveArrow from { QTGUI } to { FONTCONFIG } pathstyle { dotted }
+@Arrow from { FONTCONFIG } to { FREETYPE } pathstyle { dotted }
+@VHVCurveArrow from { FREETYPE } to { PTHREAD }
@Link from { C@W } to { D@E } pathstyle { dotted }
}
}
diff --git a/doc/src/diagrams/designer-adding-dockwidget.txt b/doc/src/diagrams/designer-manual/designer-adding-dockwidget.txt
index 97b4beb..97b4beb 100644
--- a/doc/src/diagrams/designer-adding-dockwidget.txt
+++ b/doc/src/diagrams/designer-manual/designer-adding-dockwidget.txt
diff --git a/doc/src/diagrams/designer-adding-dockwidget1.png b/doc/src/diagrams/designer-manual/designer-adding-dockwidget1.png
index 960da83..960da83 100644
--- a/doc/src/diagrams/designer-adding-dockwidget1.png
+++ b/doc/src/diagrams/designer-manual/designer-adding-dockwidget1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-dockwidget1.zip b/doc/src/diagrams/designer-manual/designer-adding-dockwidget1.zip
index 0492df6..0492df6 100644
--- a/doc/src/diagrams/designer-adding-dockwidget1.zip
+++ b/doc/src/diagrams/designer-manual/designer-adding-dockwidget1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-menu-action1.png b/doc/src/diagrams/designer-manual/designer-adding-menu-action1.png
index cde92d9..cde92d9 100644
--- a/doc/src/diagrams/designer-adding-menu-action1.png
+++ b/doc/src/diagrams/designer-manual/designer-adding-menu-action1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-menu-action1.zip b/doc/src/diagrams/designer-manual/designer-adding-menu-action1.zip
index 08395eb..08395eb 100644
--- a/doc/src/diagrams/designer-adding-menu-action1.zip
+++ b/doc/src/diagrams/designer-manual/designer-adding-menu-action1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-menu-action2.zip b/doc/src/diagrams/designer-manual/designer-adding-menu-action2.zip
index ca1a5b3..ca1a5b3 100644
--- a/doc/src/diagrams/designer-adding-menu-action2.zip
+++ b/doc/src/diagrams/designer-manual/designer-adding-menu-action2.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-toolbar-action1.png b/doc/src/diagrams/designer-manual/designer-adding-toolbar-action1.png
index 6b82373..6b82373 100644
--- a/doc/src/diagrams/designer-adding-toolbar-action1.png
+++ b/doc/src/diagrams/designer-manual/designer-adding-toolbar-action1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-toolbar-action1.zip b/doc/src/diagrams/designer-manual/designer-adding-toolbar-action1.zip
index e673b3c..e673b3c 100644
--- a/doc/src/diagrams/designer-adding-toolbar-action1.zip
+++ b/doc/src/diagrams/designer-manual/designer-adding-toolbar-action1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-toolbar-action2.zip b/doc/src/diagrams/designer-manual/designer-adding-toolbar-action2.zip
index 96a9d69..96a9d69 100644
--- a/doc/src/diagrams/designer-adding-toolbar-action2.zip
+++ b/doc/src/diagrams/designer-manual/designer-adding-toolbar-action2.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-dynamic-property.png b/doc/src/diagrams/designer-manual/designer-creating-dynamic-property.png
index 1c3d3ca..1c3d3ca 100644
--- a/doc/src/diagrams/designer-creating-dynamic-property.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-dynamic-property.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry1.png b/doc/src/diagrams/designer-manual/designer-creating-menu-entry1.png
index 33aa0d6..33aa0d6 100644
--- a/doc/src/diagrams/designer-creating-menu-entry1.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu-entry1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry1.zip b/doc/src/diagrams/designer-manual/designer-creating-menu-entry1.zip
index f9e64c8..f9e64c8 100644
--- a/doc/src/diagrams/designer-creating-menu-entry1.zip
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu-entry1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry2.png b/doc/src/diagrams/designer-manual/designer-creating-menu-entry2.png
index 8338d08..8338d08 100644
--- a/doc/src/diagrams/designer-creating-menu-entry2.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu-entry2.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry2.zip b/doc/src/diagrams/designer-manual/designer-creating-menu-entry2.zip
index 67d81e4..67d81e4 100644
--- a/doc/src/diagrams/designer-creating-menu-entry2.zip
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu-entry2.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry3.png b/doc/src/diagrams/designer-manual/designer-creating-menu-entry3.png
index d242646..d242646 100644
--- a/doc/src/diagrams/designer-creating-menu-entry3.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu-entry3.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry3.zip b/doc/src/diagrams/designer-manual/designer-creating-menu-entry3.zip
index d530186..d530186 100644
--- a/doc/src/diagrams/designer-creating-menu-entry3.zip
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu-entry3.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry4.png b/doc/src/diagrams/designer-manual/designer-creating-menu-entry4.png
index 07a49ba..07a49ba 100644
--- a/doc/src/diagrams/designer-creating-menu-entry4.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu-entry4.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry4.zip b/doc/src/diagrams/designer-manual/designer-creating-menu-entry4.zip
index d800c31..d800c31 100644
--- a/doc/src/diagrams/designer-creating-menu-entry4.zip
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu-entry4.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu.txt b/doc/src/diagrams/designer-manual/designer-creating-menu.txt
index b5b2934..b5b2934 100644
--- a/doc/src/diagrams/designer-creating-menu.txt
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu.txt
diff --git a/doc/src/diagrams/designer-creating-menu1.png b/doc/src/diagrams/designer-manual/designer-creating-menu1.png
index d92a88a..d92a88a 100644
--- a/doc/src/diagrams/designer-creating-menu1.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu1.zip b/doc/src/diagrams/designer-manual/designer-creating-menu1.zip
index 780b1ac..780b1ac 100644
--- a/doc/src/diagrams/designer-creating-menu1.zip
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu2.png b/doc/src/diagrams/designer-manual/designer-creating-menu2.png
index 7be4891..7be4891 100644
--- a/doc/src/diagrams/designer-creating-menu2.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu2.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu2.zip b/doc/src/diagrams/designer-manual/designer-creating-menu2.zip
index 00664a6..00664a6 100644
--- a/doc/src/diagrams/designer-creating-menu2.zip
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu2.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu3.png b/doc/src/diagrams/designer-manual/designer-creating-menu3.png
index c2f1beb..c2f1beb 100644
--- a/doc/src/diagrams/designer-creating-menu3.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu3.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu3.zip b/doc/src/diagrams/designer-manual/designer-creating-menu3.zip
index 76ecbe0..76ecbe0 100644
--- a/doc/src/diagrams/designer-creating-menu3.zip
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu3.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu4.png b/doc/src/diagrams/designer-manual/designer-creating-menu4.png
index 3a3ab54..3a3ab54 100644
--- a/doc/src/diagrams/designer-creating-menu4.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menu4.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menubar.png b/doc/src/diagrams/designer-manual/designer-creating-menubar.png
index e8078e0..e8078e0 100644
--- a/doc/src/diagrams/designer-creating-menubar.png
+++ b/doc/src/diagrams/designer-manual/designer-creating-menubar.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menubar.zip b/doc/src/diagrams/designer-manual/designer-creating-menubar.zip
index bddbf0e..bddbf0e 100644
--- a/doc/src/diagrams/designer-creating-menubar.zip
+++ b/doc/src/diagrams/designer-manual/designer-creating-menubar.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-edit-resource.zip b/doc/src/diagrams/designer-manual/designer-edit-resource.zip
index dc43d9e..dc43d9e 100644
--- a/doc/src/diagrams/designer-edit-resource.zip
+++ b/doc/src/diagrams/designer-manual/designer-edit-resource.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-find-icon.zip b/doc/src/diagrams/designer-manual/designer-find-icon.zip
index e94abd9..e94abd9 100644
--- a/doc/src/diagrams/designer-find-icon.zip
+++ b/doc/src/diagrams/designer-manual/designer-find-icon.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-form-layoutfunction-crop.png b/doc/src/diagrams/designer-manual/designer-form-layoutfunction-crop.png
index e8dd39f..e8dd39f 100644
--- a/doc/src/diagrams/designer-form-layoutfunction-crop.png
+++ b/doc/src/diagrams/designer-manual/designer-form-layoutfunction-crop.png
Binary files differ
diff --git a/doc/src/diagrams/designer-form-layoutfunction.png b/doc/src/diagrams/designer-manual/designer-form-layoutfunction.png
index 9101e89..9101e89 100644
--- a/doc/src/diagrams/designer-form-layoutfunction.png
+++ b/doc/src/diagrams/designer-manual/designer-form-layoutfunction.png
Binary files differ
diff --git a/doc/src/diagrams/designer-form-layoutfunction.zip b/doc/src/diagrams/designer-manual/designer-form-layoutfunction.zip
index fcce637..fcce637 100644
--- a/doc/src/diagrams/designer-form-layoutfunction.zip
+++ b/doc/src/diagrams/designer-manual/designer-form-layoutfunction.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-main-window.zip b/doc/src/diagrams/designer-manual/designer-main-window.zip
index 69b7ee6..69b7ee6 100644
--- a/doc/src/diagrams/designer-main-window.zip
+++ b/doc/src/diagrams/designer-manual/designer-main-window.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-mainwindow-actions.ui b/doc/src/diagrams/designer-manual/designer-mainwindow-actions.ui
index 593a2de..593a2de 100644
--- a/doc/src/diagrams/designer-mainwindow-actions.ui
+++ b/doc/src/diagrams/designer-manual/designer-mainwindow-actions.ui
diff --git a/doc/src/diagrams/designer-palette-brush-editor.zip b/doc/src/diagrams/designer-manual/designer-palette-brush-editor.zip
index 698f271..698f271 100644
--- a/doc/src/diagrams/designer-palette-brush-editor.zip
+++ b/doc/src/diagrams/designer-manual/designer-palette-brush-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-palette-editor.zip b/doc/src/diagrams/designer-manual/designer-palette-editor.zip
index 96646ab..96646ab 100644
--- a/doc/src/diagrams/designer-palette-editor.zip
+++ b/doc/src/diagrams/designer-manual/designer-palette-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-palette-gradient-editor.zip b/doc/src/diagrams/designer-manual/designer-palette-gradient-editor.zip
index 4696516..4696516 100644
--- a/doc/src/diagrams/designer-palette-gradient-editor.zip
+++ b/doc/src/diagrams/designer-manual/designer-palette-gradient-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-palette-pattern-editor.zip b/doc/src/diagrams/designer-manual/designer-palette-pattern-editor.zip
index 7382bad..7382bad 100644
--- a/doc/src/diagrams/designer-palette-pattern-editor.zip
+++ b/doc/src/diagrams/designer-manual/designer-palette-pattern-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-resource-editor.zip b/doc/src/diagrams/designer-manual/designer-resource-editor.zip
index 2c11da4..2c11da4 100644
--- a/doc/src/diagrams/designer-resource-editor.zip
+++ b/doc/src/diagrams/designer-manual/designer-resource-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-widget-box.zip b/doc/src/diagrams/designer-manual/designer-widget-box.zip
index 7ba8f77..7ba8f77 100644
--- a/doc/src/diagrams/designer-widget-box.zip
+++ b/doc/src/diagrams/designer-manual/designer-widget-box.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-manual/rgbController.ui b/doc/src/diagrams/designer-manual/rgbController.ui
new file mode 100644
index 0000000..37c839f
--- /dev/null
+++ b/doc/src/diagrams/designer-manual/rgbController.ui
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>RGB Controller</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>RED</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QSpinBox" name="spinBox">
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QSlider" name="verticalSlider">
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>GREEN</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QSpinBox" name="spinBox_2">
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QSlider" name="verticalSlider_2">
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>BLUE</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QSpinBox" name="spinBox_3">
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QSlider" name="verticalSlider_3">
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ <zorder>label</zorder>
+ <zorder>label_2</zorder>
+ <zorder>label_3</zorder>
+ <zorder>spinBox</zorder>
+ <zorder>spinBox_2</zorder>
+ <zorder>spinBox_3</zorder>
+ <zorder>verticalSlider</zorder>
+ <zorder>verticalSlider_2</zorder>
+ <zorder>verticalSlider_3</zorder>
+ <zorder>verticalSlider</zorder>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>spinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>verticalSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>55</x>
+ <y>51</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>53</x>
+ <y>233</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>spinBox_2</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>verticalSlider_2</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>193</x>
+ <y>46</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>186</x>
+ <y>105</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>spinBox_3</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>verticalSlider_3</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>312</x>
+ <y>38</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>312</x>
+ <y>132</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>verticalSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>spinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>57</x>
+ <y>86</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>73</x>
+ <y>46</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>verticalSlider_2</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>spinBox_2</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>187</x>
+ <y>135</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>212</x>
+ <y>44</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>verticalSlider_3</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>spinBox_3</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>315</x>
+ <y>187</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>349</x>
+ <y>50</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/doc/src/diagrams/programs/easingcurve/easingcurve.pro b/doc/src/diagrams/programs/easingcurve/easingcurve.pro
new file mode 100644
index 0000000..0b80127
--- /dev/null
+++ b/doc/src/diagrams/programs/easingcurve/easingcurve.pro
@@ -0,0 +1,13 @@
+######################################################################
+# Automatically generated by qmake (2.01a) fr 13. feb 13:26:38 2009
+######################################################################
+
+TEMPLATE = app
+TARGET =
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+SOURCES += main.cpp
+
+CONFIG += console \ No newline at end of file
diff --git a/doc/src/diagrams/programs/easingcurve/main.cpp b/doc/src/diagrams/programs/easingcurve/main.cpp
new file mode 100644
index 0000000..580def5
--- /dev/null
+++ b/doc/src/diagrams/programs/easingcurve/main.cpp
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+void createCurveIcons();
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+ createCurveIcons();
+ return app.exit();
+}
+
+void createCurveIcons()
+{
+ QDir dir(QDir::current());
+ if (dir.dirName() == QLatin1String("debug") || dir.dirName() == QLatin1String("release")) {
+ dir.cdUp();
+ }
+ dir.cdUp();
+ dir.cdUp();
+ dir.cdUp();
+ QSize iconSize(128, 128);
+ QPixmap pix(iconSize);
+ QPainter painter(&pix);
+ QLinearGradient gradient(0,0, 0, iconSize.height());
+ gradient.setColorAt(0.0, QColor(240, 240, 240));
+ gradient.setColorAt(1.0, QColor(224, 224, 224));
+ QBrush brush(gradient);
+ const QMetaObject &mo = QEasingCurve::staticMetaObject;
+ QMetaEnum metaEnum = mo.enumerator(mo.indexOfEnumerator("Type"));
+ QFont oldFont = painter.font();
+ // Skip QEasingCurve::Custom
+ QString output(QString::fromAscii("%1/images").arg(dir.absolutePath()));
+ printf("Generating images to %s\n", qPrintable(output));
+ for (int i = 0; i < QEasingCurve::NCurveTypes - 1; ++i) {
+ painter.setFont(oldFont);
+ QString name(QLatin1String(metaEnum.key(i)));
+ painter.fillRect(QRect(QPoint(0, 0), iconSize), brush);
+ QEasingCurve curve((QEasingCurve::Type)i);
+ painter.setPen(QColor(0, 0, 255, 64));
+ qreal xAxis = iconSize.height()/1.5;
+ qreal yAxis = iconSize.width()/3;
+ painter.drawLine(0, xAxis, iconSize.width(), xAxis); // hor
+ painter.drawLine(yAxis, 0, yAxis, iconSize.height()); // ver
+
+ qreal curveScale = iconSize.height()/2;
+
+ painter.drawLine(yAxis - 2, xAxis - curveScale, yAxis + 2, xAxis - curveScale); // hor
+ painter.drawLine(yAxis + curveScale, xAxis + 2, yAxis + curveScale, xAxis - 2); // ver
+ painter.drawText(yAxis + curveScale - 8, xAxis - curveScale - 4, QLatin1String("(1,1)"));
+
+ painter.drawText(yAxis + 42, xAxis + 10, QLatin1String("progress"));
+ painter.drawText(15, xAxis - curveScale - 10, QLatin1String("value"));
+
+ painter.setPen(QPen(Qt::red, 1, Qt::DotLine));
+ painter.drawLine(yAxis, xAxis - curveScale, yAxis + curveScale, xAxis - curveScale); // hor
+ painter.drawLine(yAxis + curveScale, xAxis, yAxis + curveScale, xAxis - curveScale); // ver
+
+ QPoint start(yAxis, xAxis - curveScale * curve.valueForProgress(0));
+
+ painter.setPen(Qt::black);
+ QFont font = oldFont;
+ font.setPixelSize(oldFont.pixelSize() + 15);
+ painter.setFont(font);
+ painter.drawText(0, iconSize.height() - 20, iconSize.width(), 20, Qt::AlignHCenter, name);
+
+ QPainterPath curvePath;
+ curvePath.moveTo(start);
+ for (qreal t = 0; t <= 1.0; t+=1.0/curveScale) {
+ QPoint to;
+ to.setX(yAxis + curveScale * t);
+ to.setY(xAxis - curveScale * curve.valueForProgress(t));
+ curvePath.lineTo(to);
+ }
+ painter.setRenderHint(QPainter::Antialiasing, true);
+ painter.strokePath(curvePath, QColor(32, 32, 32));
+ painter.setRenderHint(QPainter::Antialiasing, false);
+
+ QString fileName(QString::fromAscii("qeasingcurve-%1.png").arg(name.toLower()));
+ printf("%s\n", qPrintable(fileName));
+ pix.save(QString::fromAscii("%1/%2").arg(output).arg(fileName), "PNG");
+ }
+}
+
+
diff --git a/doc/src/diagrams/x11_dependencies.sk b/doc/src/diagrams/x11_dependencies.sk
index 5f6b304..a9eb3e3 100644
--- a/doc/src/diagrams/x11_dependencies.sk
+++ b/doc/src/diagrams/x11_dependencies.sk
@@ -2,1415 +2,1619 @@
document()
layout('A4',0)
layer('Layer 1',1,1,0,0,(0,0,0))
-G()
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('Qt/X11',(254.1,398.35))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('libr',(304.9,398.35))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('ar',(326.07,398.35))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('y',(340.739,398.35))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('dependencies',(352.85,398.35))
fp((0,0,0))
le()
b()
-bs(268.8,339.25,0)
-bs(268.8,337.15,0)
-bs(352.8,337.15,0)
-bs(352.8,362.2,0)
-bs(350.7,362.2,0)
-bs(350.7,339.25,0)
-bs(268.8,339.25,0)
+bs(312.898,344.199,0)
+bs(312.898,342.102,0)
+bs(396.898,342.102,0)
+bs(396.898,367.148,0)
+bs(394.801,367.148,0)
+bs(394.801,344.199,0)
+bs(312.898,344.199,0)
bC()
-fp((0.59,0.99,0))
+fp((0.594,0.99,0))
le()
b()
-bs(266.7,339.25,0)
-bs(350.7,339.25,0)
-bs(350.7,364.3,0)
-bs(266.7,364.3,0)
-bs(266.7,339.25,0)
+bs(310.801,344.199,0)
+bs(394.801,344.199,0)
+bs(394.801,369.25,0)
+bs(310.801,369.25,0)
+bs(310.801,344.199,0)
lw(1.12)
lc(2)
b()
-bs(266.7,339.25,0)
-bs(350.7,339.25,0)
+bs(310.801,344.199,0)
+bs(394.801,344.199,0)
lw(1.12)
lc(2)
b()
-bs(350.7,339.25,0)
-bs(350.7,364.3,0)
+bs(394.801,344.199,0)
+bs(394.801,369.25,0)
lw(1.12)
lc(2)
b()
-bs(350.7,364.3,0)
-bs(266.7,364.3,0)
+bs(394.801,369.25,0)
+bs(310.801,369.25,0)
lw(1.12)
lc(2)
b()
-bs(266.7,364.3,0)
-bs(266.7,339.25,0)
+bs(310.801,369.25,0)
+bs(310.801,344.199,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('QtGui',(290.95,347))
+txt('QtGui',(335.05,351.95))
fp((0,0,0))
le()
b()
-bs(111.3,280.05,0)
-bs(111.3,277.95,0)
-bs(195.3,277.95,0)
-bs(195.3,302.15,0)
-bs(193.2,302.15,0)
-bs(193.2,280.05,0)
-bs(111.3,280.05,0)
+bs(212.102,285,0)
+bs(212.102,282.898,0)
+bs(296.102,282.898,0)
+bs(296.102,307.102,0)
+bs(294,307.102,0)
+bs(294,285,0)
+bs(212.102,285,0)
bC()
fp((0.792,0.882,1))
le()
b()
-bs(109.2,280.05,0)
-bs(193.2,280.05,0)
-bs(193.2,304.25,0)
-bs(109.2,304.25,0)
-bs(109.2,280.05,0)
+bs(210,285,0)
+bs(294,285,0)
+bs(294,309.199,0)
+bs(210,309.199,0)
+bs(210,285,0)
lw(1.12)
lc(2)
b()
-bs(109.2,280.05,0)
-bs(193.2,280.05,0)
+bs(210,285,0)
+bs(294,285,0)
lw(1.12)
lc(2)
b()
-bs(193.2,280.05,0)
-bs(193.2,304.25,0)
+bs(294,285,0)
+bs(294,309.199,0)
lw(1.12)
lc(2)
b()
-bs(193.2,304.25,0)
-bs(109.2,304.25,0)
+bs(294,309.199,0)
+bs(210,309.199,0)
lw(1.12)
lc(2)
b()
-bs(109.2,304.25,0)
-bs(109.2,280.05,0)
+bs(210,309.199,0)
+bs(210,285,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('Xcursor',(127.15,287.25))
+txt('Xcursor',(227.95,292.2))
fp((0,0,0))
le()
b()
-bs(268.8,280.05,0)
-bs(268.8,277.95,0)
-bs(352.8,277.95,0)
-bs(352.8,302.15,0)
-bs(350.7,302.15,0)
-bs(350.7,280.05,0)
-bs(268.8,280.05,0)
+bs(312.898,285,0)
+bs(312.898,282.898,0)
+bs(396.898,282.898,0)
+bs(396.898,307.102,0)
+bs(394.801,307.102,0)
+bs(394.801,285,0)
+bs(312.898,285,0)
bC()
fp((0.792,0.882,1))
le()
b()
-bs(266.7,280.05,0)
-bs(350.7,280.05,0)
-bs(350.7,304.25,0)
-bs(266.7,304.25,0)
-bs(266.7,280.05,0)
+bs(310.801,285,0)
+bs(394.801,285,0)
+bs(394.801,309.199,0)
+bs(310.801,309.199,0)
+bs(310.801,285,0)
lw(1.12)
lc(2)
b()
-bs(266.7,280.05,0)
-bs(350.7,280.05,0)
+bs(310.801,285,0)
+bs(394.801,285,0)
lw(1.12)
lc(2)
b()
-bs(350.7,280.05,0)
-bs(350.7,304.25,0)
+bs(394.801,285,0)
+bs(394.801,309.199,0)
lw(1.12)
lc(2)
b()
-bs(350.7,304.25,0)
-bs(266.7,304.25,0)
+bs(394.801,309.199,0)
+bs(310.801,309.199,0)
lw(1.12)
lc(2)
b()
-bs(266.7,304.25,0)
-bs(266.7,280.05,0)
+bs(310.801,309.199,0)
+bs(310.801,285,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('Xr',(287.8,287.25))
+txt('Xr',(331.9,292.2))
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('andr',(301.7,287.25))
+txt('andr',(345.796,292.2))
fp((0,0,0))
le()
b()
-bs(426.3,280.05,0)
-bs(426.3,277.95,0)
-bs(510.3,277.95,0)
-bs(510.3,302.15,0)
-bs(508.2,302.15,0)
-bs(508.2,280.05,0)
-bs(426.3,280.05,0)
+bs(413.699,285,0)
+bs(413.699,282.898,0)
+bs(497.699,282.898,0)
+bs(497.699,307.102,0)
+bs(495.602,307.102,0)
+bs(495.602,285,0)
+bs(413.699,285,0)
bC()
fp((0.792,0.882,1))
le()
b()
-bs(424.2,280.05,0)
-bs(508.2,280.05,0)
-bs(508.2,304.25,0)
-bs(424.2,304.25,0)
-bs(424.2,280.05,0)
+bs(411.602,285,0)
+bs(495.602,285,0)
+bs(495.602,309.199,0)
+bs(411.602,309.199,0)
+bs(411.602,285,0)
lw(1.12)
lc(2)
b()
-bs(424.2,280.05,0)
-bs(508.2,280.05,0)
+bs(411.602,285,0)
+bs(495.602,285,0)
lw(1.12)
lc(2)
b()
-bs(508.2,280.05,0)
-bs(508.2,304.25,0)
+bs(495.602,285,0)
+bs(495.602,309.199,0)
lw(1.12)
lc(2)
b()
-bs(508.2,304.25,0)
-bs(424.2,304.25,0)
+bs(495.602,309.199,0)
+bs(411.602,309.199,0)
lw(1.12)
lc(2)
b()
-bs(424.2,304.25,0)
-bs(424.2,280.05,0)
+bs(411.602,309.199,0)
+bs(411.602,285,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('Xiner',(436.55,287.25))
+txt('Xiner',(423.95,292.2))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('ama',(456.514,292.2))
+fp((0,0,0))
+le()
+b()
+bs(548.602,285.102,0)
+bs(548.602,283,0)
+bs(632.602,283,0)
+bs(632.602,307,0)
+bs(630.5,307,0)
+bs(630.5,285.102,0)
+bs(548.602,285.102,0)
+bC()
+fp((0.792,0.882,1))
+le()
+b()
+bs(546.5,285.102,0)
+bs(630.5,285.102,0)
+bs(630.5,309.102,0)
+bs(546.5,309.102,0)
+bs(546.5,285.102,0)
+lw(1.12)
+lc(2)
+b()
+bs(546.5,285.102,0)
+bs(630.5,285.102,0)
+lw(1.12)
+lc(2)
+b()
+bs(630.5,285.102,0)
+bs(630.5,309.102,0)
+lw(1.12)
+lc(2)
+b()
+bs(630.5,309.102,0)
+bs(546.5,309.102,0)
+lw(1.12)
+lc(2)
+b()
+bs(546.5,309.102,0)
+bs(546.5,285.102,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('ama',(469.125,287.25))
+txt('Xi',(582.75,292.1))
fp((0,0,0))
le()
b()
-bs(561.2,280.15,0)
-bs(561.2,278.05,0)
-bs(645.2,278.05,0)
-bs(645.2,302.05,0)
-bs(643.1,302.05,0)
-bs(643.1,280.15,0)
-bs(561.2,280.15,0)
+bs(10.5,222.801,0)
+bs(10.5,220.699,0)
+bs(94.5,220.699,0)
+bs(94.5,247.898,0)
+bs(92.3984,247.898,0)
+bs(92.3984,222.801,0)
+bs(10.5,222.801,0)
bC()
fp((0.792,0.882,1))
le()
b()
-bs(559.1,280.15,0)
-bs(643.1,280.15,0)
-bs(643.1,304.15,0)
-bs(559.1,304.15,0)
-bs(559.1,280.15,0)
+bs(8.39844,222.801,0)
+bs(92.3984,222.801,0)
+bs(92.3984,250,0)
+bs(8.39844,250,0)
+bs(8.39844,222.801,0)
lw(1.12)
lc(2)
b()
-bs(559.1,280.15,0)
-bs(643.1,280.15,0)
+bs(8.39844,222.801,0)
+bs(92.3984,222.801,0)
lw(1.12)
lc(2)
b()
-bs(643.1,280.15,0)
-bs(643.1,304.15,0)
+bs(92.3984,222.801,0)
+bs(92.3984,250,0)
lw(1.12)
lc(2)
b()
-bs(643.1,304.15,0)
-bs(559.1,304.15,0)
+bs(92.3984,250,0)
+bs(8.39844,250,0)
lw(1.12)
lc(2)
b()
-bs(559.1,304.15,0)
-bs(559.1,280.15,0)
+bs(8.39844,250,0)
+bs(8.39844,222.801,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('F',(18.4,232.85))
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('Xi',(595.35,287.15))
+txt('ontconfig',(26.5508,232.85))
fp((0,0,0))
le()
b()
-bs(268.8,220.85,0)
-bs(268.8,218.75,0)
-bs(352.8,218.75,0)
-bs(352.8,242.95,0)
-bs(350.7,242.95,0)
-bs(350.7,220.85,0)
-bs(268.8,220.85,0)
+bs(312.898,225.801,0)
+bs(312.898,223.699,0)
+bs(396.898,223.699,0)
+bs(396.898,247.898,0)
+bs(394.801,247.898,0)
+bs(394.801,225.801,0)
+bs(312.898,225.801,0)
bC()
fp((0.792,0.882,1))
le()
b()
-bs(266.7,220.85,0)
-bs(350.7,220.85,0)
-bs(350.7,245.05,0)
-bs(266.7,245.05,0)
-bs(266.7,220.85,0)
+bs(310.801,225.801,0)
+bs(394.801,225.801,0)
+bs(394.801,250,0)
+bs(310.801,250,0)
+bs(310.801,225.801,0)
lw(1.12)
lc(2)
b()
-bs(266.7,220.85,0)
-bs(350.7,220.85,0)
+bs(310.801,225.801,0)
+bs(394.801,225.801,0)
lw(1.12)
lc(2)
b()
-bs(350.7,220.85,0)
-bs(350.7,245.05,0)
+bs(394.801,225.801,0)
+bs(394.801,250,0)
lw(1.12)
lc(2)
b()
-bs(350.7,245.05,0)
-bs(266.7,245.05,0)
+bs(394.801,250,0)
+bs(310.801,250,0)
lw(1.12)
lc(2)
b()
-bs(266.7,245.05,0)
-bs(266.7,220.85,0)
+bs(310.801,250,0)
+bs(310.801,225.801,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('XRender',(281.15,228.05))
+txt('XRender',(325.25,233))
fp((0,0,0))
le()
b()
-bs(662,220.95,0)
-bs(662,218.85,0)
-bs(746,218.85,0)
-bs(746,242.95,0)
-bs(743.9,242.95,0)
-bs(743.9,220.95,0)
-bs(662,220.95,0)
+bs(649.398,225.898,0)
+bs(649.398,223.801,0)
+bs(733.398,223.801,0)
+bs(733.398,247.898,0)
+bs(731.301,247.898,0)
+bs(731.301,225.898,0)
+bs(649.398,225.898,0)
bC()
fp((0.961,0.961,0.863))
le()
b()
-bs(659.9,220.95,0)
-bs(743.9,220.95,0)
-bs(743.9,245.05,0)
-bs(659.9,245.05,0)
-bs(659.9,220.95,0)
+bs(647.301,225.898,0)
+bs(731.301,225.898,0)
+bs(731.301,250,0)
+bs(647.301,250,0)
+bs(647.301,225.898,0)
lw(1.12)
lc(2)
b()
-bs(659.9,220.95,0)
-bs(743.9,220.95,0)
+bs(647.301,225.898,0)
+bs(731.301,225.898,0)
lw(1.12)
lc(2)
b()
-bs(743.9,220.95,0)
-bs(743.9,245.05,0)
+bs(731.301,225.898,0)
+bs(731.301,250,0)
lw(1.12)
lc(2)
b()
-bs(743.9,245.05,0)
-bs(659.9,245.05,0)
+bs(731.301,250,0)
+bs(647.301,250,0)
lw(1.12)
lc(2)
b()
-bs(659.9,245.05,0)
-bs(659.9,220.95,0)
+bs(647.301,250,0)
+bs(647.301,225.898,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('Xt*',(692.9,228.05))
+txt('Xt*',(680.3,233))
fp((0,0,0))
le()
b()
-bs(10.4998,160.8,0)
-bs(10.4998,158.7,0)
-bs(94.4998,158.7,0)
-bs(94.4998,183.75,0)
-bs(92.3999,183.75,0)
-bs(92.3999,160.8,0)
-bs(10.4998,160.8,0)
+bs(10.5,160.801,0)
+bs(10.5,158.699,0)
+bs(94.5,158.699,0)
+bs(94.5,185.699,0)
+bs(92.3984,185.699,0)
+bs(92.3984,160.801,0)
+bs(10.5,160.801,0)
+bC()
+fp((0.792,0.882,1))
+le()
+b()
+bs(8.39844,160.801,0)
+bs(92.3984,160.801,0)
+bs(92.3984,187.801,0)
+bs(8.39844,187.801,0)
+bs(8.39844,160.801,0)
+lw(1.12)
+lc(2)
+b()
+bs(8.39844,160.801,0)
+bs(92.3984,160.801,0)
+lw(1.12)
+lc(2)
+b()
+bs(92.3984,160.801,0)
+bs(92.3984,187.801,0)
+lw(1.12)
+lc(2)
+b()
+bs(92.3984,187.801,0)
+bs(8.39844,187.801,0)
+lw(1.12)
+lc(2)
+b()
+bs(8.39844,187.801,0)
+bs(8.39844,160.801,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('F',(21.9,170.8))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('reeT',(29.8508,170.8))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('ype',(56.9742,170.8))
+fp((0,0,0))
+le()
+b()
+bs(111.301,161.801,0)
+bs(111.301,159.699,0)
+bs(195.301,159.699,0)
+bs(195.301,184.75,0)
+bs(193.199,184.75,0)
+bs(193.199,161.801,0)
+bs(111.301,161.801,0)
bC()
fp((0.61,0.61,1))
le()
b()
-bs(8.3999,160.8,0)
-bs(92.3999,160.8,0)
-bs(92.3999,185.85,0)
-bs(8.3999,185.85,0)
-bs(8.3999,160.8,0)
+bs(109.199,161.801,0)
+bs(193.199,161.801,0)
+bs(193.199,186.852,0)
+bs(109.199,186.852,0)
+bs(109.199,161.801,0)
lw(1.12)
lc(2)
b()
-bs(8.3999,160.8,0)
-bs(92.3999,160.8,0)
+bs(109.199,161.801,0)
+bs(193.199,161.801,0)
lw(1.12)
lc(2)
b()
-bs(92.3999,160.8,0)
-bs(92.3999,185.85,0)
+bs(193.199,161.801,0)
+bs(193.199,186.852,0)
lw(1.12)
lc(2)
b()
-bs(92.3999,185.85,0)
-bs(8.3999,185.85,0)
+bs(193.199,186.852,0)
+bs(109.199,186.852,0)
lw(1.12)
lc(2)
b()
-bs(8.3999,185.85,0)
-bs(8.3999,160.8,0)
+bs(109.199,186.852,0)
+bs(109.199,161.801,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('QtCore',(28.1997,168.55))
+txt('QtCore',(129,169.55))
fp((0,0,0))
le()
b()
-bs(268.8,161.15,0)
-bs(268.8,159.05,0)
-bs(352.8,159.05,0)
-bs(352.8,183.4,0)
-bs(350.7,183.4,0)
-bs(350.7,161.15,0)
-bs(268.8,161.15,0)
+bs(312.898,162.148,0)
+bs(312.898,160.051,0)
+bs(396.898,160.051,0)
+bs(396.898,184.398,0)
+bs(394.801,184.398,0)
+bs(394.801,162.148,0)
+bs(312.898,162.148,0)
bC()
fp((0.792,0.882,1))
le()
b()
-bs(266.7,161.15,0)
-bs(350.7,161.15,0)
-bs(350.7,185.5,0)
-bs(266.7,185.5,0)
-bs(266.7,161.15,0)
+bs(310.801,162.148,0)
+bs(394.801,162.148,0)
+bs(394.801,186.5,0)
+bs(310.801,186.5,0)
+bs(310.801,162.148,0)
lw(1.12)
lc(2)
b()
-bs(266.7,161.15,0)
-bs(350.7,161.15,0)
+bs(310.801,162.148,0)
+bs(394.801,162.148,0)
lw(1.12)
lc(2)
b()
-bs(350.7,161.15,0)
-bs(350.7,185.5,0)
+bs(394.801,162.148,0)
+bs(394.801,186.5,0)
lw(1.12)
lc(2)
b()
-bs(350.7,185.5,0)
-bs(266.7,185.5,0)
+bs(394.801,186.5,0)
+bs(310.801,186.5,0)
lw(1.12)
lc(2)
b()
-bs(266.7,185.5,0)
-bs(266.7,161.15,0)
+bs(310.801,186.5,0)
+bs(310.801,162.148,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('Xfix',(290.1,168.35))
+txt('Xfix',(334.2,169.35))
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('es',(313.038,168.35))
+txt('es',(357.136,169.35))
fp((0,0,0))
le()
b()
-bs(426.3,161.25,0)
-bs(426.3,159.15,0)
-bs(510.3,159.15,0)
-bs(510.3,183.35,0)
-bs(508.2,183.35,0)
-bs(508.2,161.25,0)
-bs(426.3,161.25,0)
+bs(413.699,162.199,0)
+bs(413.699,160.102,0)
+bs(497.699,160.102,0)
+bs(497.699,184.301,0)
+bs(495.602,184.301,0)
+bs(495.602,162.199,0)
+bs(413.699,162.199,0)
bC()
fp((0.961,0.961,0.863))
le()
b()
-bs(424.2,161.25,0)
-bs(508.2,161.25,0)
-bs(508.2,185.45,0)
-bs(424.2,185.45,0)
-bs(424.2,161.25,0)
+bs(411.602,162.199,0)
+bs(495.602,162.199,0)
+bs(495.602,186.398,0)
+bs(411.602,186.398,0)
+bs(411.602,162.199,0)
lw(1.12)
lc(2)
b()
-bs(424.2,161.25,0)
-bs(508.2,161.25,0)
+bs(411.602,162.199,0)
+bs(495.602,162.199,0)
lw(1.12)
lc(2)
b()
-bs(508.2,161.25,0)
-bs(508.2,185.45,0)
+bs(495.602,162.199,0)
+bs(495.602,186.398,0)
lw(1.12)
lc(2)
b()
-bs(508.2,185.45,0)
-bs(424.2,185.45,0)
+bs(495.602,186.398,0)
+bs(411.602,186.398,0)
lw(1.12)
lc(2)
b()
-bs(424.2,185.45,0)
-bs(424.2,161.25,0)
+bs(411.602,186.398,0)
+bs(411.602,162.199,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('Xe',(452.55,168.45))
+txt('Xe',(439.95,169.4))
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('xt',(469.272,168.45))
+txt('xt',(456.667,169.4))
fp((0,0,0))
le()
b()
-bs(662,161.05,0)
-bs(662,158.95,0)
-bs(746,158.95,0)
-bs(746,183.5,0)
-bs(743.9,183.5,0)
-bs(743.9,161.05,0)
-bs(662,161.05,0)
+bs(649.398,162.051,0)
+bs(649.398,159.949,0)
+bs(733.398,159.949,0)
+bs(733.398,184.5,0)
+bs(731.301,184.5,0)
+bs(731.301,162.051,0)
+bs(649.398,162.051,0)
bC()
fp((0.761,0.98,0.98))
le()
b()
-bs(659.9,161.05,0)
-bs(743.9,161.05,0)
-bs(743.9,185.6,0)
-bs(659.9,185.6,0)
-bs(659.9,161.05,0)
+bs(647.301,162.051,0)
+bs(731.301,162.051,0)
+bs(731.301,186.602,0)
+bs(647.301,186.602,0)
+bs(647.301,162.051,0)
lw(1.12)
lc(2)
b()
-bs(659.9,161.05,0)
-bs(743.9,161.05,0)
+bs(647.301,162.051,0)
+bs(731.301,162.051,0)
lw(1.12)
lc(2)
b()
-bs(743.9,161.05,0)
-bs(743.9,185.6,0)
+bs(731.301,162.051,0)
+bs(731.301,186.602,0)
lw(1.12)
lc(2)
b()
-bs(743.9,185.6,0)
-bs(659.9,185.6,0)
+bs(731.301,186.602,0)
+bs(647.301,186.602,0)
lw(1.12)
lc(2)
b()
-bs(659.9,185.6,0)
-bs(659.9,161.05,0)
+bs(647.301,186.602,0)
+bs(647.301,162.051,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('SM',(691.9,168.3))
+txt('SM',(679.3,169.3))
fp((0,0,0))
le()
b()
-bs(10.4998,98.9001,0)
-bs(10.4998,96.8003,0)
-bs(94.4998,96.8003,0)
-bs(94.4998,123.7,0)
-bs(92.3999,123.7,0)
-bs(92.3999,98.9001,0)
-bs(10.4998,98.9001,0)
+bs(111.301,98.8984,0)
+bs(111.301,96.8008,0)
+bs(195.301,96.8008,0)
+bs(195.301,123.699,0)
+bs(193.199,123.699,0)
+bs(193.199,98.8984,0)
+bs(111.301,98.8984,0)
bC()
fp((0.741,0.718,0.42))
le()
b()
-bs(8.3999,98.9001,0)
-bs(92.3999,98.9001,0)
-bs(92.3999,125.8,0)
-bs(8.3999,125.8,0)
-bs(8.3999,98.9001,0)
+bs(109.199,98.8984,0)
+bs(193.199,98.8984,0)
+bs(193.199,125.801,0)
+bs(109.199,125.801,0)
+bs(109.199,98.8984,0)
lw(1.12)
lc(2)
b()
-bs(8.3999,98.9001,0)
-bs(92.3999,98.9001,0)
+bs(109.199,98.8984,0)
+bs(193.199,98.8984,0)
lw(1.12)
lc(2)
b()
-bs(92.3999,98.9001,0)
-bs(92.3999,125.8,0)
+bs(193.199,98.8984,0)
+bs(193.199,125.801,0)
lw(1.12)
lc(2)
b()
-bs(92.3999,125.8,0)
-bs(8.3999,125.8,0)
+bs(193.199,125.801,0)
+bs(109.199,125.801,0)
lw(1.12)
lc(2)
b()
-bs(8.3999,125.8,0)
-bs(8.3999,98.9001,0)
+bs(109.199,125.801,0)
+bs(109.199,98.8984,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('pthread',(27.1499,108.8))
+txt('pthread',(127.95,108.8))
fp((0,0,0))
le()
b()
-bs(111.3,100.1,0)
-bs(111.3,98.0002,0)
-bs(195.3,98.0002,0)
-bs(195.3,122.55,0)
-bs(193.2,122.55,0)
-bs(193.2,100.1,0)
-bs(111.3,100.1,0)
+bs(212.102,100.102,0)
+bs(212.102,98,0)
+bs(296.102,98,0)
+bs(296.102,122.551,0)
+bs(294,122.551,0)
+bs(294,100.102,0)
+bs(212.102,100.102,0)
bC()
fp((0.7,0.7,0.7))
le()
b()
-bs(109.2,100.1,0)
-bs(193.2,100.1,0)
-bs(193.2,124.65,0)
-bs(109.2,124.65,0)
-bs(109.2,100.1,0)
+bs(210,100.102,0)
+bs(294,100.102,0)
+bs(294,124.648,0)
+bs(210,124.648,0)
+bs(210,100.102,0)
lw(1.12)
lc(2)
b()
-bs(109.2,100.1,0)
-bs(193.2,100.1,0)
+bs(210,100.102,0)
+bs(294,100.102,0)
lw(1.12)
lc(2)
b()
-bs(193.2,100.1,0)
-bs(193.2,124.65,0)
+bs(294,100.102,0)
+bs(294,124.648,0)
lw(1.12)
lc(2)
b()
-bs(193.2,124.65,0)
-bs(109.2,124.65,0)
+bs(294,124.648,0)
+bs(210,124.648,0)
lw(1.12)
lc(2)
b()
-bs(109.2,124.65,0)
-bs(109.2,100.1,0)
+bs(210,124.648,0)
+bs(210,100.102,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('Glib',(139.05,107.35))
+txt('Glib',(239.85,107.35))
fp((0,0,0))
le()
b()
-bs(426.3,100.35,0)
-bs(426.3,98.2502,0)
-bs(510.3,98.2502,0)
-bs(510.3,122.25,0)
-bs(508.2,122.25,0)
-bs(508.2,100.35,0)
-bs(426.3,100.35,0)
+bs(413.699,100.352,0)
+bs(413.699,98.25,0)
+bs(497.699,98.25,0)
+bs(497.699,122.25,0)
+bs(495.602,122.25,0)
+bs(495.602,100.352,0)
+bs(413.699,100.352,0)
bC()
fp((0.961,0.961,0.863))
le()
b()
-bs(424.2,100.35,0)
-bs(508.2,100.35,0)
-bs(508.2,124.35,0)
-bs(424.2,124.35,0)
-bs(424.2,100.35,0)
+bs(411.602,100.352,0)
+bs(495.602,100.352,0)
+bs(495.602,124.352,0)
+bs(411.602,124.352,0)
+bs(411.602,100.352,0)
lw(1.12)
lc(2)
b()
-bs(424.2,100.35,0)
-bs(508.2,100.35,0)
+bs(411.602,100.352,0)
+bs(495.602,100.352,0)
lw(1.12)
lc(2)
b()
-bs(508.2,100.35,0)
-bs(508.2,124.35,0)
+bs(495.602,100.352,0)
+bs(495.602,124.352,0)
lw(1.12)
lc(2)
b()
-bs(508.2,124.35,0)
-bs(424.2,124.35,0)
+bs(495.602,124.352,0)
+bs(411.602,124.352,0)
lw(1.12)
lc(2)
b()
-bs(424.2,124.35,0)
-bs(424.2,100.35,0)
+bs(411.602,124.352,0)
+bs(411.602,100.352,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('X11',(455.15,107.35))
+txt('X11',(442.55,107.35))
fp((0,0,0))
le()
b()
-bs(662,100.1,0)
-bs(662,98.0002,0)
-bs(746,98.0002,0)
-bs(746,122.55,0)
-bs(743.9,122.55,0)
-bs(743.9,100.1,0)
-bs(662,100.1,0)
+bs(649.398,100.102,0)
+bs(649.398,98,0)
+bs(733.398,98,0)
+bs(733.398,122.551,0)
+bs(731.301,122.551,0)
+bs(731.301,100.102,0)
+bs(649.398,100.102,0)
bC()
fp((0.761,0.98,0.98))
le()
b()
-bs(659.9,100.1,0)
-bs(743.9,100.1,0)
-bs(743.9,124.65,0)
-bs(659.9,124.65,0)
-bs(659.9,100.1,0)
+bs(647.301,100.102,0)
+bs(731.301,100.102,0)
+bs(731.301,124.648,0)
+bs(647.301,124.648,0)
+bs(647.301,100.102,0)
lw(1.12)
lc(2)
b()
-bs(659.9,100.1,0)
-bs(743.9,100.1,0)
+bs(647.301,100.102,0)
+bs(731.301,100.102,0)
lw(1.12)
lc(2)
b()
-bs(743.9,100.1,0)
-bs(743.9,124.65,0)
+bs(731.301,100.102,0)
+bs(731.301,124.648,0)
lw(1.12)
lc(2)
b()
-bs(743.9,124.65,0)
-bs(659.9,124.65,0)
+bs(731.301,124.648,0)
+bs(647.301,124.648,0)
lw(1.12)
lc(2)
b()
-bs(659.9,124.65,0)
-bs(659.9,100.1,0)
+bs(647.301,124.648,0)
+bs(647.301,100.102,0)
fp((0,0,0))
Fn('Helvetica')
Fs(14)
-txt('ICE',(690.6,107.35))
+txt('ICE',(678,107.35))
fp((0,0,0))
Fn('Helvetica')
-txt('some',(585.05,38.7002))
+txt('some',(572.45,38.7))
fp((0,0,0))
Fn('Helvetica')
-txt('configur',(617.15,38.7002))
+txt('configur',(604.55,38.7))
fp((0,0,0))
Fn('Helvetica')
-txt('ations',(659.733,38.7002))
+txt('ations',(647.13,38.7))
fp((0,0,0))
Fn('Helvetica')
-txt('only',(694.4,38.7002))
+txt('only',(681.8,38.7))
fp((0,0,0))
Fn('Helvetica')
-txt('*',(568.85,22.5002))
+txt('*',(556.25,22.5))
fp((0,0,0))
Fn('Helvetica')
-txt('Xt',(585.05,22.5002))
+txt('Xt',(572.45,22.5))
fp((0,0,0))
Fn('Helvetica')
-txt('intr',(599.4,22.5002))
+txt('intr',(586.8,22.5))
fp((0,0,0))
Fn('Helvetica')
-txt('insics',(616.217,22.5002))
+txt('insics',(603.61,22.5))
fp((0,0,0))
Fn('Helvetica')
-txt('only',(648.95,22.5002))
+txt('only',(636.35,22.5))
lw(1.12)
lc(2)
-ld((0, 2.4999899999999999))
+ld((0, 2.5))
b()
-bs(308.7,339.25,0)
-bs(308.7,328.05,0)
+bs(352.801,344.199,0)
+bs(352.801,333,0)
lw(1.12)
lc(2)
-ld((0, 2.0312000000000001))
+ld((0, 2.03125))
b()
-bs(308.7,328.05,0)
-bs(308.7,332.6,0)
+bs(352.801,333,0)
+bs(352.801,337.551,0)
lw(1.12)
lc(2)
ld((0, 2.45438))
b()
-bs(308.7,332.6,0)
-bs(308.7,332.6,0)
-bc(308.7,330.744,309.438,328.963,310.75,327.651,0)
+bs(352.801,337.551,0)
+bs(352.801,337.551,0)
+bc(352.801,335.695,353.539,333.914,354.852,332.602,0)
lw(1.12)
lc(2)
-ld((0, 2.4543599999999999))
+ld((0, 2.45438))
b()
-bs(310.75,327.65,0)
-bs(310.75,327.651,0)
-bc(312.063,326.338,313.844,325.6,315.7,325.6,0)
+bs(354.852,332.602,0)
+bs(354.852,332.602,0)
+bc(356.164,331.289,357.945,330.551,359.801,330.551,0)
lw(1.12)
lc(2)
-ld((0, 2.4639500000000001))
+ld((0, 2.4218799999999998))
b()
-bs(315.7,325.6,0)
-bs(387.45,325.6,0)
+bs(359.801,330.551,0)
+bs(403.199,330.551,0)
lw(1.12)
lc(2)
-ld((0, 2.4639500000000001))
+ld((0, 2.4218799999999998))
b()
-bs(387.45,325.6,0)
-bs(459.2,325.6,0)
+bs(403.199,330.551,0)
+bs(446.602,330.551,0)
lw(1.12)
lc(2)
ld((0, 2.45438))
b()
-bs(459.2,325.6,0)
-bs(459.2,325.6,0)
-bc(461.056,325.6,462.837,324.863,464.15,323.55,0)
+bs(446.602,330.551,0)
+bs(446.602,330.551,0)
+bc(448.457,330.551,450.238,329.812,451.551,328.5,0)
lw(1.12)
lc(2)
ld((0, 2.45438))
b()
-bs(464.15,323.55,0)
-bs(464.15,323.55,0)
-bc(465.462,322.237,466.2,320.457,466.2,318.6,0)
+bs(451.551,328.5,0)
+bs(451.551,328.5,0)
+bc(452.863,327.188,453.602,325.406,453.602,323.551,0)
lw(1.12)
lc(2)
-ld((0, 2.3437899999999998))
+ld((0, 2.3437399999999999))
b()
-bs(466.2,318.6,0)
-bs(466.2,313.35,0)
+bs(453.602,323.551,0)
+bs(453.602,318.301,0)
lw(1.12)
lc(2)
ld((0, 2.5))
b()
-bs(466.2,313.35,0)
-bs(466.2,311.95,0)
+bs(453.602,318.301,0)
+bs(453.602,316.898,0)
fp((0,0,0))
le()
b()
-bs(462.35,311.95,0)
-bs(466.199,304.25,0)
-bs(470.05,311.95,0)
+bs(449.75,316.898,0)
+bs(453.602,309.199,0)
+bs(457.449,316.898,0)
lw(1.12)
lc(2)
-ld((0, 2.4999899999999999))
+ld((0, 2.5))
b()
-bs(308.7,339.25,0)
-bs(308.7,328.05,0)
+bs(352.801,344.199,0)
+bs(352.801,333,0)
lw(1.12)
lc(2)
-ld((0, 2.0088900000000001))
+ld((0, 2.0089299999999999))
b()
-bs(308.7,328.05,0)
-bs(308.7,332.55,0)
+bs(352.801,333,0)
+bs(352.801,337.5,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543599999999999))
+b()
+bs(352.801,337.5,0)
+bs(352.801,337.5,0)
+bc(352.801,335.645,353.539,333.863,354.852,332.551,0)
lw(1.12)
lc(2)
ld((0, 2.45438))
b()
-bs(308.7,332.55,0)
-bs(308.7,332.55,0)
-bc(308.7,330.694,309.438,328.913,310.75,327.601,0)
+bs(354.852,332.551,0)
+bs(354.852,332.551,0)
+bc(356.164,331.238,357.945,330.5,359.801,330.5,0)
lw(1.12)
lc(2)
-ld((0, 2.4543599999999999))
+ld((0, 2.4743300000000001))
b()
-bs(310.75,327.6,0)
-bs(310.75,327.601,0)
-bc(312.063,326.288,313.844,325.55,315.7,325.55,0)
+bs(359.801,330.5,0)
+bs(470.648,330.5,0)
lw(1.12)
lc(2)
-ld((0, 2.4857100000000001))
+ld((0, 2.4743300000000001))
b()
-bs(459.2,325.6,0)
-bs(594.1,325.55,0)
+bs(470.648,330.5,0)
+bs(581.5,330.5,0)
lw(1.12)
lc(2)
-ld((0, 2.4543900000000001))
+ld((0, 2.45438))
b()
-bs(594.1,325.55,0)
-bs(594.1,325.55,0)
-bc(595.956,325.55,597.737,324.813,599.05,323.5,0)
+bs(581.5,330.5,0)
+bs(581.5,330.5,0)
+bc(583.355,330.5,585.137,329.762,586.449,328.449,0)
lw(1.12)
lc(2)
-ld((0, 2.4544100000000002))
+ld((0, 2.45438))
b()
-bs(599.05,323.5,0)
-bs(599.05,323.5,0)
-bc(600.362,322.187,601.1,320.407,601.1,318.55,0)
+bs(586.449,328.449,0)
+bs(586.449,328.449,0)
+bc(587.762,327.137,588.5,325.355,588.5,323.5,0)
lw(1.12)
lc(2)
-ld((0, 2.3660899999999998))
+ld((0, 2.36605))
b()
-bs(601.1,318.55,0)
-bs(601.1,313.25,0)
+bs(588.5,323.5,0)
+bs(588.5,318.199,0)
lw(1.12)
lc(2)
ld((0, 2.5))
b()
-bs(601.1,313.25,0)
-bs(601.1,311.85,0)
+bs(588.5,318.199,0)
+bs(588.5,316.801,0)
fp((0,0,0))
le()
b()
-bs(597.25,311.85,0)
-bs(601.099,304.15,0)
-bs(604.949,311.85,0)
+bs(584.648,316.801,0)
+bs(588.5,309.102,0)
+bs(592.352,316.801,0)
lw(1.12)
lc(2)
b()
-bs(266.7,351.775,0)
-bs(255.5,351.775,0)
+bs(310.801,356.727,0)
+bs(299.602,356.727,0)
lw(1.12)
lc(2)
b()
-bs(255.5,351.775,0)
-bs(57.3999,351.775,0)
+bs(299.602,356.727,0)
+bs(158.199,356.727,0)
lw(1.12)
lc(2)
b()
-bs(57.3999,351.775,0)
-bs(57.3999,351.775,0)
-bc(53.5339,351.775,50.3999,348.641,50.3999,344.775,0)
+bs(158.199,356.727,0)
+bs(158.199,356.727,0)
+bc(154.336,356.727,151.199,353.59,151.199,349.727,0)
lw(1.12)
lc(2)
b()
-bs(50.3999,344.775,0)
-bs(50.3999,194.95,0)
+bs(151.199,349.727,0)
+bs(151.199,195.949,0)
lw(1.12)
lc(2)
b()
-bs(50.3999,194.95,0)
-bs(50.3999,193.55,0)
+bs(151.199,195.949,0)
+bs(151.199,194.551,0)
fp((0,0,0))
le()
b()
-bs(46.5496,193.55,0)
-bs(50.3994,185.85,0)
-bs(54.2495,193.55,0)
+bs(147.352,194.551,0)
+bs(151.199,186.852,0)
+bs(155.051,194.551,0)
lw(1.12)
lc(2)
b()
-bs(50.3999,160.8,0)
-bs(50.3999,133.5,0)
+bs(151.199,161.801,0)
+bs(151.199,133.5,0)
fp((0,0,0))
le()
b()
-bs(46.5496,133.5,0)
-bs(50.3994,125.8,0)
-bs(54.2495,133.5,0)
+bs(147.352,133.5,0)
+bs(151.199,125.801,0)
+bs(155.051,133.5,0)
lw(1.12)
lc(2)
ld((0, 2))
b()
-bs(50.3999,160.8,0)
-bs(50.3999,149.6,0)
+bs(151.199,161.801,0)
+bs(151.199,150.602,0)
lw(1.12)
lc(2)
-ld((0, 1.7745500000000001))
+ld((0, 1.5513600000000001))
b()
-bs(50.3999,149.6,0)
-bs(50.3999,153.575,0)
+bs(151.199,150.602,0)
+bs(151.199,154.074,0)
lw(1.12)
lc(2)
-ld((0, 2.4543599999999999))
+ld((0, 2.4543400000000002))
b()
-bs(50.3999,153.575,0)
-bs(50.3999,153.575,0)
-bc(50.3999,151.719,51.1375,149.938,52.4502,148.625,0)
+bs(151.199,154.074,0)
+bs(151.199,154.074,0)
+bc(151.199,152.219,151.938,150.438,153.25,149.125,0)
lw(1.12)
lc(2)
ld((0, 2.4543699999999999))
b()
-bs(52.45,148.625,0)
-bs(52.4502,148.625,0)
-bc(53.7629,147.313,55.5435,146.575,57.3999,146.575,0)
+bs(153.25,149.125,0)
+bs(153.25,149.125,0)
+bc(154.562,147.812,156.344,147.074,158.199,147.074,0)
lw(1.12)
lc(2)
ld((0, 2.4218799999999998))
b()
-bs(57.3999,146.575,0)
-bs(100.8,146.575,0)
+bs(158.199,147.074,0)
+bs(201.602,147.074,0)
lw(1.12)
lc(2)
ld((0, 2.4218799999999998))
b()
-bs(100.8,146.575,0)
-bs(144.2,146.575,0)
+bs(201.602,147.074,0)
+bs(245,147.074,0)
lw(1.12)
lc(2)
ld((0, 2.45438))
b()
-bs(144.2,146.575,0)
-bs(144.2,146.575,0)
-bc(146.056,146.575,147.837,145.838,149.15,144.525,0)
+bs(245,147.074,0)
+bs(245,147.074,0)
+bc(246.855,147.074,248.637,146.336,249.949,145.023,0)
lw(1.12)
lc(2)
-ld((0, 2.4543699999999999))
+ld((0, 2.4543900000000001))
b()
-bs(149.15,144.525,0)
-bs(149.15,144.525,0)
-bc(150.462,143.212,151.2,141.432,151.2,139.575,0)
+bs(249.949,145.023,0)
+bs(249.949,145.023,0)
+bc(251.262,143.711,252,141.93,252,140.074,0)
lw(1.12)
lc(2)
-ld((0, 1.73363))
+ld((0, 1.88243))
b()
-bs(151.2,139.575,0)
-bs(151.2,133.75,0)
+bs(252,140.074,0)
+bs(252,133.75,0)
lw(1.12)
lc(2)
ld((0, 2.5))
b()
-bs(151.2,133.75,0)
-bs(151.2,132.35,0)
+bs(252,133.75,0)
+bs(252,132.352,0)
fp((0,0,0))
le()
b()
-bs(147.35,132.35,0)
-bs(151.199,124.65,0)
-bs(155.05,132.35,0)
+bs(248.148,132.352,0)
+bs(252,124.648,0)
+bs(255.852,132.352,0)
lw(1.12)
lc(2)
b()
-bs(350.7,351.775,0)
-bs(361.9,351.775,0)
+bs(394.801,356.727,0)
+bs(406,356.727,0)
lw(1.12)
lc(2)
b()
-bs(361.9,351.775,0)
-bs(694.9,351.775,0)
+bs(406,356.727,0)
+bs(682.301,356.727,0)
lw(1.12)
lc(2)
b()
-bs(694.9,351.775,0)
-bs(694.9,351.775,0)
-bc(698.766,351.775,701.9,348.641,701.9,344.775,0)
+bs(682.301,356.727,0)
+bs(682.301,356.727,0)
+bc(686.164,356.727,689.301,353.59,689.301,349.727,0)
lw(1.12)
lc(2)
b()
-bs(701.9,344.775,0)
-bs(701.9,254.15,0)
+bs(689.301,349.727,0)
+bs(689.301,259.102,0)
lw(1.12)
lc(2)
b()
-bs(701.9,254.15,0)
-bs(701.9,252.75,0)
+bs(689.301,259.102,0)
+bs(689.301,257.699,0)
fp((0,0,0))
le()
b()
-bs(698.05,252.75,0)
-bs(701.899,245.05,0)
-bs(705.75,252.75,0)
+bs(685.449,257.699,0)
+bs(689.301,250,0)
+bs(693.148,257.699,0)
lw(1.12)
lc(2)
-ld((0, 2.4375200000000001))
+ld((0, 2.4375))
b()
-bs(308.7,339.25,0)
-bs(308.7,311.95,0)
+bs(352.801,344.199,0)
+bs(352.801,316.898,0)
fp((0,0,0))
le()
b()
-bs(304.85,311.95,0)
-bs(308.699,304.25,0)
-bs(312.55,311.95,0)
+bs(348.949,316.898,0)
+bs(352.801,309.199,0)
+bs(356.648,316.898,0)
lw(1.12)
lc(2)
-ld((0, 2.4999899999999999))
+ld((0, 2.5))
b()
-bs(308.7,339.25,0)
-bs(308.7,328.05,0)
+bs(352.801,344.199,0)
+bs(352.801,333,0)
lw(1.12)
lc(2)
-ld((0, 2.0312000000000001))
+ld((0, 2.03125))
b()
-bs(308.7,328.05,0)
-bs(308.7,332.6,0)
+bs(352.801,333,0)
+bs(352.801,337.551,0)
lw(1.12)
lc(2)
ld((0, 2.45438))
b()
-bs(308.7,332.6,0)
-bs(308.7,332.6,0)
-bc(308.7,330.744,307.962,328.963,306.65,327.651,0)
+bs(352.801,337.551,0)
+bs(352.801,337.551,0)
+bc(352.801,335.695,352.062,333.914,350.75,332.602,0)
lw(1.12)
lc(2)
ld((0, 2.45438))
b()
-bs(306.65,327.65,0)
-bs(306.65,327.651,0)
-bc(305.337,326.338,303.556,325.601,301.7,325.601,0)
+bs(350.75,332.602,0)
+bs(350.75,332.602,0)
+bc(349.438,331.289,347.656,330.551,345.801,330.551,0)
lw(1.12)
lc(2)
-ld((0, 2.4639500000000001))
+ld((0, 2.4218799999999998))
b()
-bs(301.7,325.6,0)
-bs(229.95,325.6,0)
+bs(345.801,330.551,0)
+bs(302.398,330.551,0)
lw(1.12)
lc(2)
-ld((0, 2.4639500000000001))
+ld((0, 2.4218799999999998))
b()
-bs(229.95,325.6,0)
-bs(158.2,325.6,0)
+bs(302.398,330.551,0)
+bs(259,330.551,0)
lw(1.12)
lc(2)
-ld((0, 2.4543699999999999))
+ld((0, 2.45438))
b()
-bs(158.2,325.6,0)
-bs(158.2,325.6,0)
-bc(156.344,325.6,154.563,324.863,153.25,323.55,0)
+bs(259,330.551,0)
+bs(259,330.551,0)
+bc(257.145,330.551,255.363,329.812,254.051,328.5,0)
lw(1.12)
lc(2)
ld((0, 2.45438))
b()
-bs(153.25,323.55,0)
-bs(153.25,323.55,0)
-bc(151.938,322.237,151.2,320.457,151.2,318.6,0)
+bs(254.051,328.5,0)
+bs(254.051,328.5,0)
+bc(252.738,327.188,252,325.406,252,323.551,0)
lw(1.12)
lc(2)
-ld((0, 2.3437899999999998))
+ld((0, 2.3437399999999999))
b()
-bs(151.2,318.6,0)
-bs(151.2,313.35,0)
+bs(252,323.551,0)
+bs(252,318.301,0)
lw(1.12)
lc(2)
ld((0, 2.5))
b()
-bs(151.2,313.35,0)
-bs(151.2,311.95,0)
+bs(252,318.301,0)
+bs(252,316.898,0)
fp((0,0,0))
le()
b()
-bs(147.35,311.95,0)
-bs(151.199,304.25,0)
-bs(155.05,311.95,0)
+bs(248.148,316.898,0)
+bs(252,309.199,0)
+bs(255.852,316.898,0)
lw(1.12)
lc(2)
b()
-bs(308.7,280.05,0)
-bs(308.7,252.75,0)
+bs(352.801,285,0)
+bs(352.801,257.699,0)
fp((0,0,0))
le()
b()
-bs(304.85,252.75,0)
-bs(308.699,245.05,0)
-bs(312.55,252.75,0)
+bs(348.949,257.699,0)
+bs(352.801,250,0)
+bs(356.648,257.699,0)
lw(1.12)
lc(2)
b()
-bs(466.2,280.05,0)
-bs(466.2,193.15,0)
+bs(453.602,285,0)
+bs(453.602,194.102,0)
fp((0,0,0))
le()
b()
-bs(462.35,193.15,0)
-bs(466.199,185.45,0)
-bs(470.05,193.15,0)
+bs(449.75,194.102,0)
+bs(453.602,186.398,0)
+bs(457.449,194.102,0)
lw(1.12)
lc(2)
b()
-bs(151.2,280.05,0)
-bs(151.2,268.85,0)
+bs(252,285,0)
+bs(252,273.801,0)
lw(1.12)
lc(2)
b()
-bs(151.2,268.85,0)
-bs(151.2,239.95,0)
+bs(252,273.801,0)
+bs(252,244.898,0)
lw(1.12)
lc(2)
b()
-bs(151.2,239.95,0)
-bs(151.2,239.95,0)
-bc(151.2,236.084,154.334,232.95,158.2,232.95,0)
+bs(252,244.898,0)
+bs(252,244.898,0)
+bc(252,241.035,255.137,237.898,259,237.898,0)
lw(1.12)
lc(2)
b()
-bs(158.2,232.95,0)
-bs(257.6,232.95,0)
+bs(259,237.898,0)
+bs(301.699,237.898,0)
lw(1.12)
lc(2)
b()
-bs(257.6,232.95,0)
-bs(259,232.95,0)
+bs(301.699,237.898,0)
+bs(303.102,237.898,0)
fp((0,0,0))
le()
b()
-bs(259,229.1,0)
-bs(266.699,232.95,0)
-bs(259,236.8,0)
+bs(303.102,234.051,0)
+bs(310.801,237.898,0)
+bs(303.102,241.75,0)
lw(1.12)
lc(2)
b()
-bs(350.7,232.95,0)
-bs(361.9,232.95,0)
+bs(394.801,237.898,0)
+bs(406,237.898,0)
lw(1.12)
lc(2)
b()
-bs(361.9,232.95,0)
-bs(459.2,232.95,0)
+bs(406,237.898,0)
+bs(446.602,237.898,0)
lw(1.12)
lc(2)
b()
-bs(459.2,232.95,0)
-bs(459.2,232.95,0)
-bc(463.066,232.95,466.2,229.816,466.2,225.95,0)
+bs(446.602,237.898,0)
+bs(446.602,237.898,0)
+bc(450.465,237.898,453.602,234.762,453.602,230.898,0)
lw(1.12)
lc(2)
b()
-bs(466.2,225.95,0)
-bs(466.2,194.55,0)
+bs(453.602,230.898,0)
+bs(453.602,195.5,0)
lw(1.12)
lc(2)
b()
-bs(466.2,194.55,0)
-bs(466.2,193.15,0)
+bs(453.602,195.5,0)
+bs(453.602,194.102,0)
fp((0,0,0))
le()
b()
-bs(462.35,193.15,0)
-bs(466.199,185.45,0)
-bs(470.05,193.15,0)
+bs(449.75,194.102,0)
+bs(453.602,186.398,0)
+bs(457.449,194.102,0)
lw(1.12)
lc(2)
b()
-bs(559.1,292.15,0)
-bs(547.9,292.15,0)
+bs(546.5,297.102,0)
+bs(535.301,297.102,0)
lw(1.12)
lc(2)
b()
-bs(547.9,292.15,0)
-bs(544.5,292.15,0)
+bs(535.301,297.102,0)
+bs(531.898,297.102,0)
lw(1.12)
lc(2)
b()
-bs(544.5,292.15,0)
-bs(544.5,292.15,0)
-bc(542.643,292.15,540.863,291.413,539.55,290.1,0)
+bs(531.898,297.102,0)
+bs(531.898,297.102,0)
+bc(530.043,297.102,528.262,296.363,526.949,295.051,0)
lw(1.12)
lc(2)
b()
-bs(539.55,290.1,0)
-bs(539.55,290.1,0)
-bc(538.238,288.787,537.5,287.007,537.5,285.15,0)
+bs(526.949,295.051,0)
+bs(526.949,295.051,0)
+bc(525.637,293.738,524.898,291.957,524.898,290.102,0)
lw(1.12)
lc(2)
b()
-bs(537.5,285.15,0)
-bs(537.5,232.75,0)
+bs(524.898,290.102,0)
+bs(524.898,235.699,0)
lw(1.12)
lc(2)
b()
-bs(537.5,232.75,0)
-bs(537.5,180.35,0)
+bs(524.898,235.699,0)
+bs(524.898,181.301,0)
lw(1.12)
lc(2)
b()
-bs(537.5,180.35,0)
-bs(537.5,180.35,0)
-bc(537.5,178.494,536.762,176.713,535.449,175.401,0)
+bs(524.898,181.301,0)
+bs(524.898,181.301,0)
+bc(524.898,179.445,524.16,177.664,522.852,176.352,0)
lw(1.12)
lc(2)
b()
-bs(535.449,175.4,0)
-bs(535.449,175.401,0)
-bc(534.137,174.088,532.356,173.35,530.5,173.35,0)
+bs(522.852,176.352,0)
+bs(522.852,176.352,0)
+bc(521.539,175.039,519.754,174.301,517.898,174.301,0)
lw(1.12)
lc(2)
b()
-bs(530.5,173.35,0)
-bs(517.3,173.35,0)
+bs(517.898,174.301,0)
+bs(504.699,174.301,0)
lw(1.12)
lc(2)
b()
-bs(517.3,173.35,0)
-bs(515.9,173.35,0)
+bs(504.699,174.301,0)
+bs(503.301,174.301,0)
fp((0,0,0))
le()
b()
-bs(515.9,177.2,0)
-bs(508.2,173.351,0)
-bs(515.9,169.5,0)
+bs(503.301,178.148,0)
+bs(495.602,174.301,0)
+bs(503.301,170.449,0)
lw(1.12)
lc(2)
b()
-bs(701.9,220.95,0)
-bs(701.9,193.3,0)
+bs(689.301,225.898,0)
+bs(689.301,194.301,0)
fp((0,0,0))
le()
b()
-bs(698.05,193.3,0)
-bs(701.899,185.6,0)
-bs(705.75,193.3,0)
+bs(685.449,194.301,0)
+bs(689.301,186.602,0)
+bs(693.148,194.301,0)
lw(1.12)
lc(2)
b()
-bs(659.9,233,0)
-bs(648.7,233,0)
+bs(647.301,237.949,0)
+bs(636.102,237.949,0)
lw(1.12)
lc(2)
b()
-bs(648.7,233,0)
-bs(594.9,233,0)
+bs(636.102,237.949,0)
+bs(582.301,237.949,0)
lw(1.12)
lc(2)
b()
-bs(594.9,233,0)
-bs(594.9,233,0)
-bc(593.043,233,591.263,232.263,589.95,230.95,0)
+bs(582.301,237.949,0)
+bs(582.301,237.949,0)
+bc(580.445,237.949,578.664,237.211,577.352,235.898,0)
lw(1.12)
lc(2)
b()
-bs(589.95,230.95,0)
-bs(589.95,230.95,0)
-bc(588.638,229.637,587.9,227.857,587.9,226,0)
+bs(577.352,235.898,0)
+bs(577.352,235.898,0)
+bc(576.039,234.586,575.301,232.805,575.301,230.949,0)
lw(1.12)
lc(2)
b()
-bs(587.9,226,0)
-bs(587.9,172.675,0)
+bs(575.301,230.949,0)
+bs(575.301,175.148,0)
lw(1.12)
lc(2)
b()
-bs(587.9,172.675,0)
-bs(587.9,119.35,0)
+bs(575.301,175.148,0)
+bs(575.301,119.352,0)
lw(1.12)
lc(2)
b()
-bs(587.9,119.35,0)
-bs(587.9,119.35,0)
-bc(587.9,117.494,587.162,115.713,585.85,114.401,0)
+bs(575.301,119.352,0)
+bs(575.301,119.352,0)
+bc(575.301,117.496,574.562,115.711,573.25,114.398,0)
lw(1.12)
lc(2)
b()
-bs(585.85,114.4,0)
-bs(585.85,114.401,0)
-bc(584.537,113.088,582.756,112.35,580.9,112.35,0)
+bs(573.25,114.398,0)
+bs(573.25,114.398,0)
+bc(571.938,113.09,570.156,112.352,568.301,112.352,0)
lw(1.12)
lc(2)
b()
-bs(580.9,112.35,0)
-bs(517.3,112.35,0)
+bs(568.301,112.352,0)
+bs(504.699,112.352,0)
lw(1.12)
lc(2)
b()
-bs(517.3,112.35,0)
-bs(515.9,112.35,0)
+bs(504.699,112.352,0)
+bs(503.301,112.352,0)
fp((0,0,0))
le()
b()
-bs(515.9,116.2,0)
-bs(508.2,112.35,0)
-bs(515.9,108.5,0)
+bs(503.301,116.199,0)
+bs(495.602,112.352,0)
+bs(503.301,108.5,0)
lw(1.12)
lc(2)
b()
-bs(701.9,161.05,0)
-bs(701.9,132.35,0)
+bs(689.301,162.051,0)
+bs(689.301,132.352,0)
fp((0,0,0))
le()
b()
-bs(698.05,132.35,0)
-bs(701.899,124.65,0)
-bs(705.75,132.35,0)
+bs(685.449,132.352,0)
+bs(689.301,124.648,0)
+bs(693.148,132.352,0)
lw(1.12)
lc(2)
b()
-bs(466.2,161.25,0)
-bs(466.2,132.05,0)
+bs(453.602,162.199,0)
+bs(453.602,132.051,0)
fp((0,0,0))
le()
b()
-bs(462.35,132.05,0)
-bs(466.199,124.35,0)
-bs(470.05,132.05,0)
+bs(449.75,132.051,0)
+bs(453.602,124.352,0)
+bs(457.449,132.051,0)
lw(1.12)
lc(2)
b()
-bs(151.2,280.05,0)
-bs(151.2,268.85,0)
+bs(252,285,0)
+bs(252,273.801,0)
lw(1.12)
lc(2)
b()
-bs(151.2,268.85,0)
-bs(151.2,180.325,0)
+bs(252,273.801,0)
+bs(252,181.324,0)
lw(1.12)
lc(2)
b()
-bs(151.2,180.325,0)
-bs(151.2,180.325,0)
-bc(151.2,176.459,154.334,173.325,158.2,173.325,0)
+bs(252,181.324,0)
+bs(252,181.324,0)
+bc(252,177.461,255.137,174.324,259,174.324,0)
lw(1.12)
lc(2)
b()
-bs(158.2,173.325,0)
-bs(257.6,173.325,0)
+bs(259,174.324,0)
+bs(301.699,174.324,0)
lw(1.12)
lc(2)
b()
-bs(257.6,173.325,0)
-bs(259,173.325,0)
+bs(301.699,174.324,0)
+bs(303.102,174.324,0)
fp((0,0,0))
le()
b()
-bs(259,169.475,0)
-bs(266.699,173.325,0)
-bs(259,177.175,0)
+bs(303.102,170.477,0)
+bs(310.801,174.324,0)
+bs(303.102,178.176,0)
lw(1.12)
lc(2)
b()
-bs(308.7,161.15,0)
-bs(308.7,149.95,0)
+bs(352.801,162.148,0)
+bs(352.801,150.949,0)
lw(1.12)
lc(2)
b()
-bs(308.7,149.95,0)
-bs(308.7,153.6,0)
+bs(352.801,150.949,0)
+bs(352.801,154.102,0)
lw(1.12)
lc(2)
b()
-bs(308.7,153.6,0)
-bs(308.7,153.6,0)
-bc(308.7,151.744,309.438,149.963,310.75,148.651,0)
+bs(352.801,154.102,0)
+bs(352.801,154.102,0)
+bc(352.801,152.246,353.539,150.461,354.852,149.148,0)
lw(1.12)
lc(2)
b()
-bs(310.75,148.65,0)
-bs(310.75,148.651,0)
-bc(312.063,147.338,313.844,146.6,315.7,146.6,0)
+bs(354.852,149.148,0)
+bs(354.852,149.148,0)
+bc(356.164,147.84,357.945,147.102,359.801,147.102,0)
lw(1.12)
lc(2)
b()
-bs(315.7,146.6,0)
-bs(387.45,146.6,0)
+bs(359.801,147.102,0)
+bs(403.199,147.102,0)
lw(1.12)
lc(2)
b()
-bs(387.45,146.6,0)
-bs(459.2,146.6,0)
+bs(403.199,147.102,0)
+bs(446.602,147.102,0)
lw(1.12)
lc(2)
b()
-bs(459.2,146.6,0)
-bs(459.2,146.6,0)
-bc(461.056,146.6,462.837,145.863,464.15,144.55,0)
+bs(446.602,147.102,0)
+bs(446.602,147.102,0)
+bc(448.457,147.102,450.238,146.363,451.551,145.051,0)
lw(1.12)
lc(2)
b()
-bs(464.15,144.55,0)
-bs(464.15,144.55,0)
-bc(465.462,143.237,466.2,141.457,466.2,139.6,0)
+bs(451.551,145.051,0)
+bs(451.551,145.051,0)
+bc(452.863,143.738,453.602,141.957,453.602,140.102,0)
lw(1.12)
lc(2)
b()
-bs(466.2,139.6,0)
-bs(466.2,133.45,0)
+bs(453.602,140.102,0)
+bs(453.602,133.449,0)
lw(1.12)
lc(2)
b()
-bs(466.2,133.45,0)
-bs(466.2,132.05,0)
+bs(453.602,133.449,0)
+bs(453.602,132.051,0)
fp((0,0,0))
le()
b()
-bs(462.35,132.05,0)
-bs(466.199,124.35,0)
-bs(470.05,132.05,0)
+bs(449.75,132.051,0)
+bs(453.602,124.352,0)
+bs(457.449,132.051,0)
lw(1.12)
lc(2)
-ld((0, 2.2889599999999999))
+ld((0, 2.5))
b()
-bs(552.65,41.8,0)
-bs(580.85,41.8,0)
-G_()
-G()
-fp((0,0,0))
-Fn('Helvetica')
-Fs(16)
-txt('libr',(341.317,393.4))
-fp((0,0,0))
-Fn('Helvetica')
-Fs(16)
-txt('ar',(362.494,393.4))
+bs(310.801,356.727,0)
+bs(299.602,356.727,0)
+lw(1.12)
+lc(2)
+ld((0, 2.48563))
+b()
+bs(299.602,356.727,0)
+bs(57.3984,356.727,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543699999999999))
+b()
+bs(57.3984,356.727,0)
+bs(57.3984,356.727,0)
+bc(53.5352,356.727,50.3984,353.59,50.3984,349.727,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4519700000000002))
+b()
+bs(50.3984,349.727,0)
+bs(50.3984,259.102,0)
+lw(1.12)
+lc(2)
+ld((0, 2.5))
+b()
+bs(50.3984,259.102,0)
+bs(50.3984,257.699,0)
fp((0,0,0))
-Fn('Helvetica')
-Fs(16)
-txt('y',(377.168,393.4))
+le()
+b()
+bs(46.5508,257.699,0)
+bs(50.3984,250,0)
+bs(54.25,257.699,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4375100000000001))
+b()
+bs(50.3984,222.801,0)
+bs(50.3984,195.5,0)
fp((0,0,0))
-Fn('Helvetica')
-Fs(16)
-txt('dependencies',(389.267,393.4))
+le()
+b()
+bs(46.5508,195.5,0)
+bs(50.3984,187.801,0)
+bs(54.25,195.5,0)
+lw(1.12)
+lc(2)
+b()
+bs(50.3984,160.801,0)
+bs(50.3984,154.148,0)
+lw(1.12)
+lc(2)
+b()
+bs(50.3984,154.148,0)
+bs(50.3984,154.148,0)
+bc(50.3984,152.293,51.1367,150.512,52.4492,149.199,0)
+lw(1.12)
+lc(2)
+b()
+bs(52.4492,149.199,0)
+bs(52.4492,149.199,0)
+bc(53.7617,147.887,55.543,147.148,57.3984,147.148,0)
+lw(1.12)
+lc(2)
+b()
+bs(57.3984,147.148,0)
+bs(100.801,147.148,0)
+lw(1.12)
+lc(2)
+b()
+bs(100.801,147.148,0)
+bs(144.199,147.148,0)
+lw(1.12)
+lc(2)
+b()
+bs(144.199,147.148,0)
+bs(144.199,147.148,0)
+bc(146.055,147.148,147.836,146.41,149.148,145.102,0)
+lw(1.12)
+lc(2)
+b()
+bs(149.148,145.102,0)
+bs(149.148,145.102,0)
+bc(150.461,143.789,151.199,142.004,151.199,140.148,0)
+lw(1.12)
+lc(2)
+b()
+bs(151.199,140.148,0)
+bs(151.199,134.898,0)
+lw(1.12)
+lc(2)
+b()
+bs(151.199,134.898,0)
+bs(151.199,133.5,0)
fp((0,0,0))
-Fn('Helvetica')
-Fs(16)
-txt('Qt for X11',(265.517,393.4))
-G_()
+le()
+b()
+bs(147.352,133.5,0)
+bs(151.199,125.801,0)
+bs(155.051,133.5,0)
+lw(1.12)
+lc(2)
+ld((0, 2.2889599999999999))
+b()
+bs(540.051,41.8008,0)
+bs(568.25,41.8008,0)
guidelayer('Guide Lines',1,0,0,1,(0,0,1))
grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/distributingqt.qdoc b/doc/src/distributingqt.qdoc
deleted file mode 100644
index 17d627a..0000000
--- a/doc/src/distributingqt.qdoc
+++ /dev/null
@@ -1,154 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Documentation on deploying Qt.
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*
-\page distributingqt.html
-
-\title Deploying Qt Applications
-
-This document lists the platform-specific files needed to distribute
-Qt applications. We do not include any compiler-specific files that
-may also be required. (See also, \link winsystem.html Window
-System-specific Notes\endlink.)
-
-\tableofcontents
-
-Also see the "deployment" articles in
-\e{\link http://qt.nokia.com/doc/qq/ Qt Quarterly\endlink}:
-\list
-\i \link http://qt.nokia.com/doc/qq/qq09-mac-deployment.html
-Deploying Applications on Mac OS X\endlink
-\i \link http://qt.nokia.com/doc/qq/qq10-windows-deployment.html
-Deploying Applications on Windows\endlink
-\i \link http://qt.nokia.com/doc/qq/qq11-unix-deployment.html
-Deploying Applications on X11\endlink
-\endlist
-
-\section1 Static Qt Applications
-
-To distribute static Qt applications, you need the following file for
-all platforms:
-
-\list
-\i your application's executable
-\endlist
-
-\section1 Dynamic Qt Applications
-
-To distribute dynamic Qt applications, you will need the following
-files for all platforms:
-
-\list
-\i application executable
-\i the Qt library
-\endlist
-
-The Qt library must either be in the same directory as the application
-executable or in a directory which is included in the system library
-path.
-
-The library is provided by the following platform specific files:
-
-\table
-\header \i Platform \i File
-\row \i Windows \i \c qt[version].dll
-\row \i Unix/Linux \i \c libqt[version].so
-\row \i Mac \i \c libqt[version].dylib
-\endtable
-
-\e version includes the three version numbers.
-
-\section2 Distributing Plugins
-
-You must include any plugin files required by the application.
-
-Plugins must be put into a subdirectory under a directory known to
-Qt as a plugin directory. The subdirectory must have the name of the
-plugin category (e.g. \c styles, \c sqldrivers, \c designer, etc.).
-
-Qt searches in the following directories for plugin categories:
-
-\list
-\i Application specific plugin paths
-\i Build-directory of Qt
-\i The application directory
-\endlist
-
-Application specific plugin paths can be added using
-QCoreApplication::addLibraryPath(). The build-directory of Qt is hardcoded
-in the Qt library and can be changed as a part of the installation
-process.
-
-\section1 Dynamic Dialogs
-
-For dynamic dialogs if you use QWidgetFactory, you need the following
-files for all platforms:
-
-\list
-\i The same files as used for dynamic Qt applications
-\i The QUI Library
-\endlist
-
-The QUI library is provided by the following platform specific files:
-\table
-\header \i Platform \i File
-\row \i Windows \i\c qui.lib
-\row \i Unix/Linux \i\c libqui.so
-\row \i Mac \i \c libqui.dylib
-\endtable
-
-The QUI library must either be in the same directory as the
-application executable or in a directory which is included in the
-system library path.
-
-*/
diff --git a/doc/src/dnd.qdoc b/doc/src/dnd.qdoc
deleted file mode 100644
index c185f06..0000000
--- a/doc/src/dnd.qdoc
+++ /dev/null
@@ -1,543 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page dnd.html
- \title Drag and Drop
- \ingroup architecture
- \brief An overview of the drag and drop system provided by Qt.
-
- Drag and drop provides a simple visual mechanism which users can use
- to transfer information between and within applications. (In the
- literature this is referred to as a "direct manipulation model".) Drag
- and drop is similar in function to the clipboard's cut and paste
- mechanism.
-
- \tableofcontents
-
- This document describes the basic drag and drop mechanism and
- outlines the approach used to enable it in custom widgets. Drag
- and drop operations are also supported by Qt's item views and by
- the graphics view framework; more information is available in the
- \l{Using Drag and Drop with Item Views} and \l{The Graphics View
- Framework} documents.
-
- \section1 Configuration
-
- The QApplication object provides some properties that are related
- to drag and drop operations:
-
- \list
- \i \l{QApplication::startDragTime} describes the amount of time in
- milliseconds that the user must hold down a mouse button over an
- object before a drag will begin.
- \i \l{QApplication::startDragDistance} indicates how far the user has to
- move the mouse while holding down a mouse button before the movement
- will be interpreted as dragging. Use of high values for this quantity
- prevents accidental dragging when the user only meant to click on an
- object.
- \endlist
-
- These quantities provide sensible default values for you to use if you
- provide drag and drop support in your widgets.
-
- \section1 Dragging
-
- To start a drag, create a QDrag object, and call its
- exec() function. In most applications, it is a good idea to begin a drag
- and drop operation only after a mouse button has been pressed and the
- cursor has been moved a certain distance. However, the simplest way to
- enable dragging from a widget is to reimplement the widget's
- \l{QWidget::mousePressEvent()}{mousePressEvent()} and start a drag
- and drop operation:
-
- \snippet doc/src/snippets/dragging/mainwindow.cpp 0
- \dots 8
- \snippet doc/src/snippets/dragging/mainwindow.cpp 2
-
- Although the user may take some time to complete the dragging operation,
- as far as the application is concerned the exec() function is a blocking
- function that returns with \l{Qt::DropActions}{one of several values}.
- These indicate how the operation ended, and are described in more detail
- below.
-
- Note that the exec() function does not block the main event loop.
-
- For widgets that need to distinguish between mouse clicks and drags, it
- is useful to reimplement the widget's
- \l{QWidget::mousePressEvent()}{mousePressEvent()} function to record to
- start position of the drag:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 6
-
- Later, in \l{QWidget::mouseMoveEvent()}{mouseMoveEvent()}, we can determine
- whether a drag should begin, and construct a drag object to handle the
- operation:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 7
- \dots
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 8
-
- This particular approach uses the \l QPoint::manhattanLength() function
- to get a rough estimate of the distance between where the mouse click
- occurred and the current cursor position. This function trades accuracy
- for speed, and is usually suitable for this purpose.
-
- \section1 Dropping
-
- To be able to receive media dropped on a widget, call
- \l{QWidget::setAcceptDrops()}{setAcceptDrops(true)} for the widget,
- and reimplement the \l{QWidget::dragEnterEvent()}{dragEnterEvent()} and
- \l{QWidget::dropEvent()}{dropEvent()} event handler functions.
-
- For example, the following code enables drop events in the constructor of
- a QWidget subclass, making it possible to usefully implement drop event
- handlers:
-
- \snippet doc/src/snippets/dropevents/window.cpp 0
- \dots
- \snippet doc/src/snippets/dropevents/window.cpp 1
- \snippet doc/src/snippets/dropevents/window.cpp 2
-
- The dragEnterEvent() function is typically used to inform Qt about the
- types of data that the widget accepts.
- You must reimplement this function if you want to receive either
- QDragMoveEvent or QDropEvent in your reimplementations of
- \l{QWidget::dragMoveEvent()}{dragMoveEvent()} and dropEvent().
-
- The following code shows how dragEnterEvent() can be reimplemented to
- tell the drag and drop system that we can only handle plain text:
-
- \snippet doc/src/snippets/dropevents/window.cpp 3
-
- The dropEvent() is used to unpack dropped data and handle it in way that
- is suitable for your application.
-
- In the following code, the text supplied in the event is passed to a
- QTextBrowser and a QComboBox is filled with the list of MIME types that
- are used to describe the data:
-
- \snippet doc/src/snippets/dropevents/window.cpp 4
-
- In this case, we accept the proposed action without checking what it is.
- In a real world application, it may be necessary to return from the
- dropEvent() function without accepting the proposed action or handling
- the data if the action is not relevant. For example, we may choose to
- ignore Qt::LinkAction actions if we do not support
- links to external sources in our application.
-
- \section2 Overriding Proposed Actions
-
- We may also ignore the proposed action, and perform some other action on
- the data. To do this, we would call the event object's
- \l{QDropEvent::setDropAction()}{setDropAction()} with the preferred
- action from Qt::DropAction before calling \l{QEvent::}{accept()}.
- This ensures that the replacement drop action is used instead of the
- proposed action.
-
- For more sophisticated applications, reimplementing
- \l{QWidget::dragMoveEvent()}{dragMoveEvent()} and
- \l{QWidget::dragLeaveEvent()}{dragLeaveEvent()} will let you make
- certain parts of your widgets sensitive to drop events, and give you more
- control over drag and drop in your application.
-
- \section2 Subclassing Complex Widgets
-
- Certain standard Qt widgets provide their own support for drag and drop.
- When subclassing these widgets, it may be necessary to reimplement
- \l{QWidget::dragMoveEvent()}{dragMoveEvent()} in addition to
- \l{QWidget::dragEnterEvent()}{dragEnterEvent()} and
- \l{QWidget::dropEvent()}{dropEvent()} to prevent the base class from
- providing default drag and drop handling, and to handle any special
- cases you are interested in.
-
- \section1 Drag and Drop Actions
-
- In the simplest case, the target of a drag and drop action receives a
- copy of the data being dragged, and the source decides whether to
- delete the original. This is described by the \c CopyAction action.
- The target may also choose to handle other actions, specifically the
- \c MoveAction and \c LinkAction actions. If the source calls
- QDrag::exec(), and it returns \c MoveAction, the source is responsible
- for deleting any original data if it chooses to do so. The QMimeData
- and QDrag objects created by the source widget \e{should not be deleted}
- - they will be destroyed by Qt. The target is responsible for taking
- ownership of the data sent in the drag and drop operation; this is
- usually done by keeping references to the data.
-
- If the target understands the \c LinkAction action, it should
- store its own reference to the original information; the source
- does not need to perform any further processing on the data. The
- most common use of drag and drop actions is when performing a
- Move within the same widget; see the section on \l{Drop Actions}
- for more information about this feature.
-
- The other major use of drag actions is when using a reference type
- such as text/uri-list, where the dragged data are actually references
- to files or objects.
-
- \section1 Adding New Drag and Drop Types
-
- Drag and drop is not limited to text and images. Any type of information
- can be transferred in a drag and drop operation. To drag information
- between applications, the applications must be able to indicate to each
- other which data formats they can accept and which they can produce.
- This is achieved using
- \l{http://www.rfc-editor.org/rfc/rfc1341.txt}{MIME types}. The QDrag
- object constructed by the source contains a list of MIME types that it
- uses to represent the data (ordered from most appropriate to least
- appropriate), and the drop target uses one of these to access the data.
- For common data types, the convenience functions handle the MIME types
- used transparently but, for custom data types, it is necessary to
- state them explicitly.
-
- To implement drag and drop actions for a type of information that is
- not covered by the QDrag convenience functions, the first and most
- important step is to look for existing formats that are appropriate:
- The Internet Assigned Numbers Authority (\l{http://www.iana.org}{IANA})
- provides a
- \l{http://www.iana.org/assignments/media-types/}{hierarchical
- list of MIME media types} at the Information Sciences Institute
- (\l{http://www.isi.edu}{ISI}).
- Using standard MIME types maximizes the interoperability of
- your application with other software now and in the future.
-
- To support an additional media type, simply set the data in the QMimeData
- object with the \l{QMimeData::setData()}{setData()} function, supplying
- the full MIME type and a QByteArray containing the data in the appropriate
- format. The following code takes a pixmap from a label and stores it
- as a Portable Network Graphics (PNG) file in a QMimeData object:
-
- \snippet doc/src/snippets/separations/finalwidget.cpp 0
-
- Of course, for this case we could have simply used
- \l{QMimeData::setImageData()}{setImageData()} instead to supply image data
- in a variety of formats:
-
- \snippet doc/src/snippets/separations/finalwidget.cpp 1
-
- The QByteArray approach is still useful in this case because it provides
- greater control over the amount of data stored in the QMimeData object.
-
- Note that custom datatypes used in item views must be declared as
- \l{QMetaObject}{meta objects} and that stream operators for them
- must be implemented.
-
- \section1 Drop Actions
-
- In the clipboard model, the user can \e cut or \e copy the source
- information, then later paste it. Similarly in the drag and drop
- model, the user can drag a \e copy of the information or they can drag
- the information itself to a new place (\e moving it). The
- drag and drop model has an additional complication for the programmer:
- The program doesn't know whether the user wants to cut or copy the
- information until the operation is complete. This often makes no
- difference when dragging information between applications, but within
- an application it is important to check which drop action was used.
-
- We can reimplement the mouseMoveEvent() for a widget, and start a drag
- and drop operation with a combination of possible drop actions. For
- example, we may want to ensure that dragging always moves objects in
- the widget:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 7
- \dots
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 8
-
- The action returned by the exec() function may default to a
- \c CopyAction if the information is dropped into another application
- but, if it is dropped in another widget in the same application, we
- may obtain a different drop action.
-
- The proposed drop actions can be filtered in a widget's dragMoveEvent()
- function. However, it is possible to accept all proposed actions in
- the dragEnterEvent() and let the user decide which they want to accept
- later:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 0
-
- When a drop occurs in the widget, the dropEvent() handler function is
- called, and we can deal with each possible action in turn. First, we
- deal with drag and drop operations within the same widget:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 1
-
- In this case, we refuse to deal with move operations. Each type of drop
- action that we accept is checked and dealt with accordingly:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 2
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 3
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 4
- \dots
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 5
-
- Note that we checked for individual drop actions in the above code.
- As mentioned above in the section on
- \l{#Overriding Proposed Actions}{Overriding Proposed Actions}, it is
- sometimes necessary to override the proposed drop action and choose a
- different one from the selection of possible drop actions.
- To do this, you need to check for the presence of each action in the value
- supplied by the event's \l{QDropEvent::}{possibleActions()}, set the drop
- action with \l{QDropEvent::}{setDropAction()}, and call
- \l{QEvent::}{accept()}.
-
- \section1 Drop Rectangles
-
- The widget's dragMoveEvent() can be used to restrict drops to certain parts
- of the widget by only accepting the proposed drop actions when the cursor
- is within those areas. For example, the following code accepts any proposed
- drop actions when the cursor is over a child widget (\c dropFrame):
-
- \snippet doc/src/snippets/droprectangle/window.cpp 0
-
- The dragMoveEvent() can also be used if you need to give visual
- feedback during a drag and drop operation, to scroll the window, or
- whatever is appropriate.
-
- \section1 The Clipboard
-
- Applications can also communicate with each other by putting data on
- the clipboard. To access this, you need to obtain a QClipboard object
- from the QApplication object:
-
- \snippet examples/widgets/charactermap/mainwindow.cpp 3
-
- The QMimeData class is used to represent data that is transferred to and
- from the clipboard. To put data on the clipboard, you can use the
- setText(), setImage(), and setPixmap() convenience functions for common
- data types. These functions are similar to those found in the QMimeData
- class, except that they also take an additional argument that controls
- where the data is stored: If \l{QClipboard::Mode}{Clipboard} is
- specified, the data is placed on the clipboard; if
- \l{QClipboard::Mode}{Selection} is specified, the data is placed in the
- mouse selection (on X11 only). By default, data is put on the clipboard.
-
- For example, we can copy the contents of a QLineEdit to the clipboard
- with the following code:
-
- \snippet examples/widgets/charactermap/mainwindow.cpp 11
-
- Data with different MIME types can also be put on the clipboard.
- Construct a QMimeData object and set data with setData() function in
- the way described in the previous section; this object can then be
- put on the clipboard with the
- \l{QClipboard::setMimeData()}{setMimeData()} function.
-
- The QClipboard class can notify the application about changes to the
- data it contains via its \l{QClipboard::dataChanged()}{dataChanged()}
- signal. For example, we can monitor the clipboard by connecting this
- signal to a slot in a widget:
-
- \snippet doc/src/snippets/clipboard/clipwindow.cpp 0
-
- The slot connected to this signal can read the data on the clipboard
- using one of the MIME types that can be used to represent it:
-
- \snippet doc/src/snippets/clipboard/clipwindow.cpp 1
- \dots
- \snippet doc/src/snippets/clipboard/clipwindow.cpp 2
-
- The \l{QClipboard::selectionChanged()}{selectionChanged()} signal can
- be used on X11 to monitor the mouse selection.
-
- \section1 Examples
-
- \list
- \o \l{draganddrop/draggableicons}{Draggable Icons}
- \o \l{draganddrop/draggabletext}{Draggable Text}
- \o \l{draganddrop/dropsite}{Drop Site}
- \o \l{draganddrop/fridgemagnets}{Fridge Magnets}
- \o \l{draganddrop/puzzle}{Drag and Drop Puzzle}
- \endlist
-
- \section1 Interoperating with Other Applications
-
- On X11, the public \l{http://www.newplanetsoftware.com/xdnd/}{XDND
- protocol} is used, while on Windows Qt uses the OLE standard, and
- Qt for Mac OS X uses the Carbon Drag Manager. On X11, XDND uses MIME,
- so no translation is necessary. The Qt API is the same regardless of
- the platform. On Windows, MIME-aware applications can communicate by
- using clipboard format names that are MIME types. Already some
- Windows applications use MIME naming conventions for their
- clipboard formats. Internally, Qt uses QWindowsMime and
- QMacPasteboardMime for translating proprietary clipboard formats
- to and from MIME types.
-
- On X11, Qt also supports drops via the Motif Drag & Drop Protocol. The
- implementation incorporates some code that was originally written by
- Daniel Dardailler, and adapted for Qt by Matt Koss <koss@napri.sk>
- and Trolltech. Here is the original copyright notice:
-
- \legalese
- Copyright 1996 Daniel Dardailler.
-
- Permission to use, copy, modify, distribute, and sell this software
- for any purpose is hereby granted without fee, provided that the above
- copyright notice appear in all copies and that both that copyright
- notice and this permission notice appear in supporting documentation,
- and that the name of Daniel Dardailler not be used in advertising or
- publicity pertaining to distribution of the software without specific,
- written prior permission. Daniel Dardailler makes no representations
- about the suitability of this software for any purpose. It is
- provided "as is" without express or implied warranty.
-
- Modifications Copyright 1999 Matt Koss, under the same license as
- above.
- \endlegalese
- \omit NOTE: The copyright notice is from qmotifdnd_x11.cpp. \endomit
-
- Note: The Motif Drag \& Drop Protocol only allows receivers to
- request data in response to a QDropEvent. If you attempt to
- request data in response to e.g. a QDragMoveEvent, an empty
- QByteArray is returned.
-*/
-
-/*!
- \page porting4-dnd.html
- \title Porting to Qt 4 - Drag and Drop
- \contentspage {Porting Guides}{Contents}
- \previouspage Porting to Qt 4 - Virtual Functions
- \nextpage Porting .ui Files to Qt 4
- \ingroup porting
- \brief An overview of the porting process for applications that use drag and drop.
-
- Qt 4 introduces a new set of classes to handle drag and drop operations
- that aim to be easier to use than their counterparts in Qt 3. As a result,
- the way that drag and drop is performed is quite different to the way
- developers of Qt 3 applications have come to expect. In this guide, we
- show the differences between the old and new APIs and indicate where
- applications need to be changed when they are ported to Qt 4.
-
- \tableofcontents
-
- \section1 Dragging
-
- In Qt 3, drag operations are encapsulated by \c QDragObject (see Q3DragObject)
- and its subclasses. These objects are typically constructed on the heap in
- response to mouse click or mouse move events, and ownership of them is
- transferred to Qt so that they can be deleted when the corresponding drag and
- drop operations have been completed. The drag source has no control over how
- the drag and drop operation is performed once the object's
- \l{Q3DragObject::}{drag()} function is called, and it receives no information
- about how the operation ended.
-
- \snippet doc/src/snippets/code/doc_src_dnd.qdoc 0
-
- Similarly, in Qt 4, drag operations are also initiated when a QDrag object
- is constructed and its \l{QDrag::}{exec()} function is called. In contrast,
- these objects are typically constructed on the stack rather than the heap
- since each drag and drop operation is performed synchronously as far as the
- drag source is concerned. One key benefit of this is that the drag source
- can receive information about how the operation ended from the value returned
- by \l{QDrag::}{exec()}.
-
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 2
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 3
- \dots 8
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 4
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 5
-
- A key difference in the above code is the use of the QMimeData class to hold
- information about the data that is transferred. Qt 3 relies on subclasses
- of \c QDragObject to provide support for specific MIME types; in Qt 4, the
- use of QMimeData as a generic container for data makes the relationship
- between MIME type and data more tranparent. QMimeData is described in more
- detail later in this document.
-
- \section1 Dropping
-
- In both Qt 3 and Qt 4, it is possible to prepare a custom widget to accept
- dropped data by enabling the \l{QWidget::}{acceptDrops} property of a widget,
- usually in the widget's constructor. As a result, the widget will receive
- drag enter events that can be handled by its \l{QWidget::}{dragEnterEvent()}
- function.
- As in Qt 3, custom widgets in Qt 4 handle these events by determining
- whether the data supplied by the drag and drop operation can be dropped onto
- the widget. Since the classes used to encapsulate MIME data are different in
- Qt 3 and Qt 4, the exact implementations differ.
-
- In Qt 3, the drag enter event is handled by checking whether each of the
- standard \c QDragObject subclasses can decode the data supplied, and
- indicating success or failure of these checks via the event's
- \l{QDragEnterEvent::}{accept()} function, as shown in this simple example:
-
- \snippet doc/src/snippets/code/doc_src_dnd.qdoc 1
-
- In Qt 4, you can examine the MIME type describing the data to determine
- whether the widget should accept the event or, for common data types, you
- can use convenience functions:
-
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 0
-
- The widget has some control over the type of drag and drop operation to be
- performed. In the above code, the action proposed by the drag source is
- accepted, but
- \l{Drag and Drop#Overriding Proposed Actions}{this can be overridden} if
- required.
-
- In both Qt 3 and Qt 4, it is necessary to accept a given drag event in order
- to receive the corresponding drop event. A custom widget in Qt 3 that can
- accept dropped data in the form of text or images might provide an
- implementation of \l{QWidget::}{dropEvent()} that looks like the following:
-
- \snippet doc/src/snippets/code/doc_src_dnd.qdoc 2
-
- In Qt 4, the event is handled in a similar way:
-
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 1
-
- It is also possible to extract data stored for a particular MIME type if it
- was specified by the drag source.
-
- \section1 MIME Types and Data
-
- In Qt 3, data to be transferred in drag and drop operations is encapsulated
- in instances of \c QDragObject and its subclasses, representing specific
- data formats related to common MIME type and subtypes.
-
- In Qt 4, only the QMimeData class is used to represent data, providing a
- container for data stored in multiple formats, each associated with
- a relevant MIME type. Since arbitrary MIME types can be specified, there is
- no need for an extensive class hierarchy to represent different kinds of
- information. Additionally, QMimeData it provides some convenience functions
- to allow the most common data formats to be stored and retrieved with less
- effort than for arbitrary MIME types.
-*/
diff --git a/doc/src/ecmascript.qdoc b/doc/src/ecmascript.qdoc
deleted file mode 100644
index 9d807e5..0000000
--- a/doc/src/ecmascript.qdoc
+++ /dev/null
@@ -1,313 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page ecmascript.html
- \title ECMAScript Reference
- \ingroup scripting
- \brief A list of objects, functions and properties supported by QtScript.
-
- This reference contains a list of objects, functions and
- properties supported by QtScript.
-
- \tableofcontents
-
- \section1 The Global Object
-
- \section2 Value Properties
-
- \list
- \o NaN
- \o Infinity
- \o undefined
- \o Math
- \endlist
-
- \section2 Function Properties
-
- \list
- \o eval(x)
- \o parseInt(string, radix)
- \o parseFloat(string)
- \o isNaN(number)
- \o isFinite(number)
- \o decodeURI(encodedURI)
- \o decodeURIComponent(encodedURIComponent)
- \o encodeURI(uri)
- \o encodeURIComponent(uriComponent)
- \endlist
-
- \section2 Constructor Properties
-
- \list
- \o Object
- \o Function
- \o Array
- \o String
- \o Boolean
- \o Number
- \o Date
- \o RegExp
- \o Error
- \o EvalError
- \o RangeError
- \o ReferenceError
- \o SyntaxError
- \o TypeError
- \o URIError
- \endlist
-
- \section1 Object Objects
-
- \section2 Object Prototype Object
-
- \list
- \o toString()
- \o toLocaleString()
- \o valueOf()
- \o hasOwnProperty(V)
- \o isPrototypeOf(V)
- \o propertyIsEnumerable(V)
- \endlist
-
- \section1 Function Objects
-
- \section2 Function Prototype Object
-
- \section3 Function Properties
-
- \list
- \o toString()
- \o apply(thisArg, argArray)
- \o call(thisArg [, arg1 [, arg2, ...]])
- \endlist
-
- \section1 Array Objects
-
- \section2 Array Prototype Object
-
- \section3 Function Properties
-
- \list
- \o toString()
- \o toLocaleString()
- \o concat([item1 [, item2 [, ...]]])
- \o join(separator)
- \o pop()
- \o push([item1 [, item2 [, ...]]])
- \o reverse()
- \o shift()
- \o slice(start, end)
- \o sort(comparefn)
- \o splice(start, deleteCount[, item1 [, item2 [, ...]]])
- \o unshift([item1 [, item2 [, ...]]])
- \endlist
-
- \section1 String Objects
-
- \section2 String Prototype Object
-
- \section3 Function Properties
-
- \list
- \o toString()
- \o valueOf()
- \o charAt(pos)
- \o charCodeAt(pos)
- \o concat([string1 [, string2 [, ...]]])
- \o indexOf(searchString ,position)
- \o lastIndexOf(searchString, position)
- \o localeCompare(that)
- \o match(regexp)
- \o replace(searchValue, replaceValue)
- \o search(regexp)
- \o slice(start, end)
- \o split(separator, limit)
- \o substring(start, end)
- \o toLowerCase()
- \o toLocaleLowerCase()
- \o toUpperCase()
- \o toLocaleUpperCase()
- \endlist
-
- \section1 Boolean Objects
-
- \section2 Boolean Prototype Object
-
- \section3 Function Properties
-
- \list
- \o toString()
- \o valueOf()
- \endlist
-
- \section1 Number Objects
-
- \section2 Number Prototype Object
-
- \section3 Function Properties
-
- \list
- \o toString(radix)
- \o toLocaleString()
- \o toFixed(fractionDigits)
- \o toExponential(fractionDigits)
- \o toPrecision(precision)
- \endlist
-
- \section1 The Math Object
-
- \section2 Value Properties
-
- \list
- \o E
- \o LN10
- \o LN2
- \o LOG2E
- \o LOG10E
- \o PI
- \o SQRT1_2
- \o SQRT2
- \endlist
-
- \section2 Function Properties
-
- \list
- \o abs(x)
- \o acos(x)
- \o asin(x)
- \o atan(x)
- \o atan2(y, x)
- \o ceil(x)
- \o cos(x)
- \o exp(x)
- \o floor(x)
- \o log(x)
- \o max([value1 [, value2 [, ...]]])
- \o min([value1 [, value2 [, ...]]])
- \o pow(x, y)
- \o random()
- \o round(x)
- \o sin(x)
- \o sqrt(x)
- \o tan(x)
- \endlist
-
- \section1 Date Objects
-
- \section2 Date Prototype Object
-
- \section3 Function Properties
-
- \list
- \o toString()
- \o toDateString()
- \o toTimeString()
- \o toLocaleString()
- \o toLocaleDateString()
- \o toLocaleTimeString()
- \o valueOf()
- \o getTime()
- \o getFullYear()
- \o getUTCFullYear()
- \o getMonth()
- \o getUTCMonth()
- \o getDate()
- \o getUTCDate()
- \o getDay()
- \o getUTCDay()
- \o getHours()
- \o getUTCHours()
- \o getMinutes()
- \o getUTCMinutes()
- \o getSeconds()
- \o getUTCSeconds()
- \o getMilliseconds()
- \o getUTCMilliseconds()
- \o getTimeZoneOffset()
- \o setTime(time)
- \o setMilliseconds(ms)
- \o setUTCMilliseconds(ms)
- \o setSeconds(sec [, ms])
- \o setUTCSeconds(sec [, ms])
- \o setMinutes(min [, sec [, ms]])
- \o setUTCMinutes(min [, sec [, ms]])
- \o setHours(hour [, min [, sec [, ms]]])
- \o setUTCHours(hour [, min [, sec [, ms]]])
- \o setDate(date)
- \o setUTCDate(date)
- \o setMonth(month [, date])
- \o setUTCMonth(month [, date])
- \o setFullYear(year [, month [, date]])
- \o setUTCFullYear(year [, month [, date]])
- \o toUTCString()
- \endlist
-
- \section1 RegExp Objects
-
- \section2 RegExp Prototype Object
-
- \section3 Function Properties
-
- \list
- \o exec(string)
- \o test(string)
- \o toString()
- \endlist
-
- \section1 Error Objects
-
- \section2 Error Prototype Object
-
- \section3 Value Properties
-
- \list
- \o name
- \o message
- \endlist
-
- \section3 Function Properties
-
- \list
- \o toString()
- \endlist
-
-*/
diff --git a/doc/src/editions.qdoc b/doc/src/editions.qdoc
deleted file mode 100644
index 2ead1ae..0000000
--- a/doc/src/editions.qdoc
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Documentation of Qt editions.
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \page editions.html
- \title Qt Editions
- \ingroup licensing
- \brief Information about the different editions of Qt.
-
- Qt can be used to create both commercial and non-commercial
- software for a wide range of different deployment environments,
- and is supplied in a number of different forms to suit the needs
- of different kinds of developers.
-
- In terms of license conditions, there are two main forms of Qt:
-
- \list
- \o The \l{Qt Commercial Editions} are the commercial
- versions of \l{About Qt}{Qt}.
- \o The \l{Open Source Versions of Qt} are freely available for download.
- \endlist
-
- On the Qt web site, you can find a
- \l{Qt Licensing Overview} and information on \l{Qt License Pricing}
- for commercial editions of Qt and other Qt-related products.
-*/
diff --git a/doc/src/emb-charinput.qdoc b/doc/src/emb-charinput.qdoc
deleted file mode 100644
index b0138d6..0000000
--- a/doc/src/emb-charinput.qdoc
+++ /dev/null
@@ -1,126 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qt-embedded-charinput.html
-
- \title Qt for Embedded Linux Character Input
- \ingroup qt-embedded-linux
-
- When running a \l {Qt for Embedded Linux} application, it either runs as a
- server or connects to an existing server. The keyboard driver is
- loaded by the server application when it starts running, using
- Qt's \l {How to Create Qt Plugins}{plugin system}.
-
- Internally in the client/server protocol, all system generated
- events, including key events, are passed to the server application
- which then propagates the event to the appropriate client. Note
- that key events do not always come from a keyboard device, they
- can can also be generated by the server process using input
- widgets.
-
- \table
- \header \o Input Widgets
- \row
- \o
-
- The server process may call the static QWSServer::sendKeyEvent()
- function at any time. Typically, this is done by popping up a
- widget that enables the user specify characters with the pointer
- device.
-
- Note that the key input widget should not take focus since the
- server would then just send the key events back to the input
- widget. One way to make sure that the input widget never takes
- focus is to set the Qt::Tool widget flag in the QWidget
- constructor.
-
- The \l{Qt Extended} environment contains various input widgets such as
- Handwriting Recognition and Virtual Keyboard.
-
- \endtable
-
- \tableofcontents
-
- \section1 Available Keyboard Drivers
-
- \l {Qt for Embedded Linux} provides ready-made drivers for the SL5000, Yopy,
- Vr41XX, console (TTY) and USB protocols. Run the \c configure
- script to list the available drivers:
-
- \snippet doc/src/snippets/code/doc_src_emb-charinput.qdoc 0
-
- Note that the console keyboard driver also handles console
- switching (\bold{Ctrl+Alt+F1}, ..., \bold{Ctrl+Alt+F10}) and
- termination (\bold{Ctrl+Alt+Backspace}).
-
- In the default Qt configuration, only the "TTY" driver is
- enabled. The various drivers can be enabled and disabled using the
- \c configure script. For example:
-
- \snippet doc/src/snippets/code/doc_src_emb-charinput.qdoc 1
-
- Custom keyboard drivers can be implemented by subclassing the
- QWSKeyboardHandler class and creating a keyboard driver plugin
- (derived from the QKbdDriverPlugin class). The default
- implementation of the QKbdDriverFactory class will automatically
- detect the plugin, loading the driver into the server application
- at run-time.
-
- \section1 Specifying a Keyboard Driver
-
- To specify which driver to use, set the QWS_KEYBOARD environment
- variable. For example (if the current shell is bash, ksh, zsh or
- sh):
-
- \snippet doc/src/snippets/code/doc_src_emb-charinput.qdoc 2
-
- The \c <driver> argument are \c SL5000, \c Yopy, \c VR41xx, \c
- TTY, \c USB and \l {QKbdDriverPlugin::keys()}{keys} identifying
- custom drivers, and the driver specific options are typically a
- device, e.g., \c /dev/tty0.
-
- Multiple keyboard drivers can be specified in one go:
-
- \snippet doc/src/snippets/code/doc_src_emb-charinput.qdoc 3
-
- Input will be read from all specified drivers.
-*/
diff --git a/doc/src/emb-crosscompiling.qdoc b/doc/src/emb-crosscompiling.qdoc
deleted file mode 100644
index 3d6795f..0000000
--- a/doc/src/emb-crosscompiling.qdoc
+++ /dev/null
@@ -1,191 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qt-embedded-crosscompiling.html
-
- \title Cross-Compiling Qt for Embedded Linux Applications
- \ingroup qt-embedded-linux
-
- Cross-compiling is the process of compiling an application on one
- machine, producing executable code for a different machine or
- device. To cross-compile a \l{Qt for Embedded Linux} application,
- use the following approach:
-
- \tableofcontents
-
- \note The cross-compiling procedure has the configuration
- process in common with the installation procedure; i.e., you might
- not necessarily have to perform all the mentioned actions
- depending on your current configuration.
-
- \section1 Step 1: Set the Cross-Compiler's Path
-
- Specify which cross-compiler to use by setting the \c PATH
- environment variable. For example, if the current shell is bash,
- ksh, zsh or sh:
-
- \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 0
-
- \section1 Step 2: Create a Target Specific qmake Specification
-
- The qmake tool requires a platform and compiler specific \c
- qmake.conf file describing the various default values, to generate
- the appropriate Makefiles. The standard \l{Qt for Embedded Linux}
- distribution provides such files for several combinations of
- platforms and compilers. These files are located in the
- distribution's \c mkspecs/qws subdirectory.
-
- Each platform has a default specification. \l{Qt for Embedded Linux} will
- use the default specification for the current platform unless told
- otherwise. To override this behavior, you can use the \c configure
- script's \c -platform option to change the specification for the host
- platform (where compilation will take place).
-
- The \c configure script's \c -xplatform option is used to provide a
- specification for the target architecture (where the library will be
- deployed).
-
- For example, to cross-compile an application to run on a device with
- an ARM architecture, using the GCC toolchain, run the configure
- script at the command line in the following way:
-
- \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 1
-
- If neither of the provided specifications fits your target device,
- you can create your own. To create a custom \c qmake.conf file,
- just copy and customize an already existing file. For example:
-
- \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 2
-
- \note When defining a mkspec for a Linux target, the directory must
- be prefixed with "linux-". We recommend that you copy the entire
- directory.
-
- Note also that when providing you own qmake specifcation, you must
- use the \c configure script's \c -xplatform option to make
- \l{Qt for Embedded Linux} aware of the custom \c qmake.conf file.
-
- \section1 Step 3: Provide Architecture Specific Files
-
- Starting with Qt 4, all of Qt's implicitly shared classes can
- safely be copied across threads like any other value classes,
- i.e., they are fully reentrant. This is accomplished by
- implementing reference counting operations using atomic hardware
- instructions on all the different platforms supported by Qt.
-
- To support a new architecture, it is important to ensure that
- these platform-specific atomic operations are implemented in a
- corresponding header file (\c qatomic_ARCH.h), and that this file
- is located in Qt's \c src/corelib/arch directory. For example, the
- Intel 80386 implementation is located in \c
- src/corelib/arch/qatomic_i386.h.
-
- See the \l {Implementing Atomic Operations} documentation for
- details.
-
- \section1 Step 4: Provide Hardware Drivers
-
- Without the proper mouse and keyboard drivers, you will not be
- able to give any input to your application when it is installed on
- the target device. You must also ensure that the appropriate
- screen driver is present to make the server process able to put
- the application's widgets on screen.
-
- \l{Qt for Embedded Linux} provides several ready-made mouse, keyboard and
- screen drivers, see the \l{Qt for Embedded Linux Pointer Handling}{pointer
- handling}, \l{Qt for Embedded Linux Character Input}{character input} and
- \l{Qt for Embedded Linux Display Management}{display management}
- documentation for details.
-
- In addition, custom drivers can be added by deriving from the
- QWSMouseHandler, QWSKeyboardHandler and QScreen classes
- respectively, and by creating corresponding plugins to make use of
- Qt's plugin mechanism (dynamically loading the drivers into the
- server application at runtime). Note that the plugins must be
- located in a location where Qt will look for plugins, e.g., the
- standard \c plugin directory.
-
- See the \l {How to Create Qt Plugins} documentation and the \l
- {tools/plugandpaint}{Plug & Paint} example for details.
-
- \section1 Step 5: Build the Target Specific Executable
-
- Before building the executable, you must specify the target
- architecture as well as the target specific hardware drivers by
- running the \c configure script:
-
- \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 3
-
- It is also important to make sure that all the third party
- libraries that the application and the Qt libraries require, are
- present in the tool chain. In particular, if the zlib and jpeg
- libraries are not available, they must be included by running the
- \c configure script with the \c -L and \c -I options. For example:
-
- \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 4
-
- The JPEG source can be downloaded from \l http://www.ijg.org/. The
- \l{Qt for Embedded Linux} distribution includes a version of the zlib source
- that can be compiled into the Qt for Embedded Linux library. If integrators
- wish to use a later version of the zlib library, it can be
- downloaded from the \l http://www.gzip.org/zlib/ website.
-
- Then build the executable:
-
- \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 5
-
- That's all. Your target specific executable is ready for deployment.
-
- \table 100%
- \row
- \o \bold {See also:}
-
- \l{Qt for Embedded Linux Architecture} and \l{Deploying Qt for Embedded Linux
- Applications}.
-
- \row
- \o \bold{Third party resources:}
-
- \l{http://silmor.de/29}{Cross compiling Qt/Win Apps on Linux} covers the
- process of cross-compiling Windows applications on Linux.
- \endtable
-*/
diff --git a/doc/src/emb-deployment.qdoc b/doc/src/emb-deployment.qdoc
deleted file mode 100644
index a6fb978..0000000
--- a/doc/src/emb-deployment.qdoc
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qt-embedded-deployment.html
-
- \title Deploying Qt for Embedded Linux Applications
- \ingroup qt-embedded-linux
-
- The procedure of deploying an Qt application on \l{Qt for Embedded Linux}
- is essentially the same as the deployment procedure on X11 platforms
- which is described in detail in the \l {Deploying an Application
- on X11 Platforms} documentation. See also the \l {Deploying Qt
- applications}{general remarks} about deploying Qt applications.
-
- In addition, there is a couple of Qt for Embedded Linux specific issues to
- keep in mind:
-
- \tableofcontents
-
- \section1 Fonts
-
- When Qt for Embedded Linux applications run, they look for a file called
- \c fontdir in Qt's \c /lib/fonts/ directory defining the
- fonts that are available to the application (i.e. the fonts
- located in the mentioned directory).
-
- For that reason, the preferred fonts must be copied to the \c
- /lib/fonts/ directory, and the \c fontdir file must be customized
- accordingly. See the \l {Qt for Embedded Linux Fonts}{fonts} documentation
- for more details about the supported font formats.
-
- Note that the application will look for the \c /lib/fonts/
- directory relative to the path set using the \c -prefix parameter
- when running the \c configure script; ensure that this is a
- sensible path in the target device environment. See the \l
- {Installing Qt for Embedded Linux#Step 3: Building the
- Library}{installation} documentation for more details.
-
- \section1 Environment Variables
-
- In general, any variable value that differs from the provided
- default values must be set explicitly in the target device
- environment. Typically, these include the QWS_MOUSE_PROTO,
- QWS_KEYBOARD and QWS_DISPLAY variables specifying the drivers for
- pointer handling, character input and display management,
- respectively.
-
- For example, without the proper mouse and keyboard drivers, there
- is no way to give any input to the application when it is
- installed on the target device. By running the \c configure script
- using the \c -qt-kbd-<keyboarddriver> and \c
- -qt-mouse-<mousedriver> options, the drivers are enabled, but in
- addition the drivers and the preferred devices must be specified
- as the ones to use in the target environment, by setting the
- environment variables.
-
- See the \l{Qt for Embedded Linux Pointer Handling}{pointer handling},
- \l{Qt for Embedded Linux Character Input}{character input} and
- \l{Qt for Embedded Linux Display Management}{display management}
- documentation for more information.
-
- \section1 Framebuffer Support
-
- No particular actions are required to enable the framebuffer on
- target devices: The Linux framebuffer is enabled by default on all
- modern Linux distributions. For information on older versions, see
- \l http://en.tldp.org/HOWTO/Framebuffer-HOWTO.html.
-
- To test that the Linux framebuffer is set up correctly, and that
- the device permissions are correct, use the program provided by
- the \l {Testing the Linux Framebuffer} document.
-*/
diff --git a/doc/src/emb-install.qdoc b/doc/src/emb-install.qdoc
deleted file mode 100644
index 5ee9e8f..0000000
--- a/doc/src/emb-install.qdoc
+++ /dev/null
@@ -1,197 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qt-embedded-install.html
-
- \title Installing Qt for Embedded Linux
- \ingroup qt-embedded-linux
- \ingroup installation
- \brief How to install Qt for Embedded Linux.
-
- This document describes how to install \l{Qt for Embedded Linux} in your
- development environment:
-
- \tableofcontents
-
- Please see the \l{Cross-Compiling Qt for Embedded Linux Applications}{cross
- compiling} and \l{Deploying Qt for Embedded Linux Applications}{deployment}
- documentation for details on how to install \l{Qt for Embedded Linux} on
- your target device.
-
- Note also that this installation procedure is written for Linux,
- and that it may need to be modified for other platforms.
-
- \section1 Step 1: Installing the License File (commercial editions only)
-
- If you have the commercial edition of \l{Qt for Embedded Linux}, the first step
- is to install your license file as \c $HOME/.qt-license.
-
- For the open source version you do not need a license file.
-
- \section1 Step 2: Unpacking the Archive
-
- First uncompress the archive in the preferred location, then
- unpack it:
-
- \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 0
-
- This document assumes that the archive is unpacked in the
- following directory:
-
- \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 1
-
- \section1 Step 3: Building the Library
-
- Before building the \l{Qt for Embedded Linux} library, run the \c
- ./configure script to configure the library for your development
- architecture. You can list all of the configuration system's
- options by typing \c {./configure -help}.
-
- Note that by default, \l{Qt for Embedded Linux} is configured for
- installation in the \c{/usr/local/Trolltech/QtEmbedded-%VERSION%}
- directory, but this can be changed by using the \c{-prefix}
- option. Alternatively, the \c{-prefix-install} option can be used
- to specify a "local" installation within the source directory.
-
- The configuration system is also designed to allow you to specify
- your platform architecture:
-
- \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 2
-
- In general, all Linux systems which have framebuffer support can
- use the \c generic architecture. Other typical architectures are
- \c x86, \c arm and \c mips.
-
- \note If you want to build Qt for Embedded Linux for use with a virtual
- framebuffer, pass the \c{-qvfb} option to the \c configure
- script.
-
- To create the library and compile all the demos, examples, tools,
- and tutorials, type:
-
- \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 3
-
- On some systems the \c make utility is named differently, e.g. \c
- gmake. The \c configure script tells you which \c make utility to
- use.
-
- If you did not configure \l{Qt for Embedded Linux} using the \c{-prefix-install}
- option, you need to install the library, demos, examples, tools,
- and tutorials in the appropriate place. To do this, type:
-
- \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 4
-
- and enter the root password.
-
- \note You can use the \c INSTALL_ROOT environment variable to specify
- the location of the installed files when invoking \c{make install}.
-
- \section1 Step 4: Adjusting the Environment Variables
-
- In order to use \l{Qt for Embedded Linux}, the \c PATH variable must be extended
- to locate \c qmake, \c moc and other \l{Qt for Embedded Linux} tools, and the \c
- LD_LIBRARY_PATH must be extended for compilers that do not support
- \c rpath.
-
- To set the \c PATH variable, add the following lines to your \c
- .profile file if your shell is bash, ksh, zsh or sh:
-
- \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 5
-
- In case your shell is csh or tcsh, add the following line to the
- \c .login file instead:
-
- \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 6
-
- If you use a different shell, please modify your environment
- variables accordingly.
-
- For compilers that do not support \c rpath you must also extend
- the \c LD_LIBRARY_PATH environment variable to include
- \c /usr/local/Trolltech/QtEmbedded-%VERSION%/lib. Note that on Linux
- with GCC, this step is not needed.
-
- \section1 Step 5: Building the Virtual Framebuffer
-
- For development and debugging, \l{Qt for Embedded Linux} provides a virtual
- framebuffer as well as the option of running \l{Qt for Embedded Linux} as a VNC
- server. For a description of how to install the virtual
- framebuffer and how to use the VNC protocol, please consult the
- documentation at:
-
- \list
- \o \l {The Virtual Framebuffer}
- \o \l {The VNC Protocol and Qt for Embedded Linux}
- \endlist
-
- Note that the virtual framebuffer requires a Qt for X11
- installation. See \l {Installing Qt on X11 Platforms} for details.
-
- The Linux framebuffer, on the other hand, is enabled by default on
- all modern Linux distributions. For information on older versions,
- see \l http://en.tldp.org/HOWTO/Framebuffer-HOWTO.html. To test
- that the Linux framebuffer is set up correctly, use the program
- provided by the \l {Testing the Linux Framebuffer} document.
-
- That's all. \l{Qt for Embedded Linux} is now installed.
-
- \table 100%
- \row
- \o
- \bold {Customizing the Qt for Embedded Linux Library}
-
- When building embedded applications on low-powered devices,
- reducing the memory and CPU requirements is important.
-
- A number of options tuning the library's performance are
- available. But the most direct way of saving resources is to
- fine-tune the set of Qt features that is compiled. It is also
- possible to make use of accelerated graphics hardware.
-
- \list
- \o \l {Fine-Tuning Features in Qt}
- \o \l {Qt Performance Tuning}
- \o \l {Adding an Accelerated Graphics Driver to Qt for Embedded Linux}
- \endlist
-
- \endtable
-*/
diff --git a/doc/src/emb-pointer.qdoc b/doc/src/emb-pointer.qdoc
deleted file mode 100644
index 2e9b9bd..0000000
--- a/doc/src/emb-pointer.qdoc
+++ /dev/null
@@ -1,216 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qt-embedded-pointer.html
-
- \title Qt for Embedded Linux Pointer Handling
- \ingroup qt-embedded-linux
-
- When running a \l{Qt for Embedded Linux} application, it either runs as a
- server or connects to an existing server. The mouse driver is
- loaded by the server application when it starts running, using
- Qt's \l {How to Create Qt Plugins}{plugin system}.
-
- Internally in the client/server protocol, all system generated
- events, including pointer events, are passed to the server
- application which then propagates the event to the appropriate
- client. Note that pointer handling in \l{Qt for Embedded Linux} works for
- both mouse and mouse-like devices such as touch panels and
- trackballs.
-
- Contents:
-
- \tableofcontents
-
- \section1 Available Drivers
-
- \l{Qt for Embedded Linux} provides ready-made drivers for the MouseMan,
- IntelliMouse, Microsoft, NEC Vr41XX, Linux Touch Panel and Yopy
- protocols as well as the universal touch screen library,
- tslib. Run the \c configure script to list the available drivers:
-
- \if defined(QTOPIA_PHONE)
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 0
-
- \bold{Note:} By default only the PC mouse driver is enabled.
-
- The various drivers can be enabled and disabled using the \c
- configure script. For example:
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 1
-
- \else
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 2
-
- In the default Qt configuration, only the "pc" mouse driver is
- enabled. The various drivers can be enabled and disabled using
- the \c configure script. For example:
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 3
- \endif
-
- Custom mouse drivers can be implemented by subclassing the
- QWSMouseHandler class and creating a mouse driver plugin (derived
- from the QMouseDriverPlugin class). The default implementation of the
- QMouseDriverFactory class will automatically detect the plugin,
- loading the driver into the server application at run-time.
-
- If you are creating a driver for a device that needs calibration
- or noise reduction, such as a touchscreen, derive from the
- QWSCalibratedMouseHandler subclass instead to take advantage of
- its calibration functionality.
-
- \if defined(QTOPIA_PHONE)
- For a tutorial on how to add a new keyboard driver plug-in
- see: \l {Tutorial: Implementing a Device Plug-in}.
- \endif
-
- \section1 Specifying a Driver
-
- Provided that the "pc" mouse driver is enabled, \l{Qt for Embedded Linux} will
- try to auto-detect the mouse device if it is one of the supported
- types on \c /dev/psaux or one of the \c /dev/ttyS? serial
- lines. If multiple mice are detected, all may be used
- simultaneously.
-
- Note that \l{Qt for Embedded Linux} does not support auto-detection of \e
- {touch panels} in which case the driver must be specified
- explicitly to determine which device to use.
-
- To manually specify which driver to use, set the QWS_MOUSE_PROTO
- environment variable. For example (if the current shell is bash,
- ksh, zsh or sh):
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 4
-
- The valid values for the \c <driver> argument are \c MouseMan, \c
- IntelliMouse, \c Microsoft, \c VR41xx, \c LinuxTP, \c Yopy, \c
- Tslib and \l {QMouseDriverPlugin::keys()}{keys} identifying custom
- drivers, and the driver specific options are typically a device,
- e.g., \c /dev/mouse for mouse devices and \c /dev/ts for touch
- panels.
-
- Multiple mouse drivers can be specified in one go:
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 5
-
- Input will be read from all specified drivers.
-
- Note that the \c Vr41xx driver also accepts two optional
- arguments: \c press=<value> defining a mouse click (the default
- value is 750) and \c filter=<value> specifying the length of the
- filter used to eliminate noise (the default length is 3). For
- example:
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 6
-
- \table
- \header \o The Tslib Mouse Driver
- \row
- \o
-
- The tslib mouse driver inherits the QWSCalibratedMouseHandler
- class, providing calibration and noise reduction functionality in
- addition to generating mouse events for devices using the
- Universal Touch Screen Library.
-
- To be able to compile this mouse handler, \l{Qt for Embedded Linux} must be
- configured with the \c -qt-mouse-tslib option as described
- above. In addition, the tslib headers and library must be present
- in the build environment.
-
- The tslib sources can be downloaded from \l
- http://tslib.berlios.de. Use the \c configure script's -L and
- -I options to explicitly specify the location of the library and
- its headers:
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 7
-
- In order to use this mouse driver, tslib must also be correctly
- installed on the target machine. This includes providing a \c
- ts.conf configuration file and setting the neccessary environment
- variables (see the README file provided with tslib for details).
-
- The \c ts.conf file will usually contain the following two lines:
-
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 8
-
- To make \l{Qt for Embedded Linux} explicitly choose the tslib mouse
- handler, set the QWS_MOUSE_PROTO environment variable as explained
- above.
-
- \endtable
-
- \section1 Troubleshooting
-
- \section2 Device Files
-
- Make sure you are using the correct device file.
-
- As a first step, you can test whether the device file actually gives any
- output. For instance, if you have specified the mouse driver with
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 9
- then try examining
- the output from the device by entering the following command in a console:
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 10
-
- If you see output from the device printed on the console when you move
- the mouse, you are probably using the correct device file; otherwise, you
- will need to experiment to find the correct device file.
-
- \section2 File Permissions
-
- Make sure you have sufficient permissions to access the device file.
-
- The Qt for Embedded Linux server process needs at least read permission for the
- device file. Some drivers also require write access to the device file.
- For instance, if you have specified the mouse driver with
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 11
- then examine the permissions of the device file by entering the following
- command in a console:
- \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 12
-
- If the device file is actually a symbolic link to another file, you must
- change the permissions of the actual file instead.
-*/
diff --git a/doc/src/emb-running.qdoc b/doc/src/emb-running.qdoc
deleted file mode 100644
index 67c9283..0000000
--- a/doc/src/emb-running.qdoc
+++ /dev/null
@@ -1,210 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qt-embedded-running.html
-
- \title Running Qt for Embedded Linux Applications
- \ingroup qt-embedded-linux
-
- A \l{Qt for Embedded Linux} application requires a server application to be
- running, or to be the server application itself. Any \l{Qt for Embedded Linux}
- application can be the server application by constructing the QApplication
- object with the QApplication::GuiServer type, or by running the application
- with the \c -qws command line option.
-
- Applications can run using both single and multiple displays, and
- various command line options are available.
-
- Note that this document assumes that you either are using the
- \l{The Virtual Framebuffer} or that you are running \l{Qt for Embedded Linux}
- using the \l {The VNC Protocol and Qt for Embedded Linux}{VNC} protocol,
- \e or that you have the Linux framebuffer configured
- correctly and that no server process is running. (To test that the
- Linux framebuffer is set up correctly, use the program provided by
- the \l {Testing the Linux Framebuffer} document.)
-
- \tableofcontents
-
- \section1 Using a Single Display
-
- To run the application using a single display, change to a Linux
- console and select an application to run, e.g. \l {Text
- Edit}{demos/textedit}. Run the application with the \c -qws
- option:
-
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 0
-
- \table 100%
- \row
- \o
- Provided that the environment variables are adjusted properly
- during the \l {Installing Qt for Embedded Linux}{installation process}, you
- should see the \l {Text Edit} demo appear.
-
- It might be that the hardware drivers must be specified explicitly
- to make everything work properly. For more information, please
- consult the following documentation:
-
- \list
- \o \l{Qt for Embedded Linux Pointer Handling}{Pointer Handling}
- \o \l{Qt for Embedded Linux Character Input}{Character Input}
- \o \l{Qt for Embedded Linux Display Management}{Display Management}
- \endlist
-
- \o
- \inlineimage qt-embedded-runningapplication.png
- \endtable
-
- Additional applications can be run as clients, i.e., by running
- these applications \e without the \c -qws option they will connect
- to the existing server as clients. You can exit the server
- application at any time using \gui{Ctrl+Alt+Backspace}.
-
- \section1 Using Multiple Displays
-
- Qt for Embedded Linux also allows multiple displays to be used
- simultaneously. There are two ways of achieving this: Either run
- multiple Qt for Embedded Linux server processes, or use the
- ready-made \c Multi screen driver.
-
- When running multiple server processes, the screen driver (and
- display number) must be specified for each process using the \c
- -display command line option or by setting the QWS_DISPLAY
- environment variable. For example:
-
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 1
-
- See the \l {Qt for Embedded Linux Display Management}{display management}
- documentation for more details on how to specify a screen
- driver. Note that you must also specify the display (i.e., server
- process) when starting client applications:
-
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 2
-
- There is no way of moving a client from one display to another
- when running multiple server processes. Using the \c Multi screen
- driver, on the other hand, applications can easiliy be moved
- between the various screens.
-
- The \c Multi screen driver can be specified just like any other
- screen driver by using the \c -display command line option or by
- setting the QWS_DISPLAY environment variable. For example:
-
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 3
-
- See the \l {Qt for Embedded Linux Display Management}{display management}
- documentation for details regarding arguments.
-
- \section1 Command Line Options
-
- \table 100%
- \header
- \o Option \o Description
- \row
- \o \bold -fn <font>
- \o
- Defines the application font. For example:
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 4
- The font should be specified using an X logical font description.
- \row
- \o \bold -bg <color>
- \o
- Sets the default application background color. For example:
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 5
- The color-name must be one of the names recognized by the QColor constructor.
- \row
- \o \bold -btn <color> \o
- Sets the default button color. For example:
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 6
- The color-name must be one of the names recognized by the QColor constructor.
- \row
- \o \bold -fg <color> \o
- Sets the default application foreground color. For example:
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 7
- The color-name must be one of the names recognized by the QColor constructor.
- \row
- \o \bold -name <objectname> \o
- Sets the application name, i.e. the application object's object name. For example:
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 8
- \row
- \o \bold -title <title> \o
- Sets the application's title. For example:
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 9
- \row
- \o \bold -geometry <width>x<height>+<Xoffset>+<Yoffset> \o
- Sets the client geometry of the first window that is shown. For example:
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 10
- \row
- \o \bold -keyboard \o
- Enables the keyboard.
-
- See also: \l {Qt for Embedded Linux Character Input}.
- \row
- \o \bold -nokeyboard \o
- Disables the keyboard.
- \row
- \o \bold -mouse \o
- Enables the mouse cursor.
-
- See also: \l {Qt for Embedded Linux Pointer Handling}.
- \row
- \o \bold -nomouse \o
- Disables the mouse cursor.
- \row
- \o \bold -qws \o
- Runs the application as a server application, i.e. constructs a
- QApplication object of the QApplication::GuiServer type.
- \row
- \o \bold -display \o
- Specifies the screen driver.
-
- See also: \l {Qt for Embedded Linux Display Management}.
- \row
- \o \bold -decoration <style>\o
- Sets the application decoration. For example:
- \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 11
- The supported styles are \c windows, \c default and \c styled.
-
- See also QDecoration.
-
- \endtable
-*/
diff --git a/doc/src/eventsandfilters.qdoc b/doc/src/eventsandfilters.qdoc
deleted file mode 100644
index 04ff54b..0000000
--- a/doc/src/eventsandfilters.qdoc
+++ /dev/null
@@ -1,221 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page eventsandfilters.html
- \title Events and Event Filters
- \ingroup architecture
- \brief A guide to event handling in Qt.
-
- In Qt, events are objects, derived from the abstract QEvent class,
- that represent things that have happened either within an application
- or as a result of outside activity that the application needs to know
- about. Events can be received and handled by any instance of a
- QObject subclass, but they are especially relevant to widgets. This
- document describes how events are delivered and handled in a typical
- application.
-
- \tableofcontents
-
- \section1 How Events are Delivered
-
- When an event occurs, Qt creates an event object to represent it by
- constructing an instance of the appropriate QEvent subclass, and
- delivers it to a particular instance of QObject (or one of its
- subclasses) by calling its \l{QObject::}{event()} function.
-
- This function does not handle the event itself; based on the type
- of event delivered, it calls an event handler for that specific
- type of event, and sends a response based on whether the event
- was accepted or ignored.
-
- \omit
- Event delivery means that an
- event has occurred, the QEvent indicates precisely what, and the
- QObject needs to respond. Most events are specific to QWidget and its
- subclasses, but there are important events that aren't related to
- graphics (e.g., \l{QTimer}{timer events}).
- \endomit
-
- Some events, such as QMouseEvent and QKeyEvent, come from the
- window system; some, such as QTimerEvent, come from other sources;
- some come from the application itself.
-
- \section1 Event Types
-
- Most events types have special classes, notably QResizeEvent,
- QPaintEvent, QMouseEvent, QKeyEvent, and QCloseEvent. Each class
- subclasses QEvent and adds event-specific functions. For example,
- QResizeEvent adds \l{QResizeEvent::}{size()} and
- \l{QResizeEvent::}{oldSize()} to enable widgets to discover how
- their dimensions have been changed.
-
- Some classes support more than one actual event type. QMouseEvent
- supports mouse button presses, double-clicks, moves, and other
- related operations.
-
- Each event has an associated type, defined in QEvent::Type, and this
- can be used as a convenient source of run-time type information to
- quickly determine which subclass a given event object was constructed
- from.
-
- Since programs need to react in varied and complex ways, Qt's
- event delivery mechanisms are flexible. The documentation for
- QCoreApplication::notify() concisely tells the whole story; the
- \e{Qt Quarterly} article
- \l{http://qt.nokia.com/doc/qq/qq11-events.html}{Another Look at Events}
- rehashes it less concisely. Here we will explain enough for 95%
- of applications.
-
- \section1 Event Handlers
-
- The normal way for an event to be delivered is by calling a virtual
- function. For example, QPaintEvent is delivered by calling
- QWidget::paintEvent(). This virtual function is responsible for
- reacting appropriately, normally by repainting the widget. If you
- do not perform all the necessary work in your implementation of the
- virtual function, you may need to call the base class's implementation.
-
- For example, the following code handles left mouse button clicks on
- a custom checkbox widget while passing all other button clicks to the
- base QCheckBox class:
-
- \snippet doc/src/snippets/events/events.cpp 0
-
- If you want to replace the base class's function, you must
- implement everything yourself. However, if you only want to extend
- the base class's functionality, then you implement what you want and
- call the base class to obtain the default behavior for any cases you
- do not want to handle.
-
- Occasionally, there isn't such an event-specific function, or the
- event-specific function isn't sufficient. The most common example
- involves \key Tab key presses. Normally, QWidget intercepts these to
- move the keyboard focus, but a few widgets need the \key{Tab} key for
- themselves.
-
- These objects can reimplement QObject::event(), the general event
- handler, and either do their event handling before or after the usual
- handling, or they can replace the function completely. A very unusual
- widget that both interprets \key Tab and has an application-specific
- custom event might contain the following \l{QObject::event()}{event()}
- function:
-
- \snippet doc/src/snippets/events/events.cpp 1
-
- Note that QWidget::event() is still called for all of the cases not
- handled, and that the return value indicates whether an event was
- dealt with; a \c true value prevents the event from being sent on
- to other objects.
-
- \section1 Event Filters
-
- Sometimes an object needs to look at, and possibly intercept, the
- events that are delivered to another object. For example, dialogs
- commonly want to filter key presses for some widgets; for example,
- to modify \key{Return}-key handling.
-
- The QObject::installEventFilter() function enables this by setting
- up an \e{event filter}, causing a nominated filter object to receive
- the events for a target object in its QObject::eventFilter()
- function. An event filter gets to process events before the target
- object does, allowing it to inspect and discard the events as
- required. An existing event filter can be removed using the
- QObject::removeEventFilter() function.
-
- When the filter object's \l{QObject::}{eventFilter()} implementation
- is called, it can accept or reject the event, and allow or deny
- further processing of the event. If all the event filters allow
- further processing of an event (by each returning \c false), the event
- is sent to the target object itself. If one of them stops processing
- (by returning \c true), the target and any later event filters do not
- get to see the event at all.
-
- \snippet doc/src/snippets/eventfilters/filterobject.cpp 0
-
- The above code shows another way to intercept \key{Tab} key press
- events sent to a particular target widget. In this case, the filter
- handles the relevant events and returns \c true to stop them from
- being processed any further. All other events are ignored, and the
- filter returns \c false to allow them to be sent on to the target
- widget, via any other event filters that are installed on it.
-
- It is also possible to filter \e all events for the entire application,
- by installing an event filter on the QApplication or QCoreApplication
- object. Such global event filters are called before the object-specific
- filters. This is very powerful, but it also slows down event delivery
- of every single event in the entire application; the other techniques
- discussed should generally be used instead.
-
- \section1 Sending Events
-
- Many applications want to create and send their own events. You can
- send events in exactly the same ways as Qt's own event loop by
- constructing suitable event objects and sending them with
- QCoreApplication::sendEvent() and QCoreApplication::postEvent().
-
- \l{QCoreApplication::}{sendEvent()} processes the event immediately.
- When it returns, the event filters and/or the object itself have
- already processed the event. For many event classes there is a function
- called isAccepted() that tells you whether the event was accepted
- or rejected by the last handler that was called.
-
- \l{QCoreApplication::}{postEvent()} posts the event on a queue for
- later dispatch. The next time Qt's main event loop runs, it dispatches
- all posted events, with some optimization. For example, if there are
- several resize events, they are are compressed into one. The same
- applies to paint events: QWidget::update() calls
- \l{QCoreApplication::}{postEvent()}, which eliminates flickering and
- increases speed by avoiding multiple repaints.
-
- \l{QCoreApplication::}{postEvent()} is also used during object
- initialization, since the posted event will typically be dispatched
- very soon after the initialization of the object is complete.
- When implementing a widget, it is important to realise that events
- can be delivered very early in its lifetime so, in its constructor,
- be sure to initialize member variables early on, before there's any
- chance that it might receive an event.
-
- To create events of a custom type, you need to define an event
- number, which must be greater than QEvent::User, and you may need to
- subclass QEvent in order to pass specific information about your
- custom event. See the QEvent documentation for further details.
-*/
diff --git a/doc/src/examples-overview.qdoc b/doc/src/examples-overview.qdoc
deleted file mode 100644
index bee7d05..0000000
--- a/doc/src/examples-overview.qdoc
+++ /dev/null
@@ -1,348 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page examples-overview.html
- \title An Overview of Qt's Examples
- \brief A short guide to the different categories of examples included with Qt.
- \ingroup howto
-
- Qt is supplied with a variety of examples that cover almost every aspect
- of development. These examples are ordered by functional area, but many
- examples often use features from many parts of Qt to highlight one area
- in particular.
-
- This document provides a brief overview of each example category and
- provides links to the more formal \l{Qt Examples}{list of examples}.
-
- \section1 \l{Qt Examples#Widgets}{Widgets}
-
- \l{Qt Examples#Widgets}{\inlineimage widget-examples.png
- }
-
- Qt comes with a large range of standard widgets that users of modern
- applications have come to expect.
-
- You can also develop your own custom widgets and controls, and use them
- alongside standard widgets.
-
- It is even possible to provide custom styles and themes for widgets that can
- be used to change the appearance of standard widgets and appropriately
- written custom widgets.
-
- \section1 \l{Qt Examples#Dialogs}{Dialogs}
-
- \l{Qt Examples#Dialogs}{\inlineimage dialog-examples.png
- }
-
- Qt includes standard dialogs for many common operations, such as file
- selection, printing, and color selection.
-
- Custom dialogs can also be created for specialized modal or modeless
- interactions with users.
-
- \section1 \l{Qt Examples#Main Windows}{Main Windows}
-
- \l{Qt Examples#Main Windows}{\inlineimage mainwindow-examples.png
- }
-
- All the standard features of application main windows are provided by Qt.
-
- Main windows can have pull down menus, tool bars, and dock windows. These
- separate forms of user input are unified in an integrated action system that
- also supports keyboard shortcuts and accelerator keys in menu items.
-
- \section1 \l{Qt Examples#Layouts}{Layouts}
-
- \l{Qt Examples#Layouts}{\inlineimage layout-examples.png
- }
-
- Qt uses a layout-based approach to widget management. Widgets are arranged in
- the optimal positions in windows based on simple layout rules, leading to a
- consistent look and feel.
-
- Custom layouts can be used to provide more control over the positions and
- sizes of child widgets.
-
- \section1 \l{Qt Examples#Painting}{Painting}
-
- \l{Qt Examples#Painting}{\inlineimage painting-examples.png
- }
-
- Qt's painting system is able to render vector graphics, images, and outline
- font-based text with sub-pixel accuracy accuracy using anti-aliasing to
- improve rendering quality.
-
- These examples show the most common techniques that are used when painting
- with Qt, from basic concepts such as drawing simple primitives to the use of
- transformations.
-
- \section1 \l{Qt Examples#Item Views}{Item Views}
-
- \l{Qt Examples#Item Views}{\inlineimage itemview-examples.png
- }
-
- Item views are widgets that typically display data sets. Qt 4's model/view
- framework lets you handle large data sets by separating the underlying data
- from the way it is represented to the user, and provides support for
- customized rendering through the use of delegates.
-
- \section1 \l{Qt Examples#Graphics View}{Graphics View}
-
- \l{Qt Examples#Graphics View}{\inlineimage graphicsview-examples.png
- }
-
- Qt is provided with a comprehensive canvas through the GraphicsView
- classes.
-
- These examples demonstrate the fundamental aspects of canvas programming
- with Qt.
-
- \section1 \l{Qt Examples#Rich Text}{Rich Text}
-
- \l{Qt Examples#Rich Text}{\inlineimage richtext-examples.png
- }
-
- Qt provides powerful document-oriented rich text engine that supports Unicode
- and right-to-left scripts. Documents can be manipulated using a cursor-based
- API, and their contents can be imported and exported as both HTML and in a
- custom XML format.
-
- \section1 \l{Qt Examples#Tools}{Tools}
-
- \l{Qt Examples#Tools}{\inlineimage tool-examples.png
- }
-
- Qt is equipped with a range of capable tool classes, from containers and
- iterators to classes for string handling and manipulation.
-
- Other classes provide application infrastructure support, handling plugin
- loading and managing configuration files.
-
- \section1 \l{Qt Examples#Desktop}{Desktop}
-
- \l{Qt Examples#Desktop}{\inlineimage desktop-examples.png
- }
-
- Qt provides features to enable applications to integrate with the user's
- preferred desktop environment.
-
- Features such as system tray icons, access to the desktop widget, and
- support for desktop services can be used to improve the appearance of
- applications and take advantage of underlying desktop facilities.
-
- \section1 \l{Qt Examples#Drag and Drop}{Drag and Drop}
-
- \l{Qt Examples#Drag and Drop}{\inlineimage draganddrop-examples.png
- }
-
- Qt supports native drag and drop on all platforms via an extensible
- MIME-based system that enables applications to send data to each other in the
- most appropriate formats.
-
- Drag and drop can also be implemented for internal use by applications.
-
- \section1 \l{Qt Examples#Threads}{Threads}
-
- \l{Qt Examples#Threads}{\inlineimage thread-examples.png
- }
-
- Qt 4 makes it easier than ever to write multithreaded applications. More
- classes have been made usable from non-GUI threads, and the signals and slots
- mechanism can now be used to communicate between threads.
-
- Additionally, it is now possible to move objects between threads.
-
- \section1 \l{Qt Examples#Concurrent Programming}{Concurrent Programming}
-
- The QtConcurrent namespace includes a collection of classes and functions
- for straightforward concurrent programming.
-
- These examples show how to apply the basic techniques of concurrent
- programming to simple problems.
-
- \section1 \l{Qt Examples#Network}{Network}
-
- \l{Qt Examples#Network}{\inlineimage network-examples.png
- }
-
- Qt is provided with an extensive set of network classes to support both
- client-based and server side network programming.
-
- These examples demonstrate the fundamental aspects of network programming
- with Qt.
-
- \section1 \l{Qt Examples#XML}{XML}
-
- \l{Qt Examples#XML}{\inlineimage xml-examples.png
- }
-
- XML parsing and handling is supported through SAX and DOM compliant APIs.
-
- Qt's SAX compliant classes allow you to parse XML incrementally; the DOM
- classes enable more complex document-level operations to be performed on
- XML files.
-
- \section1 \l{Qt Examples#XQuery, XPath}{XQuery, XPath}
-
- Qt provides an XQuery/XPath engine, QtXmlPatterns, for querying XML
- files and custom data models, similar to the model/view framework.
-
- \section1 \l{Qt Examples#OpenGL}{OpenGL}
-
- \l{Qt Examples#OpenGL}{\inlineimage opengl-examples.png
- }
-
- Qt provides support for integration with OpenGL implementations on all
- platforms, giving developers the opportunity to display hardware accelerated
- 3D graphics alongside a more conventional user interface.
-
- These examples demonstrate the basic techniques used to take advantage of
- OpenGL in Qt applications.
-
- \section1 \l{Qt Examples#SQL}{SQL}
-
- \l{Qt Examples#SQL}{\inlineimage sql-examples.png
- }
-
- Qt provides extensive database interoperability, with support for products
- from both open source and proprietary vendors.
-
- SQL support is integrated with Qt's model/view architecture, making it easier
- to provide GUI integration for your database applications.
-
- \section1 \l{Qt Examples#Help System}{Help System}
-
- \l{Qt Examples#Help System}{\inlineimage assistant-examples.png
- }
-
- Support for interactive help is provided by the Qt Assistant application.
- Developers can take advantages of the facilities it offers to display
- specially-prepared documentation to users of their applications.
-
- \section1 \l{Qt Examples#Qt Designer}{Qt Designer}
-
- \l{Qt Examples#Qt Designer}{\inlineimage designer-examples.png
- }
-
- Qt Designer is a capable graphical user interface designer that lets you
- create and configure forms without writing code. GUIs created with
- Qt Designer can be compiled into an application or created at run-time.
-
- \section1 \l{Qt Examples#UiTools}{UiTools}
-
- \l{Qt Examples#UiTools}{\inlineimage uitools-examples.png
- }
-
- Qt is equipped with a range of capable tool classes, from containers and
- iterators to classes for string handling and manipulation.
-
- Other classes provide application infrastructure support, handling plugin
- loading and managing configuration files.
-
- \section1 \l{Qt Examples#Qt Linguist}{Qt Linguist}
-
- \l{Qt Examples#Qt Linguist}{\inlineimage linguist-examples.png
- }
-
- Internationalization is a core feature of Qt. These examples show how to
- access translation and localization facilities at run-time.
-
- \section1 \l{Qt Examples#Qt Script}{Qt Script}
-
- \l{Qt Examples#Qt Script}{\inlineimage qtscript-examples.png
- }
-
- Qt is provided with a powerful embedded scripting environment through the QtScript
- classes.
-
- These examples demonstrate the fundamental aspects of scripting applications
- with Qt.
-
- \section1 \l{Qt Examples#Phonon Multimedia Framework}{Phonon Multimedia Framework}
-
- \l{Qt Examples#Phonon Multimedia Framework}{\inlineimage phonon-examples.png
- }
-
- The Phonon Multimedia Framework brings multimedia support to Qt applications.
-
- The examples and demonstrations provided show how to play music and movies
- using the Phonon API.
-
- \section1 \l{Qt Examples#WebKit}{WebKit}
-
- \l{Qt Examples#WebKit}{\inlineimage webkit-examples.png
- }
-
- Qt provides an integrated Web browser component based on WebKit, the popular
- open source browser engine.
-
- These examples and demonstrations show a range of different uses for WebKit,
- from displaying Web pages within a Qt user interface to an implementation of
- a basic function Web browser.
-
- \section1 \l{Qt Examples#Qt for Embedded Linux}{Qt for Embedded Linux}
-
- \l{Qt Examples#Qt for Embedded Linux}{\inlineimage qt-embedded-examples.png
- }
-
- These examples show how to take advantage of features specifically designed
- for use on systems with limited resources, specialized hardware, and small
- screens.
-
- \section1 \l{Qt Examples#ActiveQt}{ActiveQt}
-
- Qt is supplied with a number of example applications and demonstrations that
- have been written to provide developers with examples of the Qt API in use,
- highlight good programming practice, and showcase features found in each of
- Qt's core technologies.
-
- The example and demo launcher can be used to explore the different categories
- available. It provides an overview of each example, lets you view the
- documentation in Qt Assistant, and is able to launch examples and demos.
-
- \section1 \l{http://qt.nokia.com/doc/qq}{Another Source of Examples}
-
- One more valuable source for examples and explanations of Qt
- features is the archive of the \l {http://qt.nokia.com/doc/qq}
- {Qt Quarterly}.
-
-*/
diff --git a/doc/src/examples.qdoc b/doc/src/examples.qdoc
deleted file mode 100644
index e8dcafd..0000000
--- a/doc/src/examples.qdoc
+++ /dev/null
@@ -1,410 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page examples.html
- \title Qt Examples
- \brief Information about the example programs provided with Qt.
- \ingroup howto
-
- This is the list of examples in Qt's \c examples directory. The
- examples demonstrate Qt features in small, self-contained
- programs. They are not all designed to be impressive when you run
- them, but their source code is carefully written to show good Qt
- programming practices. You can launch any of these programs from the
- \l{Examples and Demos Launcher} application.
-
- If you are new to Qt, you should probably start by going through
- the \l{Tutorials} before you have a look at the
- \l{mainwindows/application}{Application} example.
-
- In addition to the examples and the tutorial, Qt includes a
- \l{Qt Demonstrations}{selection of demos} that deliberately show off
- Qt's features. You might want to look at these as well.
-
- One more valuable source for examples and explanations of Qt
- features is the archive of the \l {Qt Quarterly}.
-
- In the list below, examples marked with an asterisk (*) are fully
- documented. Eventually, all the examples will be fully documented,
- but sometimes we include an example before we have time to write
- about it, because someone might need it right now.
-
- Categories:
-
- \tableofcontents
-
- \section1 ActiveQt
-
- \list
- \o \l{activeqt/comapp}{COM App}\raisedaster
- \o \l{Dot Net Example (ActiveQt)}{Dot Net}\raisedaster
- \o \l{activeqt/hierarchy}{Hierarchy}\raisedaster
- \o \l{activeqt/menus}{Menus}\raisedaster
- \o \l{activeqt/multiple}{Multiple}\raisedaster
- \o \l{activeqt/opengl}{OpenGL}\raisedaster
- \o \l{activeqt/qutlook}{Qutlook}\raisedaster
- \o \l{activeqt/simple}{Simple}\raisedaster
- \o \l{activeqt/webbrowser}{Web Browser}\raisedaster
- \o \l{activeqt/wrapper}{Wrapper}\raisedaster
- \endlist
-
- \section1 Concurrent Programming
-
- \list
- \o \l{qtconcurrent/imagescaling}{QtConcurrent Asynchronous Image Scaling}
- \o \l{qtconcurrent/map}{QtConcurrent Map}
- \o \l{qtconcurrent/progressdialog}{QtConcurrent Progress Dialog}
- \o \l{qtconcurrent/runfunction}{QtConcurrent Run Function}
- \o \l{qtconcurrent/wordcount}{QtConcurrent Word Count}
- \endlist
-
- \section1 D-Bus
- \list
- \o \l{dbus/dbus-chat}{Chat}
- \o \l{dbus/complexpingpong}{Complex Ping Pong}
- \o \l{dbus/listnames}{List Names}
- \o \l{dbus/pingpong}{Ping Pong}
- \o \l{dbus/remotecontrolledcar}{Remote Controlled Car}
- \endlist
-
- \section1 Desktop
-
- \list
- \o \l{desktop/screenshot}{Screenshot}\raisedaster
- \o \l{desktop/systray}{System Tray}\raisedaster
- \endlist
-
- \section1 Dialogs
-
- \list
- \o \l{dialogs/classwizard}{Class Wizard}\raisedaster
- \o \l{dialogs/configdialog}{Config Dialog}
- \o \l{dialogs/extension}{Extension}\raisedaster
- \o \l{dialogs/findfiles}{Find Files}\raisedaster
- \o \l{dialogs/licensewizard}{License Wizard}\raisedaster
- \o \l{dialogs/standarddialogs}{Standard Dialogs}
- \o \l{dialogs/tabdialog}{Tab Dialog}\raisedaster
- \o \l{dialogs/trivialwizard}{Trivial Wizard}
- \endlist
-
- \section1 Drag and Drop
-
- \list
- \o \l{draganddrop/delayedencoding}{Delayed Encoding}\raisedaster
- \o \l{draganddrop/draggableicons}{Draggable Icons}
- \o \l{draganddrop/draggabletext}{Draggable Text}
- \o \l{draganddrop/dropsite}{Drop Site}
- \o \l{draganddrop/fridgemagnets}{Fridge Magnets}\raisedaster
- \o \l{draganddrop/puzzle}{Drag and Drop Puzzle}
- \endlist
-
- \section1 Graphics View
-
- \list
- \o \l{graphicsview/collidingmice}{Colliding Mice}\raisedaster
- \o \l{graphicsview/diagramscene}{Diagram Scene}\raisedaster
- \o \l{graphicsview/dragdroprobot}{Drag and Drop Robot}
- \o \l{graphicsview/elasticnodes}{Elastic Nodes}
- \o \l{graphicsview/portedasteroids}{Ported Asteroids}
- \o \l{graphicsview/portedcanvas}{Ported Canvas}
- \endlist
-
- \section1 Help System
-
- \list
- \o \l{help/simpletextviewer}{Simple Text Viewer}\raisedaster
- \endlist
-
- \section1 Item Views
-
- \list
- \o \l{itemviews/addressbook}{Address Book}\raisedaster
- \o \l{itemviews/basicsortfiltermodel}{Basic Sort/Filter Model}
- \o \l{itemviews/chart}{Chart}
- \o \l{itemviews/coloreditorfactory}{Color Editor Factory}\raisedaster
- \o \l{itemviews/combowidgetmapper}{Combo Widget Mapper}\raisedaster
- \o \l{itemviews/customsortfiltermodel}{Custom Sort/Filter Model}\raisedaster
- \o \l{itemviews/dirview}{Dir View}
- \o \l{itemviews/editabletreemodel}{Editable Tree Model}\raisedaster
- \o \l{itemviews/fetchmore}{Fetch More}\raisedaster
- \o \l{itemviews/frozencolumn}{Frozen Column}\raisedaster
- \o \l{itemviews/pixelator}{Pixelator}\raisedaster
- \o \l{itemviews/puzzle}{Puzzle}
- \o \l{itemviews/simpledommodel}{Simple DOM Model}\raisedaster
- \o \l{itemviews/simpletreemodel}{Simple Tree Model}\raisedaster
- \o \l{itemviews/simplewidgetmapper}{Simple Widget Mapper}\raisedaster
- \o \l{itemviews/spinboxdelegate}{Spin Box Delegate}\raisedaster
- \o \l{itemviews/stardelegate}{Star Delegate}\raisedaster
- \endlist
-
- \section1 Layouts
-
- \list
- \o \l{layouts/basiclayouts}{Basic Layouts}\raisedaster
- \o \l{layouts/borderlayout}{Border Layout}
- \o \l{layouts/dynamiclayouts}{Dynamic Layouts}
- \o \l{layouts/flowlayout}{Flow Layout}
- \endlist
-
- \section1 Main Windows
-
- \list
- \o \l{mainwindows/application}{Application}\raisedaster
- \o \l{mainwindows/dockwidgets}{Dock Widgets}\raisedaster
- \o \l{mainwindows/mdi}{MDI}
- \o \l{mainwindows/menus}{Menus}\raisedaster
- \o \l{mainwindows/recentfiles}{Recent Files}
- \o \l{mainwindows/sdi}{SDI}
- \endlist
-
- \section1 Network
-
- \list
- \o \l{network/blockingfortuneclient}{Blocking Fortune Client}\raisedaster
- \o \l{network/broadcastreceiver}{Broadcast Receiver}
- \o \l{network/broadcastsender}{Broadcast Sender}
- \o \l{network/network-chat}{Network Chat}
- \o \l{network/fortuneclient}{Fortune Client}\raisedaster
- \o \l{network/fortuneserver}{Fortune Server}\raisedaster
- \o \l{network/ftp}{FTP}\raisedaster
- \o \l{network/http}{HTTP}
- \o \l{network/loopback}{Loopback}
- \o \l{network/threadedfortuneserver}{Threaded Fortune Server}\raisedaster
- \o \l{network/torrent}{Torrent}
- \o \l{network/googlesuggest}{Google Suggest}
- \endlist
-
- \section1 OpenGL
-
- \list
- \o \l{opengl/2dpainting}{2D Painting}\raisedaster
- \o \l{opengl/framebufferobject}{Framebuffer Object}
- \o \l{opengl/framebufferobject2}{Framebuffer Object 2}
- \o \l{opengl/grabber}{Grabber}
- \o \l{opengl/hellogl}{Hello GL}\raisedaster
- \o \l{opengl/overpainting}{Overpainting}\raisedaster
- \o \l{opengl/pbuffers}{Pixel Buffers}
- \o \l{opengl/pbuffers2}{Pixel Buffers 2}
- \o \l{opengl/samplebuffers}{Sample Buffers}
- \o \l{opengl/textures}{Textures}
- \endlist
-
- \section1 Painting
-
- \list
- \o \l{painting/basicdrawing}{Basic Drawing}\raisedaster
- \o \l{painting/concentriccircles}{Concentric Circles}\raisedaster
- \o \l{painting/fontsampler}{Font Sampler}
- \o \l{painting/imagecomposition}{Image Composition}\raisedaster
- \o \l{painting/painterpaths}{Painter Paths}\raisedaster
- \o \l{painting/svggenerator}{SVG Generator}\raisedaster
- \o \l{painting/svgviewer}{SVG Viewer}
- \o \l{painting/transformations}{Transformations}\raisedaster
- \endlist
-
- \section1 Phonon Multimedia Framework
-
- \list
- \o \l{phonon/capabilities}{Capabilities}\raisedaster
- \o \l{phonon/musicplayer}{Music Player}\raisedaster
- \endlist
-
- \section1 Qt Designer
-
- \list
- \o \l{designer/calculatorbuilder}{Calculator Builder}\raisedaster
- \o \l{designer/calculatorform}{Calculator Form}\raisedaster
- \o \l{designer/customwidgetplugin}{Custom Widget Plugin}\raisedaster
- \o \l{designer/taskmenuextension}{Task Menu Extension}\raisedaster
- \o \l{designer/containerextension}{Container Extension}\raisedaster
- \o \l{designer/worldtimeclockbuilder}{World Time Clock Builder}\raisedaster
- \o \l{designer/worldtimeclockplugin}{World Time Clock Plugin}\raisedaster
- \endlist
-
- \section1 Qt Linguist
-
- \list
- \o \l{linguist/hellotr}{Hello tr()}\raisedaster
- \o \l{linguist/arrowpad}{Arrow Pad}\raisedaster
- \o \l{linguist/trollprint}{Troll Print}\raisedaster
- \endlist
-
- \section1 Qt for Embedded Linux
-
- \list
- \o \l{qws/svgalib}{Accelerated Graphics Driver}\raisedaster
- \o \l{qws/dbscreen}{Double Buffered Graphics Driver}\raisedaster
- \o \l{qws/mousecalibration}{Mouse Calibration}\raisedaster
- \o \l{qws/ahigl}{OpenGL for Embedded Systems}\raisedaster
- \o \l{qws/simpledecoration}{Simple Decoration}\raisedaster
- \endlist
-
- \section1 Qt Script
-
- \list
- \o \l{script/calculator}{Calculator}\raisedaster
- \o \l{script/context2d}{Context2D}\raisedaster
- \o \l{script/defaultprototypes}{Default Prototypes}\raisedaster
- \o \l{script/helloscript}{Hello Script}\raisedaster
- \o \l{script/qstetrix}{Qt Script Tetrix}\raisedaster
- \o \l{script/customclass}{Custom Script Class}\raisedaster
- \endlist
-
- \section1 Rich Text
-
- \list
- \o \l{richtext/calendar}{Calendar}\raisedaster
- \o \l{richtext/orderform}{Order Form}\raisedaster
- \o \l{richtext/syntaxhighlighter}{Syntax Highlighter}\raisedaster
- \o \l{richtext/textobject}{Text Object}\raisedaster
- \endlist
-
- \section1 SQL
-
- \list
- \o \l{sql/cachedtable}{Cached Table}\raisedaster
- \o \l{sql/drilldown}{Drill Down}\raisedaster
- \o \l{sql/querymodel}{Query Model}
- \o \l{sql/relationaltablemodel}{Relational Table Model}
- \o \l{sql/tablemodel}{Table Model}
- \o \l{sql/sqlwidgetmapper}{SQL Widget Mapper}\raisedaster
- \endlist
-
- \section1 Threads
-
- \list
- \o \l{threads/queuedcustomtype}{Queued Custom Type}\raisedaster
- \o \l{threads/mandelbrot}{Mandelbrot}\raisedaster
- \o \l{threads/semaphores}{Semaphores}\raisedaster
- \o \l{threads/waitconditions}{Wait Conditions}\raisedaster
- \endlist
-
- \section1 Tools
-
- \list
- \o \l{tools/codecs}{Codecs}
- \o \l{tools/completer}{Completer}\raisedaster
- \o \l{tools/customcompleter}{Custom Completer}\raisedaster
- \o \l{tools/customtype}{Custom Type}\raisedaster
- \o \l{tools/customtypesending}{Custom Type Sending}\raisedaster
- \o \l{tools/echoplugin}{Echo Plugin}\raisedaster
- \o \l{tools/i18n}{I18N}
- \o \l{tools/plugandpaint}{Plug & Paint}\raisedaster
- \o Plug & Paint Plugins: \l{tools/plugandpaintplugins/basictools}{Basic Tools}\raisedaster
- and \l{tools/plugandpaintplugins/extrafilters}{Extra Filters}\raisedaster
- \o \l{tools/regexp}{RegExp}
- \o \l{tools/settingseditor}{Settings Editor}
- \o \l{tools/styleplugin}{Style Plugin}\raisedaster
- \o \l{tools/treemodelcompleter}{Tree Model Completer}\raisedaster
- \o \l{tools/undoframework}{Undo Framework}\raisedaster
- \endlist
-
- \section1 UiTools
-
- \list
- \o \l{uitools/multipleinheritance}{Multiple Inheritance}\raisedaster
- \o \l{uitools/textfinder}{Text Finder}\raisedaster
- \endlist
-
- \section1 WebKit
-
- \list
- \o \l{webkit/previewer}{Previewer}\raisedaster
- \o \l{webkit/formextractor}{Form Extractor}
- \o \l{webkit/googlechat}{Google Chat}
- \o \l{webkit/fancybrowser}{Fancy Browser}
- \endlist
-
- \section1 Widgets
-
- \list
- \o \l{widgets/analogclock}{Analog Clock}\raisedaster
- \o \l{widgets/calculator}{Calculator}\raisedaster
- \o \l{widgets/calendarwidget}{Calendar Widget}\raisedaster
- \o \l{widgets/charactermap}{Character Map}\raisedaster
- \o \l{widgets/codeeditor}{Code Editor}\raisedaster
- \o \l{widgets/digitalclock}{Digital Clock}\raisedaster
- \o \l{widgets/groupbox}{Group Box}\raisedaster
- \o \l{widgets/icons}{Icons}\raisedaster
- \o \l{widgets/imageviewer}{Image Viewer}\raisedaster
- \o \l{widgets/lineedits}{Line Edits}\raisedaster
- \o \l{widgets/movie}{Movie}
- \o \l{widgets/scribble}{Scribble}\raisedaster
- \o \l{widgets/shapedclock}{Shaped Clock}\raisedaster
- \o \l{widgets/sliders}{Sliders}\raisedaster
- \o \l{widgets/spinboxes}{Spin Boxes}\raisedaster
- \o \l{widgets/styles}{Styles}\raisedaster
- \o \l{widgets/stylesheet}{Style Sheet}\raisedaster
- \o \l{widgets/tablet}{Tablet}\raisedaster
- \o \l{widgets/tetrix}{Tetrix}\raisedaster
- \o \l{widgets/tooltips}{Tooltips}\raisedaster
- \o \l{widgets/wiggly}{Wiggly}\raisedaster
- \o \l{widgets/windowflags}{Window Flags}\raisedaster
- \endlist
-
- \section1 XML
-
- \list
- \o \l{xml/dombookmarks}{DOM Bookmarks}
- \o \l{xml/saxbookmarks}{SAX Bookmarks}
- \o \l{xml/streambookmarks}{QXmlStream Bookmarks}\raisedaster
- \o \l{xml/rsslisting}{RSS-Listing}
- \o \l{xml/xmlstreamlint}{XML Stream Lint Example}\raisedaster
- \endlist
-
- \section1 XQuery, XPath
-
- \list
- \o \l{xmlpatterns/recipes}{Recipes}
- \o \l{xmlpatterns/filetree}{File System Example}
- \o \l{xmlpatterns/qobjectxmlmodel}{QObject XML Model Example}
- \o \l{xmlpatterns/xquery/globalVariables}{C++ Source Code Analyzer Example}
- \o \l{xmlpatterns/trafficinfo}{Traffic Info}\raisedaster
- \endlist
-
- \section1 Inter-Process Communication
- \list
- \o \l{ipc/localfortuneclient}{Local Fortune Client}\raisedaster
- \o \l{ipc/localfortuneserver}{Local Fortune Server}\raisedaster
- \o \l{ipc/sharedmemory}{Shared Memory}\raisedaster
- \endlist
-*/
diff --git a/doc/src/examples/application.qdoc b/doc/src/examples/application.qdoc
index 0dad46b..96e81b3 100644
--- a/doc/src/examples/application.qdoc
+++ b/doc/src/examples/application.qdoc
@@ -45,7 +45,7 @@
The Application example shows how to implement a standard GUI
application with menus, toolbars, and a status bar. The example
- itself is a simple text editor program built around QTextEdit.
+ itself is a simple text editor program built around QPlainTextEdit.
\image application.png Screenshot of the Application example
@@ -103,7 +103,7 @@
\snippet examples/mainwindows/application/mainwindow.cpp 1
\snippet examples/mainwindows/application/mainwindow.cpp 2
- In the constructor, we start by creating a QTextEdit widget as a
+ In the constructor, we start by creating a QPlainTextEdit widget as a
child of the main window (the \c this object). Then we call
QMainWindow::setCentralWidget() to tell that this is going to be
the widget that occupies the central area of the main window,
@@ -114,9 +114,9 @@
functions that set up the user interface. After that, we call \c
readSettings() to restore the user's preferences.
- We establish a signal-slot connection between the QTextEdit's
+ We establish a signal-slot connection between the QPlainTextEdit's
document object and our \c documentWasModified() slot. Whenever
- the user modifies the text in the QTextEdit, we want to update
+ the user modifies the text in the QPlainTextEdit, we want to update
the title bar to show that the file was modified.
At the end, we set the window title using the private
@@ -141,7 +141,7 @@
The \c newFile() slot is invoked when the user selects
\menu{File|New} from the menu. We call \c maybeSave() to save any
pending changes and if the user accepts to go on, we clear the
- QTextEdit and call the private function \c setCurrentFile() to
+ QPlainTextEdit and call the private function \c setCurrentFile() to
update the window title and clear the
\l{QWidget::windowModified}{windowModified} flag.
@@ -187,7 +187,7 @@
\snippet examples/mainwindows/application/mainwindow.cpp 16
The \c documentWasModified() slot is invoked each time the text
- in the QTextEdit changes because of user edits. We call
+ in the QPlainTextEdit changes because of user edits. We call
QWidget::setWindowModified() to make the title bar show that the
file was modified. How this is done varies on each platform.
@@ -227,8 +227,8 @@
\snippet examples/mainwindows/application/mainwindow.cpp 24
The \gui{Edit|Cut} and \gui{Edit|Copy} actions must be available
- only when the QTextEdit contains selected text. We disable them
- by default and connect the QTextEdit::copyAvailable() signal to
+ only when the QPlainTextEdit contains selected text. We disable them
+ by default and connect the QPlainTextEdit::copyAvailable() signal to
the QAction::setEnabled() slot, ensuring that the actions are
disabled when the text editor has no selection.
@@ -289,7 +289,7 @@
When restoring the position and size of a window, it's important
to call QWidget::resize() before QWidget::move(). The reason why
- is given in the \l{geometry.html}{Window Geometry} overview.
+ is given in the \l{Window Geometry} overview.
\snippet examples/mainwindows/application/mainwindow.cpp 37
\snippet examples/mainwindows/application/mainwindow.cpp 39
diff --git a/doc/src/examples/arrowpad.qdoc b/doc/src/examples/arrowpad.qdoc
index c1cde5b..95d6893 100644
--- a/doc/src/examples/arrowpad.qdoc
+++ b/doc/src/examples/arrowpad.qdoc
@@ -140,10 +140,10 @@
QLocale::system() can be influenced by setting the \c LANG
environment variable, for example. Notice that the use of a naming
convention that incorporates the locale for \c .qm message files,
- (and \c .ts files), makes it easy to implement choosing the
+ (and TS files), makes it easy to implement choosing the
translation file according to locale.
- If there is no \c .qm message file for the locale chosen the original
+ If there is no QM message file for the locale chosen the original
source text will be used and no error raised.
\section1 Translating to French and Dutch
@@ -194,9 +194,9 @@
\endlist
We have to convert the \c tt1_fr.ts and \c tt1_nl.ts translation source
- files into \c .qm files. We could use \e {Qt Linguist} as we've done
+ files into QM files. We could use \e {Qt Linguist} as we've done
before; however using the command line tool \c lrelease ensures that
- \e all the \c .qm files for the application are created without us
+ \e all the QM files for the application are created without us
having to remember to load and \gui File|Release each one
individually from \e {Qt Linguist}.
diff --git a/doc/src/examples/audiodevices.qdoc b/doc/src/examples/audiodevices.qdoc
new file mode 100644
index 0000000..7a2afcb
--- /dev/null
+++ b/doc/src/examples/audiodevices.qdoc
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example multimedia/audio/audiodevices
+ \title Audio Devices Example
+
+ The Audio Devices example demonstrates the basic use of QAudioDeviceInfo class
+ provided with Qt.
+
+ Qt provides the QAudioDeviceInfo class to enable audio querying within
+ a standard application user interface.
+
+ This example allows you to browse audio devices available and try out different
+ configurations to see if they are supported.
+*/
diff --git a/doc/src/examples/audioinput.qdoc b/doc/src/examples/audioinput.qdoc
new file mode 100644
index 0000000..d8bfb73
--- /dev/null
+++ b/doc/src/examples/audioinput.qdoc
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example multimedia/audio/audioinput
+ \title AudioInput Example
+
+ The Audio Input example demonstrates the basic use of QAudioInput class
+ provided with Qt.
+
+ Qt provides the QAudioInput class to enable audio functionality within
+ a standard application user interface.
+
+ This example uses a fast-fourier transform on the input audio from the microphone
+ and displays the output.
+*/
diff --git a/doc/src/examples/audiooutput.qdoc b/doc/src/examples/audiooutput.qdoc
new file mode 100644
index 0000000..4c420a9
--- /dev/null
+++ b/doc/src/examples/audiooutput.qdoc
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example multimedia/audio/audiooutput
+ \title Audio Output Example
+
+ The Audio Output example demonstrates the basic use of the QAudioOutput class
+ provided with Qt.
+
+ This example provides a tone generator to supply continuous audio playback.
+ The first button allows pause and resume of the playback.
+ The second button allows toggling between push and pull modes of operation.
+*/
diff --git a/doc/src/examples/basicgraphicslayouts.qdoc b/doc/src/examples/basicgraphicslayouts.qdoc
index 3b6df09..e6ca461 100644
--- a/doc/src/examples/basicgraphicslayouts.qdoc
+++ b/doc/src/examples/basicgraphicslayouts.qdoc
@@ -45,6 +45,7 @@
The Basic Graphics Layouts example shows how to use the layout classes
in QGraphicsView: QGraphicsLinearLayout and QGraphicsGridLayout.
+ In addition to that it shows how to write your own custom layout item.
\image basicgraphicslayouts-example.png Screenshot of the Basic Layouts Example
@@ -115,26 +116,24 @@
\section1 LayoutItem Class Definition
- The \c LayoutItem class is a subclass of QGraphicsWidget. It has a
- constructor, a destructor, and a reimplementation of the
- {QGraphicsItem::paint()}{paint()} function.
+ The \c LayoutItem class is a subclass of QGraphicsLayoutItem and
+ QGraphicsItem. It has a constructor, a destructor, and some required
+ reimplementations.
+ Since it inherits QGraphicsLayoutItem it must reimplement
+ {QGraphicsLayoutItem::setGeometry()}{setGeometry()} and
+ {QGraphicsLayoutItem::sizeHint()}{sizeHint()}.
+ In addition to that it inherits QGraphicsItem, so it must reimplement
+ {QGraphicsItem::boundingRect()}{boundingRect()} and
+ {QGraphicsItem::paint()}{paint()}.
\snippet examples/graphicsview/basicgraphicslayouts/layoutitem.h 0
- The \c LayoutItem class also has a private instance of QPixmap, \c pix.
-
- \note We subclass QGraphicsWidget so that \c LayoutItem objects can
- be automatically plugged into a layout, as QGraphicsWidget is a
- specialization of QGraphicsLayoutItem.
+ The \c LayoutItem class also has a private instance of QPixmap, \c m_pix.
\section1 LayoutItem Class Implementation
- In \c{LayoutItem}'s constructor, \c pix is instantiated and the
- \c{QT_original_R.png} image is loaded into it. We set the size of
- \c LayoutItem to be slightly larger than the size of the pixmap as we
- require some space around it for borders that we will paint later.
- Alternatively, you could scale the pixmap to prevent the item from
- becoming smaller than the pixmap.
+ In \c{LayoutItem}'s constructor, \c m_pix is instantiated and the
+ \c{block.png} image is loaded into it.
\snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 0
@@ -148,4 +147,32 @@
\snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 2
+ The reimplementation of {QGraphicsItem::boundingRect()}{boundingRect()}
+ will set the top left corner at (0,0), and the size of it will be
+ the size of the layout items
+ {QGraphicsLayoutItem::geometry()}{geometry()}. This is the area that
+ we paint within.
+
+ \snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 3
+
+
+ The reimplementation of {QGraphicsLayoutItem::setGeometry()}{setGeometry()}
+ simply calls its baseclass implementation. However, since this will change
+ the boundingRect we must also call
+ {QGraphicsItem::prepareGeometryChange()}{prepareGeometryChange()}.
+ Finally, we move the item according to \c geom.topLeft().
+
+ \snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 4
+
+
+ Since we don't want the size of the item to be smaller than the pixmap, we
+ must make sure that we return a size hint that is larger than \c m_pix.
+ We also add some extra space around for borders that we will paint later.
+ Alternatively, you could scale the pixmap to prevent the item from
+ becoming smaller than the pixmap.
+ The preferred size is the same as the minimum size hint, while we set
+ maximum to be a large value
+
+ \snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 5
+
*/ \ No newline at end of file
diff --git a/doc/src/examples/calculatorform.qdoc b/doc/src/examples/calculatorform.qdoc
index 50b7a3e..76bbcc1 100644
--- a/doc/src/examples/calculatorform.qdoc
+++ b/doc/src/examples/calculatorform.qdoc
@@ -45,8 +45,8 @@
The Calculator Form Example shows how to use a form created with
\QD in an application by using the user interface information from
- a QWidget subclass. We use \l{Using a Designer .ui File in Your Application}
- {uic's auto-connection} feature to automatically connect signals
+ a QWidget subclass. We use \l{Using a Designer UI File in Your Application}
+ {uic's auto-connection} feature to automatically connect signals
from widgets on the form to slots in our code.
\image calculatorform-example.png Screenshot of the Calculator Form example
@@ -59,7 +59,7 @@
\section1 Preparation
The user interface for this example is designed completely using \QD. The
- result is a .ui file describing the form, the widgets used, any signal-slot
+ result is a UI file describing the form, the widgets used, any signal-slot
connections between them, and other standard user interface properties.
To ensure that the example can use this file, we need to include a \c FORMS
diff --git a/doc/src/examples/collidingmice-example.qdoc b/doc/src/examples/collidingmice-example.qdoc
index f51fc38..65db544 100644
--- a/doc/src/examples/collidingmice-example.qdoc
+++ b/doc/src/examples/collidingmice-example.qdoc
@@ -95,11 +95,11 @@
the global qrand() function which is a thread-safe version of the
standard C++ rand() function.
- Then we call the \l {QGraphicsItem::rotate()}{rotate()} function
+ Then we call the \l {QGraphicsItem::setRotation()}{setRotation()} function
inherited from QGraphicsItem. Items live in their own local
coordinate system. Their coordinates are usually centered around
(0, 0), and this is also the center for all transformations. By
- calling the item's \l {QGraphicsItem::rotate()}{rotate()} function
+ calling the item's \l {QGraphicsItem::setRotation()}{setRotation()} function
we alter the direction in which the mouse will start moving.
When the QGraphicsScene decides to advance the scene a frame it will call
diff --git a/doc/src/examples/completer.qdoc b/doc/src/examples/completer.qdoc
index f4c381e..7b4b4f9 100644
--- a/doc/src/examples/completer.qdoc
+++ b/doc/src/examples/completer.qdoc
@@ -100,9 +100,9 @@
\section1 MainWindow Class Definition
- The \c MainWindow class is a subclass of QMainWindow and implements four
- private slots - \c about(), \c changeCase(), \c changeMode(), and
- \c changeModel().
+ The \c MainWindow class is a subclass of QMainWindow and implements five
+ private slots - \c about(), \c changeCase(), \c changeMode(), \c changeModel(),
+ and \c changeMaxVisible().
\snippet examples/tools/completer/mainwindow.h 0
@@ -126,6 +126,9 @@
\snippet examples/tools/completer/mainwindow.cpp 0
+ The \c maxVisibleSpinBox is created and determines the number of visible
+ item in the completer
+
The \c wrapCheckBox is then set up. This \c checkBox determines if the
\c{completer}'s \l{QCompleter::setWrapAround()}{setWrapAround()} property
is enabled or disabled.
@@ -242,10 +245,15 @@
\snippet examples/tools/completer/mainwindow.cpp 14
- The \c about() function provides a brief description about the example.
+ The \c changeMaxVisible() update the maximum number of visible items in
+ the completer.
\snippet examples/tools/completer/mainwindow.cpp 15
+ The \c about() function provides a brief description about the example.
+
+ \snippet examples/tools/completer/mainwindow.cpp 16
+
\section1 \c main() Function
The \c main() function instantiates QApplication and \c MainWindow and
diff --git a/doc/src/examples/contiguouscache.qdoc b/doc/src/examples/contiguouscache.qdoc
new file mode 100644
index 0000000..11b326f
--- /dev/null
+++ b/doc/src/examples/contiguouscache.qdoc
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/contiguouscache
+ \title Contiguous Cache Example
+
+ The Contiguous Cache example shows how to use QContiguousCache to manage memory usage for
+ very large models. In some environments memory is limited and, even when it
+ isn't, users still dislike an application using excessive memory.
+ Using QContiguousCache to manage a list, rather than loading
+ the entire list into memory, allows the application to limit the amount
+ of memory it uses, regardless of the size of the data set it accesses
+
+ The simplest way to use QContiguousCache is to cache as items are requested. When
+ a view requests an item at row N it is also likely to ask for items at rows near
+ to N.
+
+ \snippet examples/tools/contiguouscache/randomlistmodel.cpp 0
+
+ After getting the row, the class determines if the row is in the bounds
+ of the contiguous cache's current range. It would have been equally valid to
+ simply have the following code instead.
+
+ \code
+ while (row > m_rows.lastIndex())
+ m_rows.append(fetchWord(m_rows.lastIndex()+1);
+ while (row < m_rows.firstIndex())
+ m_rows.prepend(fetchWord(m_rows.firstIndex()-1);
+ \endcode
+
+ However a list will often jump rows if the scroll bar is used directly, resulting in
+ the code above causing every row between the old and new rows to be fetched.
+
+ Using QContiguousCache::lastIndex() and QContiguousCache::firstIndex() allows
+ the example to determine what part of the list the cache is currently caching.
+ These values don't represent the indexes into the cache's own memory, but rather
+ a virtual infinite array that the cache represents.
+
+ By using QContiguousCache::append() and QContiguousCache::prepend() the code ensures
+ that items that may be still on the screen are not lost when the requested row
+ has not moved far from the current cache range. QContiguousCache::insert() can
+ potentially remove more than one item from the cache as QContiguousCache does not
+ allow for gaps. If your cache needs to quickly jump back and forth between
+ rows with significant gaps between them consider using QCache instead.
+
+ And thats it. A perfectly reasonable cache, using minimal memory for a very large
+ list. In this case the accessor for getting the words into the cache
+ generates random information rather than fixed information. This allows you
+ to see how the cache range is kept for a local number of rows when running the
+ example.
+
+ \snippet examples/tools/contiguouscache/randomlistmodel.cpp 1
+
+ It is also worth considering pre-fetching items into the cache outside of the
+ application's paint routine. This can be done either with a separate thread
+ or using a QTimer to incrementally expand the range of the cache prior to
+ rows being requested out of the current cache range.
+*/
diff --git a/doc/src/examples/diagramscene.qdoc b/doc/src/examples/diagramscene.qdoc
index 9f5d785..2011aa9 100644
--- a/doc/src/examples/diagramscene.qdoc
+++ b/doc/src/examples/diagramscene.qdoc
@@ -704,7 +704,7 @@
We use \c itemChange() and \c focusOutEvent() to notify the
\c DiagramScene when the text item loses focus and gets selected.
- Vi reimplement the functions that handle mouse events to make it
+ We reimplement the functions that handle mouse events to make it
possible to alter the mouse behavior of QGraphicsTextItem.
\section1 DiagramTextItem Implementation
@@ -729,7 +729,8 @@
\snippet examples/graphicsview/diagramscene/diagramtextitem.cpp 2
\c DiagramScene uses the signal emitted when the text item looses
- remove the item if it is empty, i.e., it contains no text.
+ focus to remove the item if it is empty, i.e., it contains no
+ text.
This is the implementation of \c mouseDoubleClickEvent():
@@ -838,7 +839,7 @@
\snippet examples/graphicsview/diagramscene/arrow.cpp 7
- If the line is selected we draw to dotted lines that are
+ If the line is selected, we draw two dotted lines that are
parallel with the line of the arrow. We do not use the default
implementation, which uses \l{QGraphicsItem::}{boundingRect()}
because the QRect bounding rectangle is considerably larger than
diff --git a/doc/src/examples/drilldown.qdoc b/doc/src/examples/drilldown.qdoc
index 18436c0..96bf512 100644
--- a/doc/src/examples/drilldown.qdoc
+++ b/doc/src/examples/drilldown.qdoc
@@ -389,9 +389,7 @@
the item's hover events, animating the item when the mouse cursor
is hovering over the image (by default, no items accept hover
events). Please see the \l{The Graphics View Framework}
- documentation and the
- \l{Qt Examples#Graphics View}{Graphics View examples} for more
- details.
+ documentation and the \l{Graphics View Examples} for more details.
\snippet examples/sql/drilldown/view.cpp 5
diff --git a/doc/src/examples/eventtransitions.qdoc b/doc/src/examples/eventtransitions.qdoc
new file mode 100644
index 0000000..ace25a9
--- /dev/null
+++ b/doc/src/examples/eventtransitions.qdoc
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example statemachine/eventtransitions
+ \title Event Transitions Example
+
+ The Event Transitions example shows how to use event transitions, a
+ feature of \l{The State Machine Framework}.
+
+ \snippet examples/statemachine/eventtransitions/main.cpp 0
+
+ The \c Window class's constructors begins by creating a button.
+
+ \snippet examples/statemachine/eventtransitions/main.cpp 1
+
+ Two states, \c s1 and \c s2, are created; upon entry they will assign
+ "Outside" and "Inside" to the button's text, respectively.
+
+ \snippet examples/statemachine/eventtransitions/main.cpp 2
+
+ When the button receives an event of type QEvent::Enter and the state
+ machine is in state \c s1, the machine will transition to state \c s2.
+
+ \snippet examples/statemachine/eventtransitions/main.cpp 3
+
+ When the button receives an event of type QEvent::Leave and the state
+ machine is in state \c s2, the machine will transition back to state \c
+ s1.
+
+ \snippet examples/statemachine/eventtransitions/main.cpp 4
+
+ Next, the state \c s3 is created. \c s3 will be entered when the button
+ receives an event of type QEvent::MouseButtonPress and the state machine
+ is in state \c s2. When the button receives an event of type
+ QEvent::MouseButtonRelease and the state machine is in state \c s3, the
+ machine will transition back to state \c s2.
+
+ \snippet examples/statemachine/eventtransitions/main.cpp 5
+
+ Finally, the states are added to the machine as top-level states, the
+ initial state is set to be \c s1 ("Outside"), and the machine is started.
+
+ \snippet examples/statemachine/eventtransitions/main.cpp 6
+
+ The main() function constructs a Window object and shows it.
+
+*/
diff --git a/doc/src/examples/factorial.qdoc b/doc/src/examples/factorial.qdoc
new file mode 100644
index 0000000..164b9e0
--- /dev/null
+++ b/doc/src/examples/factorial.qdoc
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example statemachine/factorial
+ \title Factorial States Example
+
+ The Factorial States example shows how to use \l{The State Machine
+ Framework} to calculate the factorial of an integer.
+
+ The statechart for calculating the factorial looks as follows:
+
+ \img factorial-example.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ In other words, the state machine calculates the factorial of 6 and prints
+ the result.
+
+ \snippet examples/statemachine/factorial/main.cpp 0
+
+ The Factorial class is used to hold the data of the computation, \c x and
+ \c fac. It also provides a signal that's emitted whenever the value of \c
+ x changes.
+
+ \snippet examples/statemachine/factorial/main.cpp 1
+
+ The FactorialLoopTransition class implements the guard (\c x > 1) and
+ calculations (\c fac = \c x * \c fac; \c x = \c x - 1) of the factorial
+ loop.
+
+ \snippet examples/statemachine/factorial/main.cpp 2
+
+ The FactorialDoneTransition class implements the guard (\c x <= 1) that
+ terminates the factorial computation. It also prints the final result to
+ standard output.
+
+ \snippet examples/statemachine/factorial/main.cpp 3
+
+ The application's main() function first creates the application object, a
+ Factorial object and a state machine.
+
+ \snippet examples/statemachine/factorial/main.cpp 4
+
+ The \c compute state is created, and the initial values of \c x and \c fac
+ are defined. A FactorialLoopTransition object is created and added to the
+ state.
+
+ \snippet examples/statemachine/factorial/main.cpp 5
+
+ A final state, \c done, is created, and a FactorialDoneTransition object
+ is created with \c done as its target state. The transition is then added
+ to the \c compute state.
+
+ \snippet examples/statemachine/factorial/main.cpp 6
+
+ The machine's initial state is set to be the \c compute state. We connect
+ the QStateMachine::finished() signal to the QCoreApplication::quit() slot,
+ so the application will quit when the state machine's work is
+ done. Finally, the state machine is started, and the application's event
+ loop is entered.
+
+ */
diff --git a/doc/src/examples/helloscript.qdoc b/doc/src/examples/helloscript.qdoc
index 236464c..3d02d99 100644
--- a/doc/src/examples/helloscript.qdoc
+++ b/doc/src/examples/helloscript.qdoc
@@ -121,7 +121,7 @@
window). Don't forget the exclamation mark!
Click the \gui Done checkbox and choose \gui File|Save from the
- menu bar. The \c .ts file will no longer contain
+ menu bar. The TS file will no longer contain
\snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 3
@@ -129,11 +129,11 @@
\snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 4
- To see the application running in Latin, we have to generate a \c .qm
- file from the \c .ts file. Generating a \c .qm file can be achieved
- either from within \e {Qt Linguist} (for a single \c .ts file), or
- by using the command line program \c lrelease which will produce one \c
- .qm file for each of the \c .ts files listed in the project file.
+ To see the application running in Latin, we have to generate a QM
+ file from the TS file. Generating a QM file can be achieved
+ either from within \e {Qt Linguist} (for a single TS file), or
+ by using the command line program \c lrelease which will produce one
+ QM file for each of the TS files listed in the project file.
Generate \c hellotr_la.qm from \c hellotr_la.ts by choosing
\gui File|Release from \e {Qt Linguist}'s menu bar and pressing
\gui Save in the file save dialog that pops up. Now run the \c helloscript
diff --git a/doc/src/examples/hellotr.qdoc b/doc/src/examples/hellotr.qdoc
index c5fee8c..978f61f 100644
--- a/doc/src/examples/hellotr.qdoc
+++ b/doc/src/examples/hellotr.qdoc
@@ -108,12 +108,12 @@
Note that the file extension is \c .ts, not \c .qm. The \c .ts
translation source format is designed for use during the
application's development. Programmers or release managers run
- the \c lupdate program to generate and update \c .ts files with
+ the \c lupdate program to generate and update TS files with
the source text that is extracted from the source code.
- Translators read and update the \c .ts files using \e {Qt
+ Translators read and update the TS files using \e {Qt
Linguist} adding and editing their translations.
- The \c .ts format is human-readable XML that can be emailed directly
+ The TS format is human-readable XML that can be emailed directly
and is easy to put under version control. If you edit this file
manually, be aware that the default encoding for XML is UTF-8, not
Latin1 (ISO 8859-1). One way to type in a Latin1 character such as
@@ -121,8 +121,8 @@
"\&#xf8;". This will work for any Unicode 4.0 character.
Once the translations are complete the \c lrelease program is used to
- convert the \c .ts files into the \c .qm Qt message file format. The
- \c .qm format is a compact binary format designed to deliver very
+ convert the TS files into the QM Qt message file format. The
+ QM format is a compact binary format designed to deliver very
fast lookup performance. Both \c lupdate and \c lrelease read all the
project's source and header files (as specified in the HEADERS and
SOURCES lines of the project file) and extract the strings that
@@ -131,7 +131,7 @@
\c lupdate is used to create and update the message files (\c hellotr_la.ts
in this case) to keep them in sync with the source code. It is safe to
run \c lupdate at any time, as \c lupdate does not remove any
- information. For example, you can put it in the makefile, so the \c .ts
+ information. For example, you can put it in the makefile, so the TS
files are updated whenever the source changes.
Try running \c lupdate right now, like this:
@@ -151,7 +151,7 @@
We will use \e {Qt Linguist} to provide the translation, although
you can use any XML or plain text editor to enter a translation into a
- \c .ts file.
+ TS file.
To start \e {Qt Linguist}, type
@@ -163,7 +163,7 @@
window). Don't forget the exclamation mark!
Click the \gui Done checkbox and choose \gui File|Save from the
- menu bar. The \c .ts file will no longer contain
+ menu bar. The TS file will no longer contain
\snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 3
@@ -173,11 +173,11 @@
\section1 Running the Application in Latin
- To see the application running in Latin, we have to generate a \c .qm
- file from the \c .ts file. Generating a \c .qm file can be achieved
- either from within \e {Qt Linguist} (for a single \c .ts file), or
- by using the command line program \c lrelease which will produce one \c
- .qm file for each of the \c .ts files listed in the project file.
+ To see the application running in Latin, we have to generate a QM
+ file from the TS file. Generating a QM file can be achieved
+ either from within \e {Qt Linguist} (for a single TS file), or
+ by using the command line program \c lrelease which will produce one
+ QM file for each of the TS files listed in the project file.
Generate \c hellotr_la.qm from \c hellotr_la.ts by choosing
\gui File|Release from \e {Qt Linguist}'s menu bar and pressing
\gui Save in the file save dialog that pops up. Now run the \c hellotr
diff --git a/doc/src/examples/htmlinfo.qdoc b/doc/src/examples/htmlinfo.qdoc
new file mode 100644
index 0000000..c09d761
--- /dev/null
+++ b/doc/src/examples/htmlinfo.qdoc
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xml/htmlinfo
+ \title XML HTML Info Example
+
+ The XML HTML Info example provides a simple command line utility that
+ scans the current directory for HTML files and prints statistics about
+ them to standard out.
+
+ \note Standard out is redirected on some platforms. On Symbian using Open
+ C \c stdout is by default directed to the console window, but this window
+ may not always be visible. To redirect to a file instead, locate the \c
+ c:\\system\\data\\config.ini file (on either the emulator or the device)
+ and change \c STDOUT to point to \c MEDIA4. This will redirect the console
+ to \c c:\\system\\data\\out.txt.
+
+ The files are parsed using a QXmlStreamReader object. If the file does
+ not contain a well-formed XML document, a description of the error is
+ printed to the standard error console.
+
+ \section1 Basic Operation
+
+ The main function of the example uses QDir to access files in the current
+ directory that match either "*.htm" or "*.html". For each file found,
+ the \c parseHtmlFile() function is called.
+
+ Reading XML is handled by an instance of the QXmlStreamReader class, which
+ operates on the input file object:
+
+ \snippet examples/xml/htmlinfo/main.cpp 0
+
+ The work of parsing and the XML and extracting statistics is done in a
+ while loop, and is driven by input from the reader:
+
+ \snippet examples/xml/htmlinfo/main.cpp 1
+
+ If more input is available, the next token from the input file is read
+ and parsed. The program then looks for the specific element types,
+ "title", "a", and "p", and stores information about them.
+
+ When there is no more input, the loop terminates. If an error occurred,
+ information is written to the standard out file via a stream, and the
+ example exits:
+
+ \snippet examples/xml/htmlinfo/main.cpp 2
+
+ If no error occurred, the example prints some statistics from the data
+ gathered in the loop, and then exits.
+*/
diff --git a/doc/src/examples/inputpanel.qdoc b/doc/src/examples/inputpanel.qdoc
new file mode 100644
index 0000000..bf03639
--- /dev/null
+++ b/doc/src/examples/inputpanel.qdoc
@@ -0,0 +1,238 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/inputpanel
+ \title Input Panel Example
+
+ The Input Panel example shows how to create an input panel that
+ can be used to input text into widgets using only the pointer and
+ no keyboard.
+
+ \image inputpanel-example.png
+
+ The input fields in the main window have no function other than
+ to accept input. The main focus is on how the extra input panel
+ can be used to input text without the need for a real keyboard or
+ keypad.
+
+ \section1 Main Form Class Definition
+
+ Because the main window has no other function than to accept
+ input, it has no class definition. Instead, its whole layout is
+ made in Qt Designer. This emphasizes the point that no widget
+ specific code is needed to use input panels with Qt.
+
+ \section1 MyInputPanelContext Class Definition
+
+ \snippet examples/tools/inputpanel/myinputpanelcontext.h 0
+
+ The \c MyInputPanelContext class inherits QInputContext, which is
+ Qt's base class for handling input methods.
+ \c MyInputPanelContext is responsible for managing the state of
+ the input panel and sending input method events to the receiving
+ widgets.
+
+ The \c inputPanel member is a pointer to the input panel widget
+ itself; in other words, the window that will display the buttons
+ used for input.
+
+ The \c identifierName(), \c language(), \c isComposing() and
+ \c reset() functions are there mainly to fill in the pure virtual
+ functions in the base class, QInputContext, but they can be
+ useful in other scenarios. The important functions and slots are
+ the following:
+
+ \list
+ \o \c filterEvent() is where we receive events telling us to open
+ or close the input panel.
+ \o \c sendCharacter() is a slot which is called when we want to
+ send a character to the focused widget.
+ \o \c updatePosition() is used to position the input panel
+ relative to the focused widget, and will be used when opening
+ the input panel.
+ \endlist
+
+ \section1 MyInputPanelContext Class Implementation
+
+ In the constructor we connect to the \c characterGenerated()
+ signal of the input panel, in order to receive key presses. We'll
+ see how it works in detail later on.
+
+ \snippet examples/tools/inputpanel/myinputpanelcontext.cpp 0
+
+ In the \c filterEvent() function, we must look for the two event
+ types: \c RequestSoftwareInputPanel and \c CloseSoftwareInputPanel.
+
+ \snippet examples/tools/inputpanel/myinputpanelcontext.cpp 1
+
+ The first type will be sent whenever
+ an input capable widget wants to ask for an input panel. Qt's
+ input widgets do this automatically. If we receive that type of
+ event, we call \c updatePosition() \mdash we'll see later on what it
+ does \mdash then show the actual input panel widget. If we receive
+ the \c CloseSoftwareInputPanel event, we do the opposite, and
+ hide the input panel.
+
+ \snippet examples/tools/inputpanel/myinputpanelcontext.cpp 2
+
+ We implement the \c sendCharacter() function so that it sends the
+ supplied character to the focused widget. All QInputContext based
+ classes are always supposed to send events to the widget returned
+ by QInputContext::focusWidget(). Note the QPointer guards to make
+ sure that the widget does not get destroyed in between events.
+
+ Also note that we chose to use key press events in this example.
+ For more complex use cases with composed text it might be more
+ appropriate to send QInputMethodEvent events.
+
+ The \c updatePosition() function is implemented to position the
+ actual input panel window directly below the focused widget.
+
+ \snippet examples/tools/inputpanel/myinputpanelcontext.cpp 3
+
+ It performs the positioning by obtaining the coordinates of the
+ focused widget and translating them to global coordinates.
+
+ \section1 MyInputPanel Class Definition
+
+ The \c MyInputPanel class inherits QWidget and is used to display
+ the input panel widget and its buttons.
+
+ \snippet examples/tools/inputpanel/myinputpanel.h 0
+
+ If we look at the member variables first, we see that there is
+ \c form, which is made with Qt Designer, that contains the layout
+ of buttons to click. Note that all the buttons in the layout have
+ been declared with the \c NoFocus focus policy so that we can
+ maintain focus on the window receiving input instead of the
+ window containing buttons.
+
+ The \c lastFocusedWidget is a helper variable, which also aids in
+ maintaining focus.
+
+ \c signalMapper is an instance of the QSignalMapper class and is
+ there to help us tell which button was clicked. Since they are
+ all very similar this is a better solution than creating a separate
+ slot for each one.
+
+ The functions that we implement in \c MyInputPanel are the
+ following:
+
+ \list
+ \o \c event() is used to intercept and manipulate focus events,
+ so we can maintain focus in the main window.
+ \o \c saveFocusWidget() is a slot which will be called whenever
+ focus changes, and allows us to store the newly focused widget
+ in \c lastFocusedWidget, so that its focus can be restored
+ if it loses it to the input panel.
+ \o \c buttonClicked() is a slot which will be called by the
+ \c signalMapper whenever it receives a \c clicked() signal
+ from any of the buttons.
+ \endlist
+
+ \section1 MyInputPanel Class Implementation
+
+ If we look at the constructor first, we have a lot of signals to
+ connect to!
+
+ We connect the QApplication::focusChanged() signal
+ to the \c saveFocusWidget() signal in order to get focus updates.
+ Then comes the interesting part with the signal mapper: the
+ series of \c setMapping() calls sets the mapper up so that each
+ signal from one of the buttons will result in a
+ QSignalMapper::mapped() signal, with the given widget as a
+ parameter. This allows us to do general processing of clicks.
+
+ \snippet examples/tools/inputpanel/myinputpanel.cpp 0
+
+ The next series of connections then connect each button's
+ \c clicked() signal to the signal mapper. Finally, we create
+ a connection from the \c mapped() signal to the
+ \c buttonClicked() slot, where we will handle it.
+
+ \snippet examples/tools/inputpanel/myinputpanel.cpp 3
+
+ In the \c buttonClicked() slot, we extract the value of the
+ "buttonValue" property. This is a custom property which was
+ created in Qt Designer and set to the character that we wish the
+ button to produce. Then we emit the \c characterGenerated()
+ signal, which \c MyInputPanelContext is connected to. This will
+ in turn cause it to send the input to the focused widget.
+
+ In the \c saveFocusWidget() slot, we test whether the newly
+ focused widget is a child of the input panel or not, using the
+ QWidget::isAncestorOf() call.
+
+ \snippet examples/tools/inputpanel/myinputpanel.cpp 2
+
+ If it isn't, it means that the widget is outside the input panel,
+ and we store a pointer to that widget for later.
+
+ In the \c event() function we handle QEvent::WindowActivate
+ event, which occurs if the focus switches to the input panel.
+
+ \snippet examples/tools/inputpanel/myinputpanel.cpp 1
+
+ Since we want avoid focus on the input panel, we immediately call
+ QWidget::activateWindow() on the widget that last had focus, so
+ that input into that widget can continue. We ignore any other events
+ that we receive.
+
+ \section1 Setting the Input Context
+
+ The main function for the example is very similar to those for other
+ examples. The only real difference is that it creates a
+ \c MyInputPanelContext and sets it as the application-wide input
+ context.
+
+ \snippet examples/tools/inputpanel/main.cpp main
+
+ With the input context in place, we set up and show the user interface
+ made in Qt Designer before running the event loop.
+
+ \section1 Further Reading
+
+ This example shows a specific kind of input context that uses interaction
+ with a widget to provide input for another. Qt's input context system can
+ also be used to create other kinds of input methods. We recommend starting
+ with the QInputContext documentation if you want to explore further.
+*/
diff --git a/doc/src/examples/moveblocks.qdoc b/doc/src/examples/moveblocks.qdoc
new file mode 100644
index 0000000..a816005
--- /dev/null
+++ b/doc/src/examples/moveblocks.qdoc
@@ -0,0 +1,228 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example animation/moveblocks
+ \title Move Blocks Example
+
+ The Move Blocks example shows how to animate items in a
+ QGraphicsScene using a QStateMachine with a custom transition.
+
+ \image moveblocks-example.png
+
+ The example animates the blue blocks that you can see in the image
+ above. The animation moves the blocks between four preset positions.
+
+ The example consists of the following classes:
+
+ \list
+ \o \c StateSwitcher inherits QState and can add
+ \c {StateSwitchTransition}s to other states.
+ When entered, it will randomly transition to one of these
+ states.
+ \o \c StateSwitchTransition is a custom transition that
+ triggers on \c{StateSwitchEvent}s.
+ \o \c StateSwitchEvent is a QEvent that trigger \c{StateSwitchTransition}s.
+ \o \c QGraphicsRectWidget is a QGraphicsWidget that simply
+ paints its background in a solid \l{Qt::}{blue} color.
+ \endlist
+
+ The blocks are instances of \c QGraphicsRectWidget and are
+ animated in a QGraphicsScene. We do this by building a state
+ graph, which we insert animations into. The graph is then executed
+ in a QStateMachine. All this is done in \c main().
+ Let's look at the \c main() function first.
+
+ \section1 The \c main() Function
+
+ After QApplication has been initialized, we set up the
+ QGraphicsScene with its \c{QGraphicsRectWidget}s.
+
+ \snippet examples/animation/moveblocks/main.cpp 1
+
+ After adding the scene to a QGraphicsView, it is time to build the
+ state graph. Let's first look at a statechart of what we are
+ trying to build.
+
+ \image move-blocks-chart.png
+
+ Note that the \c group has seven sub states, but we have only
+ included three of them in the diagram. The code that builds this
+ graph will be examined line-by-line, and will show how the graph
+ works. First off, we construct the \c group state:
+
+ \snippet examples/animation/moveblocks/main.cpp 2
+
+ The timer is used to add a delay between each time the blocks are
+ moved. The timer is started when \c group is entered. As we will
+ see later, \c group has a transition back to the \c StateSwitcher
+ when the timer times out. \c group is the initial state in the
+ machine, so an animation will be scheduled when the example is
+ started.
+
+ \snippet examples/animation/moveblocks/main.cpp 3
+ \dots
+ \snippet examples/animation/moveblocks/main.cpp 4
+
+ \c createGeometryState() returns a QState that will set the
+ geometry of our items upon entry. It also assigns \c group as the
+ parent of this state.
+
+ A QPropertyAnimation inserted into a transition will use the
+ values assigned to a QState (with QState::assignProperty()), i.e.,
+ the animation will interpolate between the current values of the
+ properties and the values in the target state. We add animated
+ transitions to the state graph later.
+
+ \snippet examples/animation/moveblocks/main.cpp 5
+
+ We move the items in parallel. Each item is added to \c
+ animationGroup, which is the animation that is inserted into the
+ transitions.
+
+ \snippet examples/animation/moveblocks/main.cpp 6
+
+ The sequential animation group, \c subGroup, helps us insert a
+ delay between the animation of each item.
+
+ \snippet examples/animation/moveblocks/main.cpp 7
+ \dots
+ \snippet examples/animation/moveblocks/main.cpp 8
+
+ A StateSwitchTransition is added to the state switcher
+ in \c StateSwitcher::addState(). We also add the animation in this
+ function. Since QPropertyAnimation uses the values from the
+ states, we can insert the same QPropertyAnimation instance in all
+ \c {StateSwitchTransition}s.
+
+ As mentioned previously, we add a transition to the state switcher
+ that triggers when the timer times out.
+
+ \snippet examples/animation/moveblocks/main.cpp 9
+
+ Finally, we can create the state machine, add our initial state,
+ and start execution of the state graph.
+
+ \section2 The \c createGemetryState() Function
+
+ In \c createGeometryState(), we set up the geometry for each
+ graphics item.
+
+ \snippet examples/animation/moveblocks/main.cpp 13
+
+ As mentioned before, QAbstractTransition will set up an animation
+ added with \l{QAbstractTransition::}{addAnimation()} using
+ property values set with \l{QState::}{assignProperty()}.
+
+ \section1 The StateSwitcher Class
+
+ \c StateSwitcher has state switch transitions to each \l{QState}s
+ we created with \c createGemetryState(). Its job is to transition
+ to one of these states at random when it is entered.
+
+ All functions in \c StateSwitcher are inlined. We'll step through
+ its definition.
+
+ \snippet examples/animation/moveblocks/main.cpp 10
+
+ \c StateSwitcher is a state designed for a particular purpose and
+ will always be a top-level state. We use \c m_stateCount to keep
+ track of how many states we are managing, and \c m_lastIndex to
+ remember which state was the last state to which we transitioned.
+
+ \snippet examples/animation/moveblocks/main.cpp 11
+
+ We select the next state we are going to transition to, and post a
+ \c StateSwitchEvent, which we know will trigger the \c
+ StateSwitchTransition to the selected state.
+
+ \snippet examples/animation/moveblocks/main.cpp 12
+
+ This is where the magic happens. We assign a number to each state
+ added. This number is given to both a StateSwitchTransition and to
+ StateSwitchEvents. As we have seen, state switch events will
+ trigger a transition with the same number.
+
+ \section1 The StateSwitchTransition Class
+
+ \c StateSwitchTransition inherits QAbstractTransition and triggers
+ on \c{StateSwitchEvent}s. It contains only inline functions, so
+ let's take a look at its \l{QAbstractTransition::}{eventTest()}
+ function, which is the only function that we define..
+
+ \snippet examples/animation/moveblocks/main.cpp 14
+
+ \c eventTest is called by QStateMachine when it checks whether a
+ transition should be triggered--a return value of true means that
+ it will. We simply check if our assigned number is equal to the
+ event's number (in which case we fire away).
+
+ \section1 The StateSwitchEvent Class
+
+ \c StateSwitchEvent inherits QEvent, and holds a number that has
+ been assigned to a state and state switch transition by
+ \c StateSwitcher. We have already seen how it is used to trigger
+ \c{StateSwitchTransition}s in \c StateSwitcher.
+
+ \snippet examples/animation/moveblocks/main.cpp 15
+
+ We only have inlined functions in this class, so a look at its
+ definition will do.
+
+ \section1 The QGraphicsRectWidget Class
+
+ QGraphicsRectWidget inherits QGraphicsWidget and simply paints its
+ \l{QWidget::}{rect()} blue. We inline \l{QWidget::}{paintEvent()},
+ which is the only function we define. Here is the
+ QGraphicsRectWidget class definition:
+
+ \snippet examples/animation/moveblocks/main.cpp 16
+
+ \section1 Moving On
+
+ The technique shown in this example works equally well for all
+ \l{QPropertyAnimation}s. As long as the value to be animated is a
+ Qt property, you can insert an animation of it into a state graph.
+
+ QState::addAnimation() takes a QAbstractAnimation, so any type
+ of animation can be inserted into the graph.
+*/
+
diff --git a/doc/src/examples/multipleinheritance.qdoc b/doc/src/examples/multipleinheritance.qdoc
index 9d0ea84..7840033 100644
--- a/doc/src/examples/multipleinheritance.qdoc
+++ b/doc/src/examples/multipleinheritance.qdoc
@@ -103,6 +103,6 @@
There are various approaches to include forms into applications. The
Multiple Inheritance approach is just one of them. See
- \l{Using a Designer .ui File in Your Application} for more information on
+ \l{Using a Designer UI File in Your Application} for more information on
the other approaches available.
*/
diff --git a/doc/src/examples/overpainting.qdoc b/doc/src/examples/overpainting.qdoc
index 3deddd6..2abcd00 100644
--- a/doc/src/examples/overpainting.qdoc
+++ b/doc/src/examples/overpainting.qdoc
@@ -159,9 +159,10 @@
\snippet examples/opengl/overpainting/glwidget.cpp 7
- Once the list containing the object has been executed, the matrix stack
- needs to be restored to its original state at the start of this function
- before we can begin overpainting:
+ Once the list containing the object has been executed, the GL
+ states we changed and the matrix stack needs to be restored to its
+ original state at the start of this function before we can begin
+ overpainting:
\snippet examples/opengl/overpainting/glwidget.cpp 8
diff --git a/doc/src/examples/pingpong.qdoc b/doc/src/examples/pingpong.qdoc
new file mode 100644
index 0000000..0932480
--- /dev/null
+++ b/doc/src/examples/pingpong.qdoc
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example statemachine/pingpong
+ \title Ping Pong States Example
+
+ The Ping Pong States example shows how to use parallel states together
+ with custom events and transitions in \l{The State Machine Framework}.
+
+ This example implements a statechart where two states communicate by
+ posting events to the state machine. The state chart looks as follows:
+
+ \img pingpong-example.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ The \c pinger and \c ponger states are parallel states, i.e. they are
+ entered simultaneously and will take transitions independently of
+ eachother.
+
+ The \c pinger state will post the first \c ping event upon entry; the \c
+ ponger state will respond by posting a \c pong event; this will cause the
+ \c pinger state to post a new \c ping event; and so on.
+
+ \snippet examples/statemachine/pingpong/main.cpp 0
+
+ Two custom events are defined, \c PingEvent and \c PongEvent.
+
+ \snippet examples/statemachine/pingpong/main.cpp 1
+
+ The \c Pinger class defines a state that posts a \c PingEvent to the state
+ machine when the state is entered.
+
+ \snippet examples/statemachine/pingpong/main.cpp 2
+
+ The \c PingTransition class defines a transition that is triggered by
+ events of type \c PingEvent, and that posts a \c PongEvent (with a delay
+ of 500 milliseconds) to the state machine when the transition is
+ triggered.
+
+ \snippet examples/statemachine/pingpong/main.cpp 3
+
+ The \c PongTransition class defines a transition that is triggered by
+ events of type \c PongEvent, and that posts a \c PingEvent (with a delay
+ of 500 milliseconds) to the state machine when the transition is
+ triggered.
+
+ \snippet examples/statemachine/pingpong/main.cpp 4
+
+ The main() function begins by creating a state machine and a parallel
+ state group.
+
+ \snippet examples/statemachine/pingpong/main.cpp 5
+
+ Next, the \c pinger and \c ponger states are created, with the parallel
+ state group as their parent state. Note that the transitions are \e
+ targetless. When such a transition is triggered, the source state won't be
+ exited and re-entered; only the transition's onTransition() function will
+ be called, and the state machine's configuration will remain the same,
+ which is precisely what we want in this case.
+
+ \snippet examples/statemachine/pingpong/main.cpp 6
+
+ Finally, the group is added to the state machine, the machine is started,
+ and the application event loop is entered.
+
+ */
diff --git a/doc/src/examples/qtscriptcalculator.qdoc b/doc/src/examples/qtscriptcalculator.qdoc
index ffe4686..2320e5e 100644
--- a/doc/src/examples/qtscriptcalculator.qdoc
+++ b/doc/src/examples/qtscriptcalculator.qdoc
@@ -42,7 +42,6 @@
/*!
\example script/calculator
\title QtScript Calculator Example
- \ingroup scripting
In this simple QtScript example, we show how to implement the
functionality of a calculator widget.
@@ -90,10 +89,8 @@
\snippet examples/script/calculator/calculator.js 1
- The digitClicked() function uses the special local variable
- __qt_sender__ to access the object that triggered the signal;
- this gives us a simple way to retrieve the value of the digit
- that was clicked.
+ The digitClicked() function is called when a digit button is
+ clicked, with the input digit as argument.
\snippet examples/script/calculator/calculator.js 2
diff --git a/doc/src/examples/qtscripttetrix.qdoc b/doc/src/examples/qtscripttetrix.qdoc
index 8f754cb..b39eee7 100644
--- a/doc/src/examples/qtscripttetrix.qdoc
+++ b/doc/src/examples/qtscripttetrix.qdoc
@@ -57,7 +57,7 @@
\section1 Setting up the GUI
- The graphical user interface is defined in a \c{.ui} file, creating
+ The graphical user interface is defined in a UI file, created
using Qt Designer, and is set up in the example's C++ \c{main.cpp} file.
\snippet examples/script/qstetrix/main.cpp 0
diff --git a/doc/src/examples/qxmlstreambookmarks.qdoc b/doc/src/examples/qxmlstreambookmarks.qdoc
index 3ced592..616f8fe 100644
--- a/doc/src/examples/qxmlstreambookmarks.qdoc
+++ b/doc/src/examples/qxmlstreambookmarks.qdoc
@@ -51,10 +51,10 @@
\section1 XbelWriter Class Definition
- The \c XbelWriter class is a subclass of QXmlStreamReader, which provides
- an XML parser with a streaming API. \c XbelWriter also contains a private
- instance of QTreeWidget in order to display the bookmarks according to
- hierarchies.
+ The \c XbelWriter class contains a private instance of QXmlStreamWriter,
+ which provides an XML writer with a streaming API. \c XbelWriter also
+ has a reference to the QTreeWidget instance where the bookmark hierarchy
+ is stored.
\snippet examples/xml/streambookmarks/xbelwriter.h 0
@@ -75,7 +75,7 @@
\snippet examples/xml/streambookmarks/xbelwriter.cpp 1
- The \c writeItem() function accepts a QTreeWidget object and writes it
+ The \c writeItem() function accepts a QTreeWidgetItem object and writes it
to the stream, depending on its \c tagName, which can either be a "folder",
"bookmark", or "separator".
@@ -83,9 +83,10 @@
\section1 XbelReader Class Definition
- The \c XbelReader class is a subclass of QXmlStreamReader, the pendent
- class for QXmlStreamWriter. \c XbelReader contains a private instance
- of QTreeWidget to group bookmarks according to their hierarchies.
+ The \c XbelReader contains a private instance of QXmlStreamReader, the
+ companion class to QXmlStreamWriter. \c XbelReader also contains a
+ reference to the QTreeWidget that is used to group the bookmarks according
+ to their hierarchy.
\snippet examples/xml/streambookmarks/xbelreader.h 0
@@ -102,23 +103,27 @@
\snippet examples/xml/streambookmarks/xbelreader.cpp 0
The \c read() function accepts a QIODevice and sets it using
- \l{QXmlStreamReader::setDevice()}{setDevice()}. The actual process
- of reading only takes place if the file is a valid XBEL 1.0 file.
- Note that the XML input needs to be well-formed to be accepted by
- QXmlStreamReader. Otherwise, the \l{QXmlStreamReader::raiseError()}
- {raiseError()} function is used to display an error message.
+ \l{QXmlStreamReader::}{setDevice()}. The actual process of reading only
+ takes place if the file is a valid XBEL 1.0 file. Note that the XML input
+ needs to be well-formed to be accepted by QXmlStreamReader. Otherwise, the
+ \l{QXmlStreamReader::}{raiseError()} function is used to display an error
+ message. Since the XBEL reader is only concerned with reading XML elements,
+ it makes extensive use of the \l{QXmlStreamReader::}{readNextStartElement()}
+ convenience function.
\snippet examples/xml/streambookmarks/xbelreader.cpp 1
- The \c readUnknownElement() function reads an unknown element. The
- Q_ASSERT() macro is used to provide a pre-condition for the function.
+ The \c errorString() function is used if an error occurred, in order to
+ obtain a description of the error complete with line and column number
+ information.
\snippet examples/xml/streambookmarks/xbelreader.cpp 2
The \c readXBEL() function reads the name of a startElement and calls
the appropriate function to read it, depending on whether if its a
"folder", "bookmark" or "separator". Otherwise, it calls
- \c readUnknownElement().
+ \l{QXmlStreamReader::}{skipCurrentElement()}. The Q_ASSERT() macro is used
+ to provide a pre-condition for the function.
\snippet examples/xml/streambookmarks/xbelreader.cpp 3
@@ -127,8 +132,8 @@
\snippet examples/xml/streambookmarks/xbelreader.cpp 4
The \c readSeparator() function creates a separator and sets its flags.
- The text is set to 30 "0xB7", the HEX equivalent for period, and then
- read using \c readElementText().
+ The text is set to 30 "0xB7", the HEX equivalent for period. The element
+ is then skipped using \l{QXmlStreamReader::}{skipCurrentElement()}.
\snippet examples/xml/streambookmarks/xbelreader.cpp 5
diff --git a/doc/src/examples/rogue.qdoc b/doc/src/examples/rogue.qdoc
new file mode 100644
index 0000000..8f97696
--- /dev/null
+++ b/doc/src/examples/rogue.qdoc
@@ -0,0 +1,222 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example statemachine/rogue
+ \title Rogue Example
+
+ The Rogue example shows how to use the Qt state machine for event
+ handling.
+
+ \image rogue-example.png
+
+ This example implements a simple text based game. Do you see the
+ \c{@} in the screenshot? That's you, the rogue. The \c{#}
+ characters are walls, and the dots represent floor. In a real
+ game, other ASCII characters would represent all kinds of objects
+ and creatures. For instance, ancient dragons (\c{D}'s) or food
+ rations (\c{%}'s). But let's not get carried away. In this game,
+ the rogue is simply running around in an empty room.
+
+ The rogue is moved with the keypad (2, 4, 8, 6). That aside, we
+ have implemented a \c quit command that triggers if the player
+ types \c {q}. The player is then asked if he/she really wants to
+ quit.
+
+ Most games have commands that need more than one key press and
+ that may require a different sequence of keys based on questions
+ asked the user. In this game, only the \c quit command falls under
+ this category, but for the sake of argument, let's imagine a
+ fully-fledged game with a rich set of commands. If we were to
+ implement these by catching key events in
+ \l{QWidget::}{keyPressEvent()}, we would have to keep a lot of
+ class member variables to track the sequence of keys already typed
+ (or find some other way of deducing the current state of a
+ command). This can easily lead to spaghetti, which is--as we all
+ well know, I'm sure--unpleasant. With a state machine, on the
+ other hand, separate states can wait for a single key press, and
+ that makes our lives a lot simpler.
+
+ The example consists of two classes:
+
+ \list
+ \o \c Window draws the text display of the game and sets
+ up the state machine. The window also has a status bar
+ above the area in which the rouge moves.
+ \o \c MovementTransition is a transition that carries out
+ a single move of the rogue.
+ \endlist
+
+ Before we embark on a code walkthrough, it is necessary to take a
+ closer look at the design of the machine. Here is a state chart
+ that shows what we want to achieve:
+
+ \image rogue-statechart.png
+
+ The input state waits for a key press to start a new command.
+ When receiving a key it recognizes, it transitions to one of the
+ two commands of the game; though, as we will see, movement is
+ handled by the transition itself. The quit state waits for the
+ player to answer yes or no (by typing \c y or \c n) when asked
+ whether he/she really wants to quit the game.
+
+ The chart demonstrates how we use one state to wait for a single
+ key press. The press received may trigger one of the transitions
+ connected to the state.
+
+ \section1 Window Class Definition
+
+ The \c Window class is a widget that draws the text display of the
+ game. It also sets up the state machine, i.e., creates and
+ connects the states in the machine. It is the key events from this
+ widget that are used by the machine.
+
+ \snippet examples/statemachine/rogue/window.h 0
+
+ \c Direction specifies the direction in which the rogue is to
+ move. We use this in \c movePlayer(), which moves the rogue and
+ repaints the window. The game has a status line above the area in
+ which the rogue moves. The \c status property contains the text of
+ this line. We use a property because the QState class allows
+ setting any Qt \l{Qt's Property System}{property} when entered.
+ More on this later.
+
+ \snippet examples/statemachine/rogue/window.h 1
+
+ The \c map is an array with the characters that are currently
+ displayed. We set up the array in \c setupMap(), and update it
+ when the rogue is moved. \c pX and \c pY is the current position
+ of the rogue. \c WIDTH and \c HEIGHT are macros specifying the
+ dimensions of the map.
+
+ The \c paintEvent() function is left out of this walkthrough. We
+ also do not discuss other code that does not concern the state
+ machine (the \c setupMap(), \c status(), \c setStatus(), \c
+ movePlayer(), and \c sizeHint() functions). If you wish to take a
+ look at the code, click on the link for the \c window.cpp file at
+ the top of this page.
+
+ \section1 Window Class Implementation
+
+ Here is the constructor of \c Window:
+
+ \snippet examples/statemachine/rogue/window.cpp 0
+ \dots
+ \snippet examples/statemachine/rogue/window.cpp 1
+
+ The player starts off at position (5, 5). We then set up the map
+ and statemachine. Let's proceed with the \c buildMachine()
+ function:
+
+ \snippet examples/statemachine/rogue/window.cpp 2
+
+ We enter \c inputState when the machine is started and from the \c
+ quitState if the user wants to continue playing. We then set the
+ status to a helpful reminder of how to play the game.
+
+ First, the \c Movement transition is added to the input state.
+ This will enable the rogue to be moved with the keypad. Notice
+ that we don't set a target state for the movement transition. This
+ will cause the transition to be triggered (and the
+ \l{QAbstractTransition::}{onTransition()} function to be invoked),
+ but the machine will not leave the \c inputState. If we had set \c
+ inputState as the target state, we would first have left and then
+ entered the \c inputState again.
+
+ \snippet examples/statemachine/rogue/window.cpp 3
+
+ When we enter \c quitState, we update the status bar of the
+ window.
+
+ \c QKeyEventTransition is a utility class that removes the hassle
+ of implementing transitions for \l{QKeyEvent}s. We simply need to
+ specify the key on which the transition should trigger and the
+ target state of the transition.
+
+ \snippet examples/statemachine/rogue/window.cpp 4
+
+ The transition from \c inputState allows triggering the quit state
+ when the player types \c {q}.
+
+ \snippet examples/statemachine/rogue/window.cpp 5
+
+ The machine is set up, so it's time to start it.
+
+ \section1 The MovementTransition Class
+
+ \c MovementTransition is triggered when the player request the
+ rogue to be moved (by typing 2, 4, 6, or 8) when the machine is in
+ the \c inputState.
+
+ \snippet examples/statemachine/rogue/movementtransition.h 0
+
+ In the constructor, we tell QEventTransition to only send
+ \l{QEvent::}{KeyPress} events to the
+ \l{QAbstractTransition::}{eventTest()} function:
+
+ \snippet examples/statemachine/rogue/movementtransition.h 1
+
+ The KeyPress events come wrapped in \l{QWrappedEvent}s. \c event
+ must be confirmed to be a wrapped event because Qt uses other
+ events internally. After that, it is simply a matter of checking
+ which key has been pressed.
+
+ Let's move on to the \c onTransition() function:
+
+ \snippet examples/statemachine/rogue/movementtransition.h 2
+
+ When \c onTransition() is invoked, we know that we have a
+ \l{QEvent::}{KeyPress} event with 2, 4, 6, or 8, i.e., the event
+ is already unwrapped.
+
+ \section1 The Roguelike Tradition
+
+ You might have been wondering why the game features a rogue. Well,
+ these kinds of text based dungeon exploration games date back to a
+ game called, yes, "Rogue". Although outflanked by the technology
+ of modern 3D computer games, roguelikes have a solid community of
+ hard-core, devoted followers.
+
+ Playing these games can be surprisingly addictive (despite the
+ lack of graphics). Angband, the perhaps most well-known rougelike,
+ is found here: \l{http://rephial.org/}.
+*/
+
diff --git a/doc/src/examples/schema.qdoc b/doc/src/examples/schema.qdoc
new file mode 100644
index 0000000..9907f75
--- /dev/null
+++ b/doc/src/examples/schema.qdoc
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xmlpatterns/schema
+ \title XML Schema Validation Example
+
+ This example shows how to use QtXmlPatterns to validate XML with
+ a W3C XML Schema.
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ The example application shows different XML schema definitions and
+ for every definition two XML instance documents, one that is valid
+ according to the schema and one that is not.
+ The user can select the valid or invalid instance document, change
+ it and validate it again.
+
+ \section2 The User Interface
+
+ The UI for this example was created using \l{Qt Designer Manual} {Qt
+ Designer}:
+
+ \image schema-example.png
+
+ The UI consists of three parts, at the top the XML schema \l{QComboBox} {selection}
+ and the schema \l{QTextBrowser} {viewer}, below the XML instance \l{QComboBox} {selection}
+ and the instance \l{QTextEdit} {editor} and at the bottom the validation status \l{QLabel} {label}
+ next to the validation \l{QPushButton} {button}.
+
+ \section2 Validating XML Instance Documents
+
+ You can select one of the three predefined XML schemas and for each schema
+ an valid or invalid instance document. A click on the 'Validate' button will
+ validate the content of the XML instance editor against the schema from the
+ XML schema viewer. As you can modify the content of the instance editor, different
+ instances can be tested and validation error messages analysed.
+
+ \section1 Code Walk-Through
+
+ The example's main() function creates the standard instance of
+ QApplication. Then it creates an instance of the mainwindow class, shows it,
+ and starts the Qt event loop:
+
+ \snippet examples/xmlpatterns/schema/main.cpp 0
+
+ \section2 The UI Class: MainWindow
+
+ The example's UI is a conventional Qt GUI application inheriting
+ QMainWindow and the class generated by \l{Qt Designer Manual} {Qt
+ Designer}:
+
+ \snippet examples/xmlpatterns/schema/mainwindow.h 0
+
+ The constructor fills the schema and instance \l{QComboBox} selections with the predefined
+ schemas and instances and connects their \l{QComboBox::currentIndexChanged()} {currentIndexChanged()}
+ signals to the window's \c{schemaSelected()} resp. \c{instanceSelected()} slot.
+ Furthermore the signal-slot connections for the validation \l{QPushButton} {button}
+ and the instance \l{QTextEdit} {editor} are set up.
+
+ The call to \c{schemaSelected(0)} and \c{instanceSelected(0)} will trigger the validation
+ of the initial Contact Schema example.
+
+ \snippet examples/xmlpatterns/schema/mainwindow.cpp 0
+
+ In the \c{schemaSelected()} slot the content of the instance \l{QComboBox} {selection}
+ is adapted to the selected schema and the corresponding schema is loaded from the
+ \l{The Qt Resource System} {resource file} and displayed in the schema \l{QTextBrowser} {viewer}.
+ At the end of the method a revalidation is triggered.
+
+ \snippet examples/xmlpatterns/schema/mainwindow.cpp 1
+
+ In the \c{instanceSelected()} slot the selected instance is loaded from the
+ \l{The Qt Resource System} {resource file} and loaded into the instance \l{QTextEdit} {editor}
+ an the revalidation is triggered again.
+
+ \snippet examples/xmlpatterns/schema/mainwindow.cpp 2
+
+ The \c{validate()} slot does the actual work in this example.
+ At first it stores the content of the schema \l{QTextBrowser} {viewer} and the
+ \l{QTextEdit} {editor} into temporary \l{QByteArray} {variables}.
+ Then it instanciates a \c{MessageHandler} object which inherits from
+ \l{QAbstractMessageHandler} {QAbstractMessageHandler} and is a convenience
+ class to store error messages from the XmlPatterns system.
+
+ \snippet examples/xmlpatterns/schema/mainwindow.cpp 4
+
+ After the \l{QXmlSchema} {QXmlSchema} is instanciated and the message handler set
+ on it, the \l{QXmlSchema::load()} {load()} method is called with the schema data as argument.
+ If the schema is invalid or a parsing error has occured, \l{QXmlSchema::isValid()} {isValid()}
+ returns \c{false} and the error is flagged in \c{errorOccurred}.
+ If the loading was successful, a \l{QXmlSchemaValidator} {QXmlSchemaValidator} is
+ instanciated and the schema passed in the constructor.
+ A call to \l{QXmlSchemaValidator::validate()} {validate()} will validate the passed
+ XML instance data against the XML schema. The return value of that method signals
+ whether the validation was successful.
+ Depending on the success the status \l{QLabel} {label} is set to 'validation successful'
+ or the error message stored in the \c{MessageHandler}
+
+ The rest of the code does only some fancy coloring and eyecandy.
+
+ \snippet examples/xmlpatterns/schema/mainwindow.cpp 3
+*/
diff --git a/doc/src/examples/scribble.qdoc b/doc/src/examples/scribble.qdoc
index 0283e4d..b57c8eb 100644
--- a/doc/src/examples/scribble.qdoc
+++ b/doc/src/examples/scribble.qdoc
@@ -354,7 +354,7 @@
To retrieve a new pen width in the \c penWidth() slot, we use
QInputDialog. The QInputDialog class provides a simple
convenience dialog to get a single value from the user. We use
- the static QInputDialog::getInteger() function, which combines a
+ the static QInputDialog::getInt() function, which combines a
QLabel and a QSpinBox. The QSpinBox is initialized with the
scribble area's pen width, allows a range from 1 to 50, a step of
1 (meaning that the up and down arrow increment or decrement the
diff --git a/doc/src/examples/simpletextviewer.qdoc b/doc/src/examples/simpletextviewer.qdoc
index ac85186..94e1318 100644
--- a/doc/src/examples/simpletextviewer.qdoc
+++ b/doc/src/examples/simpletextviewer.qdoc
@@ -198,12 +198,7 @@
<file>openfile.html</file>
<file>wildcardmatching.html</file>
<file>images/browse.png</file>
- <file>images/fadedfilemenu.png</file>
- <file>images/filedialog.png</file>
- <file>images/handbook.png</file>
- <file>images/mainwindow.png</file>
- <file>images/open.png</file>
- <file>images/wildcard.png</file>
+ <file>images/*.png</file>
</files>
</filterSection>
</QtHelpProject>
diff --git a/doc/src/examples/stickman.qdoc b/doc/src/examples/stickman.qdoc
new file mode 100644
index 0000000..2b3cb61
--- /dev/null
+++ b/doc/src/examples/stickman.qdoc
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example animation/stickman
+ \title Stickman Example
+
+ The Stickman example shows how to animate transitions in a state machine to implement key frame
+ animations.
+
+ \image stickman-example.png
+
+ In this example, we will write a small application which animates the joints in a skeleton and
+ projects a stickman figure on top. The stickman can be either "alive" or "dead", and when in the
+ "alive" state, he can be performing different actions defined by key frame animations.
+
+ Animations are implemented as composite states. Each child state of the animation state
+ represents a frame in the animation by setting the position of each joint in the stickman's
+ skeleton to the positions defined for the particular frame. The frames are then bound together
+ with animated transitions that trigger on the source state's polished() signal. Thus, the
+ machine will enter the state representing the next frame in the animation immediately after it
+ has finished animating into the previous frame.
+
+ \image stickman-example1.png
+
+ The states for an animation is constructed by reading a custom animation file format and
+ creating states that assign values to the the "position" properties of each of the nodes in the
+ skeleton graph.
+
+ \snippet examples/animation/stickman/lifecycle.cpp 1
+
+ The states are then bound together with signal transitions that listen to the polished() signal.
+
+ \snippet examples/animation/stickman/lifecycle.cpp 2
+
+ The last frame state is given a transition to the first one, so that the animation will loop
+ until it is interrupted when a transition out from the animation state is taken. To get smooth
+ animations between the different key frames, we set a default animation on the state machine.
+ This is a parallel animation group which contains animations for all the "position" properties
+ and will be selected by default when taking any transition that leads into a state that assigns
+ values to these properties.
+
+ \snippet examples/animation/stickman/lifecycle.cpp 3
+
+ Several such animation states are constructed, and are placed together as children of a top
+ level "alive" state which represents the stickman life cycle. Transitions go from the parent
+ state to the child state to ensure that each of the child states inherit them.
+
+ \image stickman-example2.png
+
+ This saves us the effort of connect every state to every state with identical transitions. The
+ state machine makes sure that transitions between the key frame animations are also smooth by
+ applying the default animation when interrupting one and starting another.
+
+ Finally, there is a transition out from the "alive" state and into the "dead" state. This is
+ a custom transition type called LightningSrikesTransition which samples every second and
+ triggers at random (one out of fifty times on average.)
+
+ \snippet examples/animation/stickman/lifecycle.cpp 4
+
+ When it triggers, the machine will first enter a "lightningBlink" state which uses a timer to
+ pause for a brief period of time while the background color of the scene is white. This gives us
+ a flash effect when the lightning strikes.
+
+ \snippet examples/animation/stickman/lifecycle.cpp 5
+
+ We start and stop a QTimer object when entering and exiting the state. Then we transition into
+ the "dead" state when the timer times out.
+
+ \snippet examples/animation/stickman/lifecycle.cpp 0
+
+ When the machine is in the "dead" state, it will be unresponsive. This is because the "dead"
+ state has no transitions leading out.
+
+ \image stickman-example3.png
+
+*/
diff --git a/doc/src/examples/svggenerator.qdoc b/doc/src/examples/svggenerator.qdoc
index cd2a0a8..3fb2f0d 100644
--- a/doc/src/examples/svggenerator.qdoc
+++ b/doc/src/examples/svggenerator.qdoc
@@ -55,8 +55,8 @@
The example consists of two classes: \c Window and \c DisplayWidget.
The \c Window class contains the application logic and constructs the user
- interface from a Qt Designer \c{.ui} file as described in the
- \l{Using a Designer .ui File in Your Application#The Multiple Inheritance Approach}{Qt Designer manual}.
+ interface from a Qt Designer UI file as described in the
+ \l{Using a Designer UI File in Your Application#The Multiple Inheritance Approach}{Qt Designer manual}.
It also contains the code to write an SVG file.
The \c DisplayWidget class performs all the work of painting a picture on
diff --git a/doc/src/examples/tablet.qdoc b/doc/src/examples/tablet.qdoc
index bf10171..dd3086b 100644
--- a/doc/src/examples/tablet.qdoc
+++ b/doc/src/examples/tablet.qdoc
@@ -275,7 +275,10 @@
In this function we draw on the image based on the movement of the
device. If the device used on the tablet is a stylus we want to draw a
- line between the positions of the stylus recorded in \c polyLine.
+ line between the positions of the stylus recorded in \c polyLine. We
+ also assume that this is a reasonable handling of any unknown device,
+ but update the statusbar with a warning so that the user can see that
+ for his tablet he might have to implement special handling.
If it is an airbrush we want to draw a circle of points with a
point density based on the tangential pressure, which is the position
of the finger wheel on the airbrush. We use the Qt::BrushStyle to
diff --git a/doc/src/examples/textfinder.qdoc b/doc/src/examples/textfinder.qdoc
index 0f672dc..0b5db79 100644
--- a/doc/src/examples/textfinder.qdoc
+++ b/doc/src/examples/textfinder.qdoc
@@ -45,7 +45,7 @@
The Text Finder example demonstrates how to dynamically process forms
using the QtUiTools module. Dynamic form processing enables a form to
- be processed at run-time only by changing the .ui file for the project.
+ be processed at run-time only by changing the UI file for the project.
The program allows the user to look up a particular word within the
contents of a text file. This text file is included in the project's
resource and is loaded into the display at startup.
@@ -95,7 +95,7 @@
\snippet examples/uitools/textfinder/textfinder.h 0
The slot \c{on_find_Button_clicked()} is a slot named according to the
- \l{Using a Designer .ui File in Your Application#Automatic Connections}
+ \l{Using a Designer UI File in Your Application#Automatic Connections}
{Automatic Connection} naming convention required
by \c uic.
diff --git a/doc/src/examples/trafficinfo.qdoc b/doc/src/examples/trafficinfo.qdoc
index 3d06584..ca90b977 100644
--- a/doc/src/examples/trafficinfo.qdoc
+++ b/doc/src/examples/trafficinfo.qdoc
@@ -159,5 +159,5 @@
The rest of the code in this example is just for representing the time and
station information to the user, and uses techniques described in the
- \l{Qt Examples#Widgets}{Widgets examples}.
+ \l{Widgets Examples}.
*/
diff --git a/doc/src/examples/trafficlight.qdoc b/doc/src/examples/trafficlight.qdoc
new file mode 100644
index 0000000..42c0bd7
--- /dev/null
+++ b/doc/src/examples/trafficlight.qdoc
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example statemachine/trafficlight
+ \title Traffic Light Example
+
+ The Traffic Light example shows how to use \l{The State Machine Framework}
+ to implement the control flow of a traffic light.
+
+ \image trafficlight-example.png
+
+ In this example we write a TrafficLightWidget class. The traffic light has
+ three lights: Red, yellow and green. The traffic light transitions from
+ one light to another (red to yellow to green to yellow to red again) at
+ certain intervals.
+
+ \snippet examples/statemachine/trafficlight/main.cpp 0
+
+ The LightWidget class represents a single light of the traffic light. It
+ provides an \c on property and two slots, turnOn() and turnOff(), to turn
+ the light on and off, respectively. The widget paints itself in the color
+ that's passed to the constructor.
+
+ \snippet examples/statemachine/trafficlight/main.cpp 1
+
+ The TrafficLightWidget class represents the visual part of the traffic
+ light; it's a widget that contains three lights arranged vertically, and
+ provides accessor functions for these.
+
+ \snippet examples/statemachine/trafficlight/main.cpp 2
+
+ The createLightState() function creates a state that turns a light on when
+ the state is entered, and off when the state is exited. The state uses a
+ timer, and as we shall see the timeout is used to transition from one
+ LightState to another. Here is the statechart for the light state:
+
+ \img trafficlight-example1.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ \snippet examples/statemachine/trafficlight/main.cpp 3
+
+ The TrafficLight class combines the TrafficLightWidget with a state
+ machine. The state graph has four states: red-to-yellow, yellow-to-green,
+ green-to-yellow and yellow-to-red. The initial state is red-to-yellow;
+ when the state's timer times out, the state machine transitions to
+ yellow-to-green. The same process repeats through the other states.
+ This is what the statechart looks like:
+
+ \img trafficlight-example2.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ \snippet examples/statemachine/trafficlight/main.cpp 4
+
+ The main() function constructs a TrafficLight and shows it.
+
+*/
diff --git a/doc/src/examples/transformations.qdoc b/doc/src/examples/transformations.qdoc
index 01d4ebe..f5e8865 100644
--- a/doc/src/examples/transformations.qdoc
+++ b/doc/src/examples/transformations.qdoc
@@ -85,10 +85,10 @@
All the tranformation operations operate on QPainter's
tranformation matrix that you can retrieve using the
- QPainter::matrix() function. A matrix transforms a point in the
+ QPainter::worldTransform() function. A matrix transforms a point in the
plane to another point. For more information about the
transformation matrix, see the \l {The Coordinate System} and
- QMatrix documentation.
+ QTransform documentation.
\snippet examples/painting/transformations/renderarea.h 0
@@ -375,7 +375,7 @@
All the tranformation operations operate on QPainter's
tranformation matrix. For more information about the
transformation matrix, see the \l {The Coordinate System} and
- QMatrix documentation.
+ QTransform documentation.
The Qt reference documentation provides several painting
demos. Among these is the \l {demos/affine}{Affine
diff --git a/doc/src/examples/twowaybutton.qdoc b/doc/src/examples/twowaybutton.qdoc
new file mode 100644
index 0000000..7c52596
--- /dev/null
+++ b/doc/src/examples/twowaybutton.qdoc
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example statemachine/twowaybutton
+ \title Two-way Button Example
+
+ The Two-way button example shows how to use \l{The State Machine
+ Framework} to implement a simple state machine that toggles the current
+ state when a button is clicked.
+
+ \snippet examples/statemachine/twowaybutton/main.cpp 0
+
+ The application's main() function begins by constructing the application
+ object, a button and a state machine.
+
+ \snippet examples/statemachine/twowaybutton/main.cpp 1
+
+ The state machine has two states; \c on and \c off. When either state is
+ entered, the text of the button will be set accordingly.
+
+ \snippet examples/statemachine/twowaybutton/main.cpp 2
+
+ When the state machine is in the \c off state and the button is clicked,
+ it will transition to the \c on state; when the state machine is in the \c
+ on state and the button is clicked, it will transition to the \c off
+ state.
+
+ \snippet examples/statemachine/twowaybutton/main.cpp 3
+
+ The states are added to the state machine; they become top-level (sibling)
+ states.
+
+ \snippet examples/statemachine/twowaybutton/main.cpp 4
+
+ The initial state is \c off; this is the state the state machine will
+ immediately transition to once the state machine is started.
+
+ \snippet examples/statemachine/twowaybutton/main.cpp 5
+
+ Finally, the button is resized and made visible, and the application event
+ loop is entered.
+
+*/
diff --git a/doc/src/examples/videographicsitem.qdoc b/doc/src/examples/videographicsitem.qdoc
new file mode 100644
index 0000000..ed420c0
--- /dev/null
+++ b/doc/src/examples/videographicsitem.qdoc
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example video/videographicsitem
+ \title Video Graphics Item Example
+
+ The Video Graphics Item example shows how to implement a QGraphicsItem that displays video on a
+ graphics scene using QtMultimedia's QAbstractVideoSurface.
+
+ \image video-videographicsitem.png
+
+ \sa {Video Widget Example}
+*/
diff --git a/doc/src/examples/videowidget.qdoc b/doc/src/examples/videowidget.qdoc
new file mode 100644
index 0000000..ea0b495
--- /dev/null
+++ b/doc/src/examples/videowidget.qdoc
@@ -0,0 +1,187 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example video/videowidget
+ \title Video Widget Example
+
+ The Video Widget example shows how to implement a video widget using
+ QtMultimedia's QAbstractVideoSurface
+
+ \image video-videowidget.png
+
+ \section1 VideoWidgetSurface Class Definition
+
+ \snippet examples/video/videowidget/videowidgetsurface.h 0
+
+ The VideoWidgetSurface class inherits QAbstractVideoSurface and paints
+ video frames on a QWidget. This is a separate class to VideoWidget as both
+ QAbstractVideoSurface and QWidget inherit QObject.
+
+ In addition to the functions from QAbstractVideoSurface, VideoWidgetSurface
+ has functions for determining the video display rectangle, and painting
+ the video.
+
+ \section1 VideoWidgetSurface Class Implementation
+
+ \snippet examples/video/videowidget/videowidgetsurface.cpp 0
+
+ From the supportedPixelFormats() function we return a list of pixel formats
+ the surface can paint. The order of the list hints at which formats are
+ preferred by the surface. Assuming a 32-bit RGB backbuffer, we'd expect
+ that a 32-bit RGB type with no alpha to be fastest to paint so
+ QVideoFrame::Image_RGB32 is first in the list.
+
+ Since we don't support rendering using any special frame handles we don't
+ return any pixel formats if handleType is not
+ QAbstractVideoBuffer::NoHandle.
+
+ \snippet examples/video/videowidget/videowidgetsurface.cpp 1
+
+ In isFormatSupported() we test if the frame type of a surface format maps
+ to a valid QImage format, that the frame size is not empty, and the handle
+ type is QAbstractVideoBuffer::NoHandle. Note that the
+ QAbstractVideoSurface implementation of isFormatSupported() will verify
+ that the list of supported pixel formats returned by
+ \c supportedPixelFormats(format.handleType()) contains the pixel format and
+ that the size is not empty so a reimplementation wasn't strictly necessary
+ in this case.
+
+ \snippet examples/video/videowidget/videowidgetsurface.cpp 2
+
+ To start our surface we'll extract the image format and size from the
+ selected video format and save it for use in the paint() function. If the
+ image format, or size are invalid then we'll set an error and return false.
+ Otherwise we'll save the format and confirm the surface has been started,
+ by calling QAbstractVideoSurface::start(). Finally since the video size may
+ have changed we'll trigger an update of the widget, and video geometry.
+
+ \snippet examples/video/videowidget/videowidgetsurface.cpp 5
+
+ The updateVideoRect() function calculates the region within the widget the
+ video occupies. The \l {QVideoSurfaceFormat::sizeHint()}{size hint} of the
+ video format gives a suggested size for the video calculated from the
+ \l {QVideoSurfaceFormat::viewport()}{viewport} and
+ \l {QVideoSurfaceFormat::pixelAspectRatio()}{pixel aspect ratio}. If the
+ suggested size fits within the widget then we create a new rect of that
+ size in the center of the widget. Otherwise we shrink the size maintaining
+ the aspect ratio so that it does fit.
+
+ \snippet examples/video/videowidget/videowidgetsurface.cpp 4
+
+ We can't paint from outside a paint event, so when a new frame is received
+ in present() we save a reference to it and force an immediate repaint of
+ the video region. We retain the saved reference to the frame after the
+ repaint so that the widget can be repainted between frame changes if
+ necessary.
+
+ If the format of the frame doesn't match the surface format we can't paint
+ it or very likely any future frames. So we set an
+ \l {QAbstractVideoSurface::UnsupportedFormatError}{UnsupportedFormatError}
+ on our surface and stop it immediately.
+
+ \snippet examples/video/videowidget/videowidgetsurface.cpp 6
+
+ The paint() function is called by the video widget to paint the current
+ video frame. Before we draw the frame first we'll check the format for
+ the scan line direction and if the scan lines are arranged from bottom to
+ top we'll flip the painter so the frame isn't drawn upside down. Then
+ using the image format information saved in the start() function we'll
+ construct a new QImage from the current video frame, and draw it to the
+ the widget.
+
+ \snippet examples/video/videowidget/videowidgetsurface.cpp 3
+
+ When the surface is stopped we need to release the current frame and
+ invalidate the video region. Then we confirm the surface has been
+ stopped by calling QAbstractVideoSurface::stop() which sets the started
+ state to false and finally we update so the video widget so paints over
+ the last frame.
+
+ \section1 VideoWidget Class Definition
+
+ The VideoWidget class uses the VideoWidgetSurface class to implement a
+ video widget.
+
+ \snippet examples/video/videowidget/videowidget.h 0
+
+ The VideoWidget QWidget implementation is minimal with just the sizeHint(),
+ paintEvent(), and resizeEvent() functions in addition to the constructor,
+ destructor and an instance of VideoWidgetSurface.
+
+ \section1 VideoWidget Class Implementation
+
+ \snippet examples/video/videowidget/videowidget.cpp 0
+
+ In the VideoWidget constructor we set some flags to speed up re-paints a
+ little. Setting the Qt::WA_NoSystemBackground flag and disabling automatic
+ background fills will stop Qt from a painting a background that'll be
+ completely obscured by the video. The Qt::WA_PaintOnScreen flag will
+ allow us to paint to the screen instead of the back buffer where supported.
+
+ Next we set the background color to black, so that any borders around the
+ video are filled in black rather the default background color.
+
+ Finally we construct an instance of the VideoWidgetSurface class.
+
+ \snippet examples/video/videowidget/videowidget.cpp 1
+
+ In the destructor we simply delete the VideoWidgetSurface instance.
+
+ \snippet examples/video/videowidget/videowidget.cpp 2
+
+ We get the size hint for the widget from the video format of the surface
+ which is calculated from viewport and pixel aspect ratio of the video
+ format.
+
+ \snippet examples/video/videowidget/videowidget.cpp 3
+
+ When the video widget receives a paint event we first check if the surface
+ is started, if not then we simply fill the widget with the background
+ color. If it is then we draw a border around the video region clipped
+ by the paint region, before calling paint on the video surface to draw the
+ current frame.
+
+ \snippet examples/video/videowidget/videowidget.cpp 4
+
+ The resizeEvent() function is reimplemented to trigger an update of the
+ video region when the widget is resized.
+*/
diff --git a/doc/src/examples/worldtimeclockbuilder.qdoc b/doc/src/examples/worldtimeclockbuilder.qdoc
index c2a502f..f5734c4 100644
--- a/doc/src/examples/worldtimeclockbuilder.qdoc
+++ b/doc/src/examples/worldtimeclockbuilder.qdoc
@@ -66,7 +66,7 @@
generate a dependency on the \c libQtUiTools library containing the QtUiTools
classes.
- Note that we do not inform \c qmake about any .ui files, and so none will
+ Note that we do not inform \c qmake about any UI files, and so none will
be processed and built into the application. The resource file contains
an entry for the particular form that we wish to use:
diff --git a/doc/src/exceptionsafety.qdoc b/doc/src/exceptionsafety.qdoc
new file mode 100644
index 0000000..5c4101a
--- /dev/null
+++ b/doc/src/exceptionsafety.qdoc
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page exceptionsafety.html
+ \title Exception Safety
+ \ingroup architecture
+ \brief A guide to exception safety in Qt.
+
+ \bold {Preliminary warning}: Exception safety is not feature complete!
+ Common cases should work, but classes might still leak or even crash.
+
+ Qt itself will not throw exceptions. Instead, error codes are used.
+ In addition, some classes have user visible error messages, for example
+ \l QIODevice::errorString() or \l QSqlQuery::lastError().
+ This has historical and practical reasons - turning on exceptions
+ can increase the library size by over 20%.
+
+ The following sections describe Qt's behavior if exception support is
+ enabled at compile time.
+
+ \tableofcontents
+
+ \section1 Exception safe modules
+
+ \section2 Containers
+
+ Qt's \l{container classes} are generally exception neutral. They pass any
+ exception that happens within their contained type \c T to the user
+ while keeping their internal state valid.
+
+ Example:
+
+ \code
+ QList<QString> list;
+ ...
+ try {
+ list.append("hello");
+ } catch (...) {
+ }
+ // list is safe to use - the exception did not affect it.
+ \endcode
+
+ Exceptions to that rule are containers for types that can throw during assignment
+ or copy constructions. For those types, functions that modify the container as well as
+ returning a value, are unsafe to use:
+
+ \code
+ MyType s = list.takeAt(2);
+ \endcode
+
+ If an exception occurs during the assignment of \c s, the value at index 2 is already
+ removed from the container, but hasn't been assigned to \c s yet. It is lost
+ without chance of recovery.
+
+ The correct way to write it:
+
+ \code
+ MyType s = list.at(2);
+ list.removeAt(2);
+ \endcode
+
+ If the assignment throws, the container still contains the value, no data loss occured.
+
+ Note that implicitly shared Qt classes will not throw in their assignment
+ operators or copy constructors, so the limitation above does not apply.
+
+ \section1 Out of Memory Handling
+
+ Most desktop operating systems overcommit memory. This means that \c malloc()
+ or \c{operator new} return a valid pointer, even though there is not enough
+ memory available at allocation time. On such systems, no exception of type
+ \c std::bad_alloc is thrown.
+
+ On all other operating systems, Qt will throw an exception of type std::bad_alloc
+ if any allocation fails. Allocations can fail if the system runs out of memory or
+ doesn't have enough continuous memory to allocate the requested size.
+
+ Exceptions to that rule are documented. As an example, \l QImage::create()
+ returns false if not enough memory exists instead of throwing an exception.
+
+ \section1 Recovering from exceptions
+
+ Currently, the only supported use case for recovering from exceptions thrown
+ within Qt (for example due to out of memory) is to exit the event loop and do
+ some cleanup before exiting the application.
+
+ Typical use case:
+
+ \code
+ QApplication app(argc, argv);
+ ...
+ try {
+ app.exec();
+ } catch (const std::bad_alloc &) {
+ // clean up here, e.g. save the session
+ // and close all config files.
+
+ return 0; // exit the application
+ }
+ \endcode
+
+ After an exception is thrown, the connection to the windowing server
+ might already be closed. It is not safe to call a GUI related function
+ after catching an exception.
+
+ \section1 Platform-Specific Exception Handling
+
+ \section2 Symbian (Qt for S60)
+
+ The Symbian platform implements its own exception system that differs from the standard
+ C++ mechanism. When using Qt for S60, and especially when writing code to access Symbian
+ functionality directly, it may be necessary to know about the underlying implementation
+ and how it interacts with Qt.
+
+ The \l{Exception Safety with Symbian} document shows how to use the facilities provided
+ by Qt to use exceptions as safely as possible.
+*/
diff --git a/doc/src/exportedfunctions.qdoc b/doc/src/exportedfunctions.qdoc
deleted file mode 100644
index 5fa6295..0000000
--- a/doc/src/exportedfunctions.qdoc
+++ /dev/null
@@ -1,136 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page exportedfunctions.html
- \title Special-Purpose Global Functions Exported by Qt
- \ingroup classlists
-
- Qt provides a few low-level global functions for fine-tuning
- applications. Most of these perform very specific tasks and are
- platform-specific. In general, we recommend that you try using
- Qt's public API before resorting to using any functions mentioned
- here.
-
- These functions are exported by \l QtCore and \l QtGui, but most
- of them aren't declared in Qt's header files. To use them in your
- application, you must declare them before calling them. For
- example:
-
- \snippet doc/src/snippets/code/doc_src_exportedfunctions.qdoc 0
-
- These functions will remain as part of Qt for the lifetime of Qt
- 4.
-
- Functions:
-
- \tableofcontents
-
- \section1 void qt_set_library_config_file(const QString &\e{fileName})
-
- Specifies the location of the Qt configuration file. You must
- call this function before constructing a QApplication or
- QCoreApplication object. If no location is specified, Qt
- automatically finds an appropriate location.
-
- \section1 void qt_set_sequence_auto_mnemonic(bool \e{enable})
-
- Specifies whether mnemonics for menu items, labels, etc., should
- be honored or not. On Windows and X11, this feature is
- on by default; on Mac OS X, it is off. When this feature is off,
- the QKeySequence::mnemonic() function always returns an empty
- string. This feature is also enabled on embedded Linux.
-
- \section1 void qt_x11_wait_for_window_manager(QWidget *\e{widget})
-
- Blocks until the X11 window manager has shown the widget after a
- call to QWidget::show().
-
- \section1 void qt_mac_secure_keyboard(bool \e{enable})
-
- Turns the Mac OS X secure keyboard feature on or off. QLineEdit
- uses this when the echo mode is QLineEdit::Password or
- QLineEdit::NoEcho to guard the editor against keyboard sniffing.
- If you implement your own password editor, you might want to turn
- on this feature in your editor's
- \l{QWidget::focusInEvent()}{focusInEvent()} and turn it off in
- \l{QWidget::focusOutEvent()}{focusOutEvent()}.
-
- \section1 void qt_mac_set_dock_menu(QMenu *\e{menu})
-
- Sets the menu to display in the Mac OS X Dock for the
- application. This menu is shown when the user attempts a
- press-and-hold operation on the application's dock icon or
- \key{Ctrl}-clicks on it while the application is running.
-
- The menu will be turned into a Mac menu and the items added to the default
- Dock menu. There is no merging of the Qt menu items with the items that are
- in the Dock menu (i.e., it is not recommended to include actions that
- duplicate functionality of items already in the Dock menu).
-
- \section1 void qt_mac_set_menubar_icons(bool \e{enable})
-
- Specifies whether icons associated to menu items for the
- application's menu bar should be shown on Mac OS X. By default,
- icons are shown on Mac OS X just like on the other platforms.
-
- In Qt 4.4, this is equivalent to
- \c { QApplication::instance()->setAttribute(Qt::AA_DontShowIconsInMenus); }.
-
- \section1 void qt_mac_set_menubar_merge(bool \e{enable})
-
- Specifies whether Qt should attempt to relocate standard menu
- items (such as \gui Quit, \gui Preferences, and \gui About) to
- the application menu on Mac OS X. This feature is on by default.
- See \l{Qt for Mac OS X - Specific Issues} for the list of menu items for
- which this applies.
-
- \section1 void qt_mac_set_native_menubar(bool \e{enable})
-
- Specifies whether the application should use the native menu bar
- on Mac OS X or be part of the main window. This feature is on by
- default.
-
- \section1 void qt_mac_set_press_and_hold_context(bool \e{enable})
-
- Turns emulation of the right mouse button by clicking and holding
- the left mouse button on or off. This feature is off by default.
-*/
diff --git a/doc/src/external-resources.qdoc b/doc/src/external-resources.qdoc
index 25fce15..313649f 100644
--- a/doc/src/external-resources.qdoc
+++ b/doc/src/external-resources.qdoc
@@ -334,6 +334,16 @@
*/
/*!
+ \externalpage http://www.w3.org/TR/scxml/
+ \title State Chart XML: State Machine Notation for Control Abstraction
+*/
+
+/*!
+ \externalpage http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf
+ \title Statecharts: A visual formalism for complex systems
+*/
+
+/*!
\externalpage http://www.gnu.org/licenses/gpl.html
\title GNU General Public License
*/
diff --git a/doc/src/files-and-resources/datastreamformat.qdoc b/doc/src/files-and-resources/datastreamformat.qdoc
new file mode 100644
index 0000000..6eaf606
--- /dev/null
+++ b/doc/src/files-and-resources/datastreamformat.qdoc
@@ -0,0 +1,363 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page datastreamformat.html
+ \title Format of the QDataStream Operators
+ \brief Representations of data types that can be serialized by QDataStream.
+
+ The \l QDataStream allows you to serialize some of the Qt data types.
+ The table below lists the data types that QDataStream can serialize
+ and how they are represented. The format described below is
+ \l{QDataStream::setVersion()}{version 8}.
+
+ It is always best to cast integers to a Qt integer type, such as
+ qint16 or quint32, when reading and writing. This ensures that
+ you always know exactly what size integers you are reading and
+ writing, no matter what the underlying platform and architecture
+ the application happens to be running on.
+
+ \table
+ \row \o bool
+ \o \list
+ \o boolean
+ \endlist
+ \row \o qint8
+ \o \list
+ \o signed byte
+ \endlist
+ \row \o qint16
+ \o \list
+ \o signed 16-bit integer
+ \endlist
+ \row \o qint32
+ \o \list
+ \o signed 32-bit integer
+ \endlist
+ \row \o qint64
+ \o \list
+ \o signed 64-bit integer
+ \endlist
+ \row \o quint8
+ \o \list
+ \o unsigned byte
+ \endlist
+ \row \o quint16
+ \o \list
+ \o unsigned 16-bit integer
+ \endlist
+ \row \o quint32
+ \o \list
+ \o unsigned 32-bit integer
+ \endlist
+ \row \o quint64
+ \o \list
+ \o unsigned 64-bit integer
+ \endlist
+ \row \o \c float
+ \o \list
+ \o 32-bit floating point number using the standard IEEE 754 format
+ \endlist
+ \row \o \c double
+ \o \list
+ \o 64-bit floating point number using the standard IEEE 754 format
+ \endlist
+ \row \o \c {const char *}
+ \o \list
+ \o The string length (quint32)
+ \o The string bytes, excluding the terminating 0
+ \endlist
+ \row \o QBitArray
+ \o \list
+ \o The array size (quint32)
+ \o The array bits, i.e. (size + 7)/8 bytes
+ \endlist
+ \row \o QBrush
+ \o \list
+ \o The brush style (quint8)
+ \o The brush color (QColor)
+ \o If style is CustomPattern, the brush pixmap (QPixmap)
+ \endlist
+ \row \o QByteArray
+ \o \list
+ \o If the byte array is null: 0xFFFFFFFF (quint32)
+ \o Otherwise: the array size (quint32) followed by the array bytes, i.e. size bytes
+ \endlist
+ \row \o \l QColor
+ \o \list
+ \o Color spec (qint8)
+ \o Alpha value (quint16)
+ \o Red value (quint16)
+ \o Green value (quint16)
+ \o Blue value (quint16)
+ \o Pad value (quint16)
+ \endlist
+ \row \o QCursor
+ \o \list
+ \o Shape ID (qint16)
+ \o If shape is BitmapCursor: The bitmap (QPixmap), mask (QPixmap), and hot spot (QPoint)
+ \endlist
+ \row \o QDate
+ \o \list
+ \o Julian day (quint32)
+ \endlist
+ \row \o QDateTime
+ \o \list
+ \o Date (QDate)
+ \o Time (QTime)
+ \o 0 for Qt::LocalTime, 1 for Qt::UTC (quint8)
+ \endlist
+ \row \o QFont
+ \o \list
+ \o The family (QString)
+ \o The point size (qint16)
+ \o The style hint (quint8)
+ \o The char set (quint8)
+ \o The weight (quint8)
+ \o The font bits (quint8)
+ \endlist
+ \row \o QHash<Key, T>
+ \o \list
+ \o The number of items (quint32)
+ \o For all items, the key (Key) and value (T)
+ \endlist
+ \row \o QIcon
+ \o \list
+ \o The number of pixmap entries (quint32)
+ \o For all pixmap entries:
+ \list
+ \o The pixmap (QPixmap)
+ \o The file name (QString)
+ \o The pixmap size (QSize)
+ \o The \l{QIcon::Mode}{mode} (quint32)
+ \o The \l{QIcon::State}{state} (quint32)
+ \endlist
+ \endlist
+ \row \o QImage
+ \o \list
+ \o If the image is null a "null image" marker is saved;
+ otherwise the image is saved in PNG or BMP format (depending
+ on the stream version). If you want control of the format,
+ stream the image into a QBuffer (using QImageIO) and stream
+ that.
+ \endlist
+ \row \o QKeySequence
+ \o \list
+ \o A QList<int>, where each integer is a key in the key sequence
+ \endlist
+ \row \o QLinkedList<T>
+ \o \list
+ \o The number of items (quint32)
+ \o The items (T)
+ \endlist
+ \row \o QList<T>
+ \o \list
+ \o The number of items (quint32)
+ \o The items (T)
+ \endlist
+ \row \o QMap<Key, T>
+ \o \list
+ \o The number of items (quint32)
+ \o For all items, the key (Key) and value (T)
+ \endlist
+ \row \o QMatrix
+ \o \list
+ \o m11 (double)
+ \o m12 (double)
+ \o m21 (double)
+ \o m22 (double)
+ \o dx (double)
+ \o dy (double)
+ \endlist
+ \row \o QMatrix4x4
+ \o \list
+ \o m11 (double)
+ \o m12 (double)
+ \o m13 (double)
+ \o m14 (double)
+ \o m21 (double)
+ \o m22 (double)
+ \o m23 (double)
+ \o m24 (double)
+ \o m31 (double)
+ \o m32 (double)
+ \o m33 (double)
+ \o m34 (double)
+ \o m41 (double)
+ \o m42 (double)
+ \o m43 (double)
+ \o m44 (double)
+ \endlist
+ \row \o QPair<T1, T2>
+ \o \list
+ \o first (T1)
+ \o second (T2)
+ \endlist
+ \row \o QPalette
+ \o The disabled, active, and inactive color groups, each of which consists
+ of the following:
+ \list
+ \o foreground (QBrush)
+ \o button (QBrush)
+ \o light (QBrush)
+ \o midlight (QBrush)
+ \o dark (QBrush)
+ \o mid (QBrush)
+ \o text (QBrush)
+ \o brightText (QBrush)
+ \o buttonText (QBrush)
+ \o base (QBrush)
+ \o background (QBrush)
+ \o shadow (QBrush)
+ \o highlight (QBrush)
+ \o highlightedText (QBrush)
+ \o link (QBrush)
+ \o linkVisited (QBrush)
+ \endlist
+ \row \o QPen
+ \o \list
+ \o The pen styles (quint8)
+ \o The pen width (quint16)
+ \o The pen color (QColor)
+ \endlist
+ \row \o QPicture
+ \o \list
+ \o The size of the picture data (quint32)
+ \o The raw bytes of picture data (char)
+ \endlist
+ \row \o QPixmap
+ \o \list
+ \o Save it as a PNG image.
+ \endlist
+ \row \o QPoint
+ \o \list
+ \o The x coordinate (qint32)
+ \o The y coordinate (qint32)
+ \endlist
+ \row \o QQuaternion
+ \o \list
+ \o The scalar component (double)
+ \o The x coordinate (double)
+ \o The y coordinate (double)
+ \o The z coordinate (double)
+ \endlist
+ \row \o QRect
+ \o \list
+ \o left (qint32)
+ \o top (qint32)
+ \o right (qint32)
+ \o bottom (qint32)
+ \endlist
+ \row \o QRegExp
+ \o \list
+ \o The regexp pattern (QString)
+ \o Case sensitivity (quint8)
+ \o Regular expression syntax (quint8)
+ \o Minimal matching (quint8)
+ \endlist
+ \row \o QRegion
+ \o \list
+ \o The size of the data, i.e. 8 + 16 * (number of rectangles) (quint32)
+ \o 10 (qint32)
+ \o The number of rectangles (quint32)
+ \o The rectangles in sequential order (QRect)
+ \endlist
+ \row \o QSize
+ \o \list
+ \o width (qint32)
+ \o height (qint32)
+ \endlist
+ \row \o QString
+ \o \list
+ \o If the string is null: 0xFFFFFFFF (quint32)
+ \o Otherwise: The string length in bytes (quint32) followed by the data in UTF-16
+ \endlist
+ \row \o QTime
+ \o \list
+ \o Milliseconds since midnight (quint32)
+ \endlist
+ \row \o QTransform
+ \o \list
+ \o m11 (double)
+ \o m12 (double)
+ \o m13 (double)
+ \o m21 (double)
+ \o m22 (double)
+ \o m23 (double)
+ \o m31 (double)
+ \o m32 (double)
+ \o m33 (double)
+ \endlist
+ \row \o QUrl
+ \o \list
+ \o Holds an URL (QString)
+ \endlist
+ \row \o QVariant
+ \o \list
+ \o The type of the data (quint32)
+ \o The null flag (qint8)
+ \o The data of the specified type
+ \endlist
+ \row \o QVector2D
+ \o \list
+ \o the x coordinate (double)
+ \o the y coordinate (double)
+ \endlist
+ \row \o QVector3D
+ \o \list
+ \o the x coordinate (double)
+ \o the y coordinate (double)
+ \o the z coordinate (double)
+ \endlist
+ \row \o QVector4D
+ \o \list
+ \o the x coordinate (double)
+ \o the y coordinate (double)
+ \o the z coordinate (double)
+ \o the w coordinate (double)
+ \endlist
+ \row \o QVector<T>
+ \o \list
+ \o The number of items (quint32)
+ \o The items (T)
+ \endlist
+ \endtable
+*/
diff --git a/doc/src/files-and-resources/resources.qdoc b/doc/src/files-and-resources/resources.qdoc
new file mode 100644
index 0000000..3e39b19
--- /dev/null
+++ b/doc/src/files-and-resources/resources.qdoc
@@ -0,0 +1,203 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group io
+ \title Input/Output and Networking
+ \ingroup groups
+
+ \brief Classes providing file input and output along with directory and
+ network handling.
+
+ These classes are used to handle input and output to and from external
+ devices, processes, files etc. as well as manipulating files and directories.
+*/
+
+/*!
+ \page resources.html
+ \title The Qt Resource System
+
+ \keyword resource system
+
+ The Qt resource system is a platform-independent mechanism for
+ storing binary files in the application's executable. This is
+ useful if your application always needs a certain set of files
+ (icons, translation files, etc.) and you don't want to run the
+ risk of losing the files.
+
+ The resource system is based on tight cooperation between \l qmake,
+ \l rcc (Qt's resource compiler), and QFile. It obsoletes Qt 3's
+ \c qembed tool and the
+ \l{http://qt.nokia.com/doc/qq/qq05-iconography.html#imagestorage}{image
+ collection} mechanism.
+
+ \section1 Resource Collection Files (\c{.qrc})
+
+ The resources associated with an application are specified in a
+ \c .qrc file, an XML-based file format that lists files on the
+ disk and optionally assigns them a resource name that the
+ application must use to access the resource.
+
+ Here's an example \c .qrc file:
+
+ \quotefile mainwindows/application/application.qrc
+
+ The resource files listed in the \c .qrc file are files that are
+ part of the application's source tree. The specified paths are
+ relative to the directory containing the \c .qrc file. Note that
+ the listed resource files must be located in the same directory as
+ the \c .qrc file, or one of its subdirectories.
+
+ Resource data can either be compiled into the binary and thus accessed
+ immediately in application code, or a binary resource can be created
+ and at a later point in application code registered with the resource
+ system.
+
+ By default, resources are accessible in the application under the
+ same name as they have in the source tree, with a \c :/ prefix.
+ For example, the path \c :/images/cut.png would give access to the
+ \c cut.png file, whose location in the application's source tree
+ is \c images/cut.png. This can be changed using the \c file tag's
+ \c alias attribute:
+
+ \snippet doc/src/snippets/code/doc_src_resources.qdoc 0
+
+ The file is then accessible as \c :/cut-img.png from the
+ application. It is also possible to specify a path prefix for all
+ files in the \c .qrc file using the \c qresource tag's \c prefix
+ attribute:
+
+ \snippet doc/src/snippets/code/doc_src_resources.qdoc 1
+
+ In this case, the file is accessible as \c
+ :/myresources/cut-img.png.
+
+ Some resources, such as translation files and icons, many need to
+ change based on the user's locale. This is done by adding a \c lang
+ attribute to the \c qresource tag, specifying a suitable locale
+ string. For example:
+
+ \snippet doc/src/snippets/code/doc_src_resources.qdoc 2
+
+ If the user's locale is French (i.e., QLocale::system().name() returns
+ "fr_FR"), \c :/cut.jpg becomes a reference to the \c cut_fr.jpg
+ image. For other locales, \c cut.jpg is used.
+
+ See the QLocale documentation for a description of the format to use
+ for locale strings.
+
+
+ \section2 External Binary Resources
+
+ For an external binary resource to be created you must create the resource
+ data (commonly given the \c .rcc extension) by passing the -binary switch to
+ \l rcc. Once the binary resource is created you can register the resource
+ with the QResource API.
+
+ For example, a set of resource data specified in a \c .qrc file can be
+ compiled in the following way:
+
+ \snippet doc/src/snippets/code/doc_src_resources.qdoc 3
+
+ In the application, this resource would be registered with code like this:
+
+ \snippet doc/src/snippets/code/doc_src_resources.qdoc 4
+
+ \section2 Compiled-In Resources
+
+ For a resource to be compiled into the binary the \c .qrc file must be
+ mentioned in the application's \c .pro file so that \c qmake knows
+ about it. For example:
+
+ \snippet examples/mainwindows/application/application.pro 0
+
+ \c qmake will produce make rules to generate a file called \c
+ qrc_application.cpp that is linked into the application. This
+ file contains all the data for the images and other resources as
+ static C++ arrays of compressed binary data. The \c
+ qrc_application.cpp file is automatically regenerated whenever
+ the \c .qrc file changes or one of the files that it refers to
+ changes. If you don't use \c .pro files, you can either invoke
+ \c rcc manually or add build rules to your build system.
+
+ \image resources.png Building resources into an application
+
+ Currently, Qt always stores the data directly in the executable,
+ even on Windows and Mac OS X, where the operating system provides
+ native support for resources. This might change in a future Qt
+ release.
+
+ \section1 Using Resources in the Application
+
+ In the application, resource paths can be used in most places
+ instead of ordinary file system paths. In particular, you can
+ pass a resource path instead of a file name to the QIcon, QImage,
+ or QPixmap constructor:
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 21
+
+ See the \l{mainwindows/application}{Application} example for an
+ actual application that uses Qt's resource system to store its
+ icons.
+
+ In memory, resources are represented by a tree of resource
+ objects. The tree is automatically built at startup and used by
+ QFile for resolving paths to resources. You can use a QDir initialized
+ with ":/" to navigate through the resource tree from the root.
+
+ Qt's resources support the concept of a search path list. If you then
+ refer to a resource with \c : instead of \c :/ as the prefix, the
+ resource will be looked up using the search path list. The search
+ path list is empty at startup; call QDir::addSearchPath() to
+ add paths to it.
+
+ If you have resources in a static library, you might need to
+ force initialization of your resources by calling \l
+ Q_INIT_RESOURCE() with the base name of the \c .qrc file. For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_resources.qdoc 5
+
+ Similarly, if you must unload a set of resources explicitly
+ (because a plugin is being unloaded or the resources are not valid
+ any longer), you can force removal of your resources by calling
+ Q_CLEANUP_RESOURCE() with the same base name as above.
+*/
diff --git a/doc/src/focus.qdoc b/doc/src/focus.qdoc
deleted file mode 100644
index b5d0af6..0000000
--- a/doc/src/focus.qdoc
+++ /dev/null
@@ -1,213 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Documentation of focus handling in Qt.
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \page focus.html
- \title Keyboard Focus
- \ingroup architecture
- \ingroup gui-programming
- \brief An overview of the keyboard focus management and handling.
-
- \keyword keyboard focus
-
- Qt's widgets handle keyboard focus in the ways that have become
- customary in GUIs.
-
- The basic issue is that the user's key strokes can be directed at any
- of several windows on the screen, and any of several widgets inside
- the intended window. When the user presses a key, they expect it to go
- to the right place, and the software must try to meet this
- expectation. The system must determine which application the key stroke
- is directed at, which window within that application, and which widget
- within that window.
-
- \section1 Focus Motion
-
- The customs which have evolved for directing keyboard focus to a
- particular widget are these:
-
- \list 1
-
- \o The user presses \key Tab (or \key Shift+Tab).
- \o The user clicks a widget.
- \o The user presses a keyboard shortcut.
- \o The user uses the mouse wheel.
- \o The user moves the focus to a window, and the application must
- determine which widget within the window should get the focus.
- \endlist
-
- Each of these motion mechanisms is different, and different types of
- widgets receive focus in only some of them. We'll cover each of them
- in turn.
-
- \section2 Tab or Shift+Tab
-
- Pressing \key Tab is by far the most common way to move focus
- using the keyboard. (Sometimes in data-entry applications Enter
- does the same as \key{Tab}; this can easily be achieved in Qt by
- implementing an \l{Events and Event Filters}{event filter}.)
-
- Pressing \key Tab, in all window systems in common use today,
- moves the keyboard focus to the next widget in a circular
- per-window list. \key Tab moves focus along the circular list in
- one direction, \key Shift+Tab in the other. The order in which
- \key Tab presses move from widget to widget is called the tab order.
-
- You can customize the tab order using QWidget::setTabOrder(). (If
- you don't, \key Tab generally moves focus in the order of widget
- construction.) \l{Qt Designer} provides a means of visually
- changing the tab order.
-
- Since pressing \key Tab is so common, most widgets that can have focus
- should support tab focus. The major exception is widgets that are
- rarely used, and where there is some keyboard accelerator or error
- handler that moves the focus.
-
- For example, in a data entry dialog, there might be a field that
- is only necessary in one per cent of all cases. In such a dialog,
- \key Tab could skip this field, and the dialog could use one of
- these mechanisms:
-
- \list 1
-
- \o If the program can determine whether the field is needed, it can
- move focus there when the user finishes entry and presses \gui OK, or when
- the user presses Enter after finishing the other fields. Alternately,
- include the field in the tab order but disable it. Enable it if it
- becomes appropriate in view of what the user has set in the other
- fields.
-
- \o The label for the field can include a keyboard shortcut that moves
- focus to this field.
-
- \endlist
-
- Another exception to \key Tab support is text-entry widgets that
- must support the insertion of tabs; almost all text editors fall
- into this class. Qt treats \key Ctrl+Tab as \key Tab and \key
- Ctrl+Shift+Tab as \key Shift+Tab, and such widgets can
- reimplement QWidget::event() and handle Tab before calling
- QWidget::event() to get normal processing of all other keys.
- However, since some systems use \key Ctrl+Tab for other purposes,
- and many users aren't aware of \key Ctrl+Tab anyway, this isn't a
- complete solution.
-
- \section2 The User Clicks a Widget
-
- This is perhaps even more common than pressing \key Tab on
- computers with a mouse or other pointing device.
-
- Clicking to move the focus is slightly more powerful than \key
- Tab. While it moves the focus \e to a widget, for editor widgets
- it also moves the text cursor (the widget's internal focus) to
- the spot where the mouse is clicked.
-
- Since it is so common and people are used to it, it's a good idea to
- support it for most widgets. However, there is also an important
- reason to avoid it: you may not want to remove focus from the widget
- where it was.
-
- For example, in a word processor, when the user clicks the 'B' (bold)
- tool button, what should happen to the keyboard focus? Should it
- remain where it was, almost certainly in the editing widget, or should
- it move to the 'B' button?
-
- We advise supporting click-to-focus for widgets that support text
- entry, and to avoid it for most widgets where a mouse click has a
- different effect. (For buttons, we also recommend adding a keyboard
- shortcut: QAbstractButton and its subclasses make this very easy.)
-
- In Qt, only the QWidget::setFocusPolicy() function affects
- click-to-focus.
-
- \section2 The User Presses a Keyboard Shortcut
-
- It's not unusual for keyboard shortcuts to move the focus. This
- can happen implicitly by opening modal dialogs, but also
- explicitly using focus accelerators such as those provided by
- QLabel::setBuddy(), QGroupBox, and QTabBar.
-
- We advise supporting shortcut focus for all widgets that the user
- may want to jump to. For example, a tab dialog can have keyboard
- shortcuts for each of its pages, so the user can press e.g. \key
- Alt+P to step to the \underline{P}rinting page. It is easy to
- overdo this: there are only a few keys, and it's also important
- to provide keyboard shortcuts for commands. \key Alt+P is also
- used for Paste, Play, Print, and Print Here in the \l{Standard
- Accelerator Keys} list, for example.
-
- \section2 The User Rotates the Mouse Wheel
-
- On Microsoft Windows, mouse wheel usage is always handled by the
- widget that has keyboard focus. On Mac OS X and X11, it's handled by
- the widget that gets other mouse events.
-
- The way Qt handles this platform difference is by letting widgets move
- the keyboard focus when the wheel is used. With the right focus policy
- on each widget, applications can work idiomatically correctly on
- Windows, Mac OS X, and X11.
-
- \section2 The User Moves the Focus to This Window
-
- In this situation the application must determine which widget within
- the window should receive the focus.
-
- This can be simple: If the focus has been in this window before,
- then the last widget to have focus should regain it. Qt does this
- automatically.
-
- If focus has never been in this window before and you know where
- focus should start out, call QWidget::setFocus() on the widget
- which should receive focus before you call QWidget::show() it. If
- you don't, Qt will pick a suitable widget.
-*/
diff --git a/doc/src/frameworks-technologies/accessible.qdoc b/doc/src/frameworks-technologies/accessible.qdoc
new file mode 100644
index 0000000..3e43532
--- /dev/null
+++ b/doc/src/frameworks-technologies/accessible.qdoc
@@ -0,0 +1,624 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group accessibility
+ \title Accessibility Classes
+*/
+
+/*!
+ \page accessible.html
+ \title Accessibility
+
+ \ingroup frameworks-technologies
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ Accessibility in computer software is making applications usable
+ for people with disabilities. This could be achieved by providing
+ keyboard shortcuts, a high-contrast user interface that uses
+ specially selected colors and fonts, or support for assistive tools
+ such as screen readers and braille displays.
+
+ An application does not usually communicate directly with
+ assistive tools but through an assistive technology, which is a
+ bridge for exchange of information between the applications and
+ the tools. Information about user interface elements, such
+ as buttons and scroll bars, is exposed to the assistive technologies.
+ Qt supports Microsoft Active Accessibility (MSAA) on Windows and
+ Mac OS X Accessibility on Mac OS X.
+ On Unix/X11, support is preliminary. The individual technologies
+ are abstracted from Qt, and there is only a single interface to
+ consider. We will use MSAA throughout this document when we need
+ to address technology related issues.
+
+ In this overview document, we will examine the overall Qt
+ accessibility architecture, and how to implement accessibility for
+ custom widgets and elements.
+
+ \section1 Architecture
+
+ Providing accessibility is a collaboration between accessibility
+ compliant applications, the assistive technology, and the
+ assistive tools.
+
+ \image accessibilityarchitecture.png
+
+ Accessibility compliant applications are called AT-Servers while
+ assistive tools are called AT-Clients. A Qt application will
+ typically be an AT-Server, but specialized programs might also
+ function like AT-Clients. We will refer to clients and servers
+ when talking about AT-Clients and AT-Servers in the rest of this
+ document.
+
+ We will from now on focus on the Qt accessibility interface and
+ how it is implemented to create Qt applications that support
+ accessibility.
+
+ \section2 Accessibility in Qt
+
+ These classes provide support for accessible applications.
+
+ \annotatedlist accessibility
+
+ When we communicate with the assistive technologies, we need to
+ describe Qt's user interface in a way that they can understand. Qt
+ applications use QAccessibleInterface to expose information about the
+ individual UI elements. Currently, Qt provides support for its widgets
+ and widget parts, e.g., slider handles, but the interface could
+ also be implemented for any QObject if necessary. QAccessible
+ contains enums that describe the UI. The description is mainly
+ based on MSAA and is independent of Qt. We will examine the enums
+ in the course of this document.
+
+ The structure of the UI is represented as a tree of
+ QAccessibleInterface subclasses. You can think of this as a
+ representation of a UI like the QObject tree built by Qt. Objects
+ can be widgets or widget parts (such as scroll bar handles). We
+ examine the tree in detail in the next section.
+
+ Servers notify clients through \l{QAccessible::}{updateAccessibility()}
+ about changes in objects by sending events, and the clients
+ register to receive the events. The available events are defined
+ by the QAccessible::Event enum. The clients may then query for
+ the object that generated the event through
+ QAccessible::queryAccessibleInterface().
+
+ Three of the enums in QAccessible help clients query and alter
+ accessible objects:
+
+ \list
+ \o \l{QAccessible::}{Role}: Describes the role the object
+ fills in the user interface, e.g., if it is a main
+ window, a text caret, or a cell in an item view.
+ \o \l{QAccessible::}{Action}: The actions that the
+ clients can perform on the objects, e.g., pushing a
+ button.
+ \o \l{QAccessible::}{Relation}: Describes the relationship
+ between objects in the object tree.
+ This is used for navigation.
+ \endlist
+
+ The clients also have some possibilities to get the content of
+ objects, e.g., a button's text; the object provides strings
+ defined by the QAccessible::Text enum, that give information
+ about content.
+
+ The objects can be in a number of different states as defined by
+ the \l{QAccessible::}{State} enum. Examples of states are whether
+ the object is disabled, if it has focus, or if it provides a pop-up
+ menu.
+
+ \section2 The Accessible Object Tree
+
+ As mentioned, a tree structure is built from the accessible
+ objects of an application. By navigating through the tree, the
+ clients can access all elements in the UI. Object relations give
+ clients information about the UI. For instance, a slider handle is
+ a child of the slider to which it belongs. QAccessible::Relation
+ describes the various relationships the clients can ask objects
+ for.
+
+ Note that there are no direct mapping between the Qt QObject tree
+ and the accessible object tree. For instance, scroll bar handles
+ are accessible objects but are not widgets or objects in Qt.
+
+ AT-Clients have access to the accessibility object tree through
+ the root object in the tree, which is the QApplication. They can
+ query other objects through QAccessible::navigate(), which fetches
+ objects based on \l{QAccessible::}{Relation}s. The children of any
+ node is 1-based numbered. The child numbered 0 is the object
+ itself. The children of all interfaces are numbered this way,
+ i.e., it is not a fixed numbering from the root node in the entire
+ tree.
+
+ Qt provides accessible interfaces for its widgets. Interfaces for
+ any QObject subclass can be requested through
+ QAccessible::queryInterface(). A default implementation is
+ provided if a more specialized interface is not defined. An
+ AT-Client cannot acquire an interface for accessible objects that
+ do not have an equivalent QObject, e.g., scroll bar handles, but
+ they appear as normal objects through interfaces of parent
+ accessible objects, e.g., you can query their relationships with
+ QAccessible::relationTo().
+
+ To illustrate, we present an image of an accessible object tree.
+ Beneath the tree is a table with examples of object relationships.
+
+ \image accessibleobjecttree.png
+
+ The labels in top-down order are: the QAccessibleInterface class
+ name, the widget for which an interface is provided, and the
+ \l{QAccessible::}{Role} of the object. The Position, PageLeft and
+ PageRight correspond to the slider handle, the slider groove left
+ and the slider groove right, respectively. These accessible objects
+ do not have an equivalent QObject.
+
+ \table 40%
+ \header
+ \o Source Object
+ \o Target Object
+ \o Relation
+ \row
+ \o Slider
+ \o Indicator
+ \o Controller
+ \row
+ \o Indicator
+ \o Slider
+ \o Controlled
+ \row
+ \o Slider
+ \o Application
+ \o Ancestor
+ \row
+ \o Application
+ \o Slider
+ \o Child
+ \row
+ \o PushButton
+ \o Indicator
+ \o Sibling
+ \endtable
+
+ \section2 The Static QAccessible Functions
+
+ The accessibility is managed by QAccessible's static functions,
+ which we will examine shortly. They produce QAccessible
+ interfaces, build the object tree, and initiate the connection
+ with MSAA or the other platform specific technologies. If you are
+ only interested in learning how to make your application
+ accessible, you can safely skip over this section to
+ \l{Implementing Accessibility}.
+
+ The communication between clients and the server is initiated when
+ \l{QAccessible::}{setRootObject()} is called. This is done when
+ the QApplication instance is instantiated and you should not have
+ to do this yourself.
+
+ When a QObject calls \l{QAccessible::}{updateAccessibility()},
+ clients that are listening to events are notified of the
+ change. The function is used to post events to the assistive
+ technology, and accessible \l{QAccessible::Event}{events} are
+ posted by \l{QAccessible::}{updateAccessibility()}.
+
+ \l{QAccessible::}{queryAccessibleInterface()} returns accessible
+ interfaces for \l{QObject}s. All widgets in Qt provide interfaces;
+ if you need interfaces to control the behavior of other \l{QObject}
+ subclasses, you must implement the interfaces yourself, although
+ the QAccessibleObject convenience class implements parts of the
+ functionality for you.
+
+ The factory that produces accessibility interfaces for QObjects is
+ a function of type QAccessible::InterfaceFactory. It is possible
+ to have several factories installed. The last factory installed
+ will be the first to be asked for interfaces.
+ \l{QAccessible::}{queryAccessibleInterface()} uses the factories
+ to create interfaces for \l{QObject}s. Normally, you need not be
+ concerned about factories because you can implement plugins that
+ produce interfaces. We will give examples of both approaches
+ later.
+
+ \section2 Enabling Accessibility Support
+
+ By default, Qt applications are run with accessibility support
+ enabled on Windows and Mac OS X. On Unix/X11 platforms, applications
+ must be launched in an environment with the \c QT_ACCESSIBILITY
+ variable set to 1. For example, this is set in the following way with
+ the bash shell:
+
+ \snippet doc/src/snippets/code/doc_src_qt4-accessibility.qdoc environment
+
+ Accessibility features are built into Qt by default when the libraries
+ are configured and built.
+
+ \section1 Implementing Accessibility
+
+ To provide accessibility support for a widget or other user
+ interface element, you need to implement the QAccessibleInterface
+ and distribute it in a QAccessiblePlugin. It is also possible to
+ compile the interface into the application and provide a
+ QAccessible::InterfaceFactory for it. The factory can be used if
+ you link statically or do not want the added complexity of
+ plugins. This can be an advantage if you, for instance, are
+ delivering a 3-rd party library.
+
+ All widgets and other user interface elements should have
+ interfaces and plugins. If you want your application to support
+ accessibility, you will need to consider the following:
+
+ \list
+ \o Qt already implements accessibility for its own widgets.
+ We therefore recommend that you use Qt widgets where possible.
+ \o A QAccessibleInterface needs to be implemented for each element
+ that you want to make available to accessibility clients.
+ \o You need to send accessibility events from the custom
+ user interface elements that you implement.
+ \endlist
+
+ In general, it is recommended that you are somewhat familiar with
+ MSAA, which Qt's accessibility support originally was built for.
+ You should also study the enum values of QAccessible, which
+ describe the roles, actions, relationships, and events that you
+ need to consider.
+
+ Note that you can examine how Qt's widgets implement their
+ accessibility. One major problem with the MSAA standard is that
+ interfaces are often implemented in an inconsistent way. This
+ makes life difficult for clients and often leads to guesswork on
+ object functionality.
+
+ It is possible to implement interfaces by inheriting
+ QAccessibleInterface and implementing its pure virtual functions.
+ In practice, however, it is usually preferable to inherit
+ QAccessibleObject or QAccessibleWidget, which implement part of
+ the functionality for you. In the next section, we will see an
+ example of implementing accessibility for a widget by inheriting
+ the QAccessibleWidget class.
+
+ \section2 The QAccessibleObject and QAccessibleWidget Convenience Classes
+
+ When implementing an accessibility interface for widgets, one would
+ as a rule inherit QAccessibleWidget, which is a convenience class
+ for widgets. Another available convenience class, which is
+ inherited by QAccessibleWidget, is the QAccessibleObject, which
+ implements part of the interface for QObjects.
+
+ The QAccessibleWidget provides the following functionality:
+
+ \list
+ \o It handles the navigation of the tree and
+ hit testing of the objects.
+ \o It handles events, roles, and actions that are common for all
+ \l{QWidget}s.
+ \o It handles action and methods that can be performed on
+ all widgets.
+ \o It calculates bounding rectangles with
+ \l{QAccessibleInterface::}{rect()}.
+ \o It gives \l{QAccessibleInterface::}{text()} strings that are
+ appropriate for a generic widget.
+ \o It sets the \l{QAccessible::State}{states} that
+ are common for all widgets.
+ \endlist
+
+ \section2 QAccessibleWidget Example
+
+ Instead of creating a custom widget and implementing an interface
+ for it, we will show how accessibility can be implemented for one of
+ Qt's standard widgets: QSlider. Making this widget accessible
+ demonstrates many of the issues that need to be faced when making
+ a custom widget accessible.
+
+ The slider is a complex control that functions as a
+ \l{QAccessible::}{Controller} for its accessible children.
+ This relationship must be known by the interface (for
+ \l{QAccessibleInterface::}{relationTo()} and
+ \l{QAccessibleInterface::}{navigate()}). This can be done
+ using a controlling signal, which is a mechanism provided by
+ QAccessibleWidget. We do this in the constructor:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 0
+
+ The choice of signal shown is not important; the same principles
+ apply to all signals that are declared in this way. Note that we
+ use QLatin1String to ensure that the signal name is correctly
+ specified.
+
+ When an accessible object is changed in a way that users need
+ to know about, it notifies clients of the change by sending them
+ an event via the accessible interface. This is how QSlider calls
+ \l{QAccessibleInterface::}{updateAccessibility()} to indicate that
+ its value has changed:
+
+ \snippet doc/src/snippets/qabstractsliderisnippet.cpp 0
+ \dots
+ \snippet doc/src/snippets/qabstractsliderisnippet.cpp 1
+ \dots
+ \snippet doc/src/snippets/qabstractsliderisnippet.cpp 2
+
+ Note that the call is made after the value of the slider has
+ changed because clients may query the new value immediately after
+ receiving the event.
+
+ The interface must be able to calculate bounding rectangles of
+ itself and any children that do not provide an interface of their
+ own. The \c QAccessibleSlider has three such children identified by
+ the private enum, \c SliderElements, which has the following values:
+ \c PageLeft (the rectangle on the left hand side of the slider
+ handle), \c PageRight (the rectangle on the right hand side of the
+ handle), and \c Position (the slider handle). Here is the
+ implementation of \l{QAccessibleInterface::}{rect()}:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 1
+ \dots
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 2
+ \dots
+
+ The first part of the function, which we have omitted, uses the
+ current \l{QStyle}{style} to calculate the slider handle's
+ bounding rectangle; it is stored in \c srect. Notice that child 0,
+ covered in the default case in the above code, is the slider itself,
+ so we can simply return the QSlider bounding rectangle obtained
+ from the superclass, which is effectively the value obtained from
+ QAccessibleWidget::rect().
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 3
+
+ Before the rectangle is returned it must be mapped to screen
+ coordinates.
+
+ The QAccessibleSlider must reimplement
+ QAccessibleInterface::childCount() since it manages children
+ without interfaces.
+
+ The \l{QAccessibleInterface::}{text()} function returns the
+ QAccessible::Text strings for the slider:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 4
+
+ The \c slider() function returns a pointer to the interface's
+ QSlider. Some values are left for the superclass's implementation.
+ Not all values are appropriate for all accessible objects, as you
+ can see for QAccessible::Value case. You should just return an
+ empty string for those values where no relevant text can be
+ provided.
+
+ The implementation of the \l{QAccessibleInterface::}{role()}
+ function is straightforward:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 5
+
+ The role function should be reimplemented by all objects and
+ describes the role of themselves and the children that do not
+ provide accessible interfaces of their own.
+
+ Next, the accessible interface needs to return the
+ \l{QAccessible::State}{states} that the slider can be in. We look
+ at parts of the \c state() implementation to show how just a few
+ of the states are handled:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 6
+ \dots
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 7
+
+ The superclass implementation of
+ \l{QAccessibleInterface::}{state()}, uses the
+ QAccessibleInterface::state() implementation. We simply need to
+ disable the buttons if the slider is at its minimum or maximum.
+
+ We have now exposed the information we have about the slider to
+ the clients. For the clients to be able to alter the slider - for
+ example, to change its value - we must provide information about
+ the actions that can be performed and perform them upon request.
+ We discuss this in the next section.
+
+ \section2 Handling Action Requests from Clients
+
+ QAccessible provides a number of \l{QAccessible::}{Action}s
+ that can be performed on request from clients. If an
+ accessible object supports actions, it should reimplement the
+ following functions from QAccessibleInterface:
+
+ \list
+ \o \l{QAccessibleInterface::}{actionText()} returns
+ strings that describe each action. The descriptions
+ to be made available are one for each
+ \l{QAccessible::}{Text} enum value.
+ \o \l{QAccessibleInterface::}{doAction()} executes requests
+ from clients to perform actions.
+ \endlist
+
+ Note that a client can request any action from an object. If
+ the object does not support the action, it returns false from
+ \l{QAccessibleInterface::}{doAction()}.
+
+ None of the standard actions take any parameters. It is possible
+ to provide user-defined actions that can take parameters.
+ The interface must then also reimplement
+ \l{QAccessibleInterface::}{userActionCount()}. Since this is not
+ defined in the MSAA specification, it is probably only useful to
+ use this if you know which specific AT-Clients will use the
+ application.
+
+ QAccessibleInterface gives another technique for clients to handle
+ accessible objects. It works basically the same way, but uses the
+ concept of methods in place of actions. The available methods are
+ defined by the QAccessible::Method enum. The following functions
+ need to be reimplemented from QAccessibleInterface if the
+ accessible object is to support methods:
+
+ \list
+ \o \l{QAccessibleInterface::}{supportedMethods()} returns
+ a QSet of \l{QAccessible::}{Method} values that are
+ supported by the object.
+ \o \l{QAccessibleInterface::}{invokeMethod()} executes
+ methods requested by clients.
+ \endlist
+
+ The action mechanism will probably be substituted by providing
+ methods in place of the standard actions.
+
+ To see examples on how to implement actions and methods, you
+ could examine the QAccessibleObject and QAccessibleWidget
+ implementations. You might also want to take a look at the
+ MSAA documentation.
+
+ \section2 Implementing Accessible Plugins
+
+ In this section we will explain the procedure of implementing
+ accessible plugins for your interfaces. A plugin is a class stored
+ in a shared library that can be loaded at run-time. It is
+ convenient to distribute interfaces as plugins since they will only
+ be loaded when required.
+
+ Creating an accessible plugin is achieved by inheriting
+ QAccessiblePlugin, reimplementing \l{QAccessiblePlugin::}{keys()}
+ and \l{QAccessiblePlugin::}{create()} from that class, and adding
+ one or two macros. The \c .pro file must be altered to use the
+ plugin template, and the library containing the plugin must be
+ placed on a path where Qt searches for accessible plugins.
+
+ We will go through the implementation of \c SliderPlugin, which is an
+ accessible plugin that produces interfaces for the
+ QAccessibleSlider we implemented in the \l{QAccessibleWidget Example}.
+ We start with the \c key() function:
+
+ \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 0
+
+ We simply need to return the class name of the single interface
+ our plugin can create an accessible interface for. A plugin
+ can support any number of classes; just add more class names
+ to the string list. We move on to the \c create() function:
+
+ \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 1
+
+ We check whether the interface requested is for the QSlider; if it
+ is, we create and return an interface for it. Note that \c object
+ will always be an instance of \c classname. You must return 0 if
+ you do not support the class.
+ \l{QAccessible::}{updateAccessibility()} checks with the
+ available accessibility plugins until it finds one that does not
+ return 0.
+
+ Finally, you need to include macros in the cpp file:
+
+ \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 2
+
+ The Q_EXPORT_PLUGIN2 macro exports the plugin in the \c
+ SliderPlugin class into the \c acc_sliderplugin library. The first
+ argument is the name of the plugin library file, excluding the
+ file suffix, and the second is the class name. For more information
+ on plugins, consult the plugins \l{How to Create Qt
+ Plugins}{overview document}.
+
+ You can omit the first macro unless you want the plugin
+ to be statically linked with the application.
+
+ \section2 Implementing Interface Factories
+
+ If you do not want to provide plugins for your accessibility
+ interfaces, you can use an interface factory
+ (QAccessible::InterfaceFactory), which is the recommended way to
+ provide accessible interfaces in a statically-linked application.
+
+ A factory is a function pointer for a function that takes the same
+ parameters as \l{QAccessiblePlugin}'s
+ \l{QAccessiblePlugin::}{create()} - a QString and a QObject. It
+ also works the same way. You install the factory with the
+ \l{QAccessible::}{installFactory()} function. We give an example
+ of how to create a factory for the \c SliderPlugin class:
+
+ \snippet doc/src/snippets/accessibilityfactorysnippet.cpp 0
+ \dots
+ \snippet doc/src/snippets/accessibilityfactorysnippet.cpp 1
+
+ \omit
+
+ \section1 Implementing Bridges for Other Assistive Technologies
+
+ An accessibility bridge provides the means for an assistive
+ technology to talk to Qt. On Windows and Mac, the built-in bridges
+ will be used. On UNIX, however, there are no built-in standard
+ assistive technology, and it might therefore be necessary to
+ implement an accessible bridge.
+
+ A bridge is implemented by inheriting QAccessibleBridge for the
+ technology to support. The class defines the interface that Qt
+ needs an assistive technology to support:
+
+ \list
+ \o A root object. This is the root in the accessible
+ object tree and is of type QAccessibleInterface.
+ \o Receive events from from accessible objects.
+ \endlist
+
+ The root object is set with the
+ \l{QAccessibleBridge::}{setRootObject()}. In the case of Qt, this
+ will always be an interface for the QApplication instance of the
+ application.
+
+ Event notification is sent through
+ \l{QAccessibleBridge::}{notifyAccessibilityUpdate()}. This
+ function is called by \l{QAccessible::}{updateAccessibility()}. Even
+ though the bridge needs only to implement these two functions, it
+ must be able to communicate the entire QAccessibleInterface to the
+ underlying technology. How this is achieved is, naturally, up to
+ the individual bridge and none of Qt's concern.
+
+ As with accessible interfaces, you distribute accessible bridges
+ in plugins. Accessible bridge plugins are subclasses of the
+ QAccessibleBridgePlugin class; the class defines the functions
+ \l{QAccessibleBridgePlugin::}{create()} and
+ \l{QAccessibleBridgePlugin::}{keys()}, which must me
+ reimplemented. If Qt finds a built-in bridge to use, it will
+ ignore any available plugins.
+
+ \endomit
+
+ \section1 Further Reading
+
+ The \l{Cross-Platform Accessibility Support in Qt 4} document contains a more
+ general overview of Qt's accessibility features and discusses how it is
+ used on each platform.
+ issues
+*/
diff --git a/doc/src/frameworks-technologies/activeqt-container.qdoc b/doc/src/frameworks-technologies/activeqt-container.qdoc
new file mode 100644
index 0000000..6791c6f
--- /dev/null
+++ b/doc/src/frameworks-technologies/activeqt-container.qdoc
@@ -0,0 +1,218 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt-container.html
+ \title Using ActiveX controls and COM objects in Qt
+
+ \brief The QAxContainer module is a Windows-only extension for
+ accessing ActiveX controls and COM objects.
+
+ The QAxContainer module is part of the \l ActiveQt framework. It
+ provides a library implementing a QWidget subclass, QAxWidget,
+ that acts as a container for ActiveX controls, and a QObject
+ subclass, QAxObject, that can be used to easily access non-visual
+ COM objects. Scripting COM objects embedded using these classes
+ is possible through the QAxScript, QAxScriptManager and
+ QAxScriptEngine classes, and a set of \l{Tools for ActiveQt}{tools}
+ makes it easy to access COM objects programmatically.
+
+ The module consists of six classes
+ \list 1
+ \o QAxBase is an abstract class that provides an API to initialize
+ and access a COM object or ActiveX control.
+ \o QAxObject provides a QObject that wraps a COM object.
+ \o QAxWidget is a QWidget that wraps an ActiveX control.
+ \o QAxScriptManager, QAxScript and QAxScriptEngine provide an
+ interface to the Windows Script Host.
+ \endlist
+
+ Some \l{ActiveQt Examples}{example applications} that use
+ standard ActiveX controls to provide high-level user interface
+ functionality are provided.
+
+ \sa {ActiveQt Framework}
+
+ Topics:
+
+ \tableofcontents
+
+ \section1 Using the Library
+
+ To build Qt applications that can host COM objects and ActiveX controls
+ link the application against the QAxContainer module by adding
+
+ \snippet doc/src/snippets/code/doc_src_qaxcontainer.qdoc 0
+
+ to your application's \c .pro file.
+
+ \section2 Distributing QAxContainer Applications
+
+ The QAxContainer library is static, so there is no need to redistribute
+ any additional files when using this module. Note however that the
+ ActiveX server binaries you are using might not be installed on the
+ target system, so you have to ship them with your package and register
+ them during the installation process of your application.
+
+ \section1 Instantiating COM Objects
+
+ To instantiate a COM object use the QAxBase::setControl() API, or pass
+ the name of the object directly into the constructor of the QAxBase
+ subclass you are using.
+
+ The control can be specified in a variety of formats, but the fastest
+ and most powerful format is to use the class ID (CLSID) of the object
+ directly. The class ID can be prepended with information about a remote
+ machine that the object should run on, and can include a license key
+ for licensed controls.
+
+ \section2 Typical Error Messages
+
+ ActiveQt prints error messages to the debug output when it
+ encounters error situations at runtime. Usually you must run
+ your program in the debugger to see these messages (e.g. in Visual
+ Studio's Debug output).
+
+ \section3 Requested control could not be instantiated
+
+ The control requested in QAxBase::setControl() is not installed
+ on this system, or is not accessible for the current user.
+
+ The control might require administrator rights, or a license key.
+ If the control is licensed, pass the license key to QAxBase::setControl
+ as documented.
+
+ \section1 Accessing the Object API
+
+ ActiveQt provides a Qt API to the COM object, and replaces COM
+ datatypes with Qt equivalents.
+
+ There are four ways to call APIs on the COM object:
+
+ \list
+ \o Generating a C++ namespace
+ \o Call-by-name
+ \o Through a script engine
+ \o Using the native COM interfaces
+ \endlist
+
+ \section2 Generating a C++ Namespace
+
+ To generate a C++ namespace for the type library you want to access,
+ use the \l dumpcpp tool. Run this tool manually on the type library you
+ want to use, or integrate it into the build system by adding the type
+ libraries to the \c TYPELIBS variable in your application's \c .pro file:
+
+ \snippet doc/src/snippets/code/doc_src_qaxcontainer.qdoc 1
+
+ Note that \l dumpcpp might not be able to expose all APIs in the type
+ library.
+
+ Include the resulting header file in your code to access the
+ object APIs through the generated C++ classes. See the
+ \l{activeqt/qutlook}{Qutlook} example for more information.
+
+ \section2 Call-by-Name
+
+ Use QAxBase::dynamicCall() and QAxBase::querySubObject() as well as
+ the QObject::setProperty() and QObject::property() APIs to call the
+ methods and properties of the COM object through their name. Use the
+ \l dumpdoc tool to get the documentation of the Qt API for any COM
+ object and its subobjects; note that not all of the COM object's APIs
+ might be available.
+
+ See the \l{activeqt/webbrowser}{Webbrowser} example for more information.
+
+ \section2 Calling Function Through a Script Engine
+
+ A Qt application can host any ActiveScript engine installed on the system.
+ The script engine can then run script code that accesses the COM objects.
+
+ To instantiate a script engine, use QAxScriptManager::addObject() to
+ register the COM objects you want to access from script, and
+ QAxScriptManager::load() to load the script code into the engine. Then
+ call the script functions using QAxScriptManager::call() or
+ QAxScript::call().
+
+ Which APIs of the COM object are available through scripting depends on
+ the script language used.
+
+ The \l{testcon - An ActiveX Test Container (ActiveQt)}{ActiveX Test Container}
+ demonstrates loading of script files.
+
+ \section2 Calling a Function Using the Native COM Interfaces
+
+ To call functions of the COM object that can not be accessed via any
+ of the above methods it is possible to request the COM interface directly
+ using QAxBase::queryInterface(). To get a C++ definition of the respective
+ interface classes use the \c #import directive with the type library
+ provided with the control; see your compiler manual for details.
+
+ \section2 Typical Error Messages
+
+ ActiveQt prints error messages to the debug output when it
+ encounters error situations at runtime. Usually you must run
+ your program in the debugger to see these messages (e.g. in Visual
+ Studio's Debug output).
+
+ \section3 QAxBase::internalInvoke: No such method
+
+ A QAxBase::dynamicCall() failed - the function prototype did not
+ match any function available in the object's API.
+
+ \section3 Error calling IDispatch member: Non-optional parameter missing
+
+ A QAxBase::dynamicCall() failed - the function prototype was correct,
+ but too few parameters were provided.
+
+ \section3 Error calling IDispatch member: Type mismatch in parameter n
+
+ A QAxBase::dynamicCall() failed - the function prototype was correct,
+ but the paramter at index \c n was of the wrong type and could
+ not be coerced to the correct type.
+
+ \section3 QAxScriptManager::call(): No script provides this function
+
+ You try to call a function that is provided through an engine
+ that doesn't provide introspection (ie. ActivePython or
+ ActivePerl). You need to call the function directly on the
+ respective QAxScript object.
+*/
diff --git a/doc/src/frameworks-technologies/activeqt-server.qdoc b/doc/src/frameworks-technologies/activeqt-server.qdoc
new file mode 100644
index 0000000..e61d9b9
--- /dev/null
+++ b/doc/src/frameworks-technologies/activeqt-server.qdoc
@@ -0,0 +1,856 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt-server.html
+ \title Building ActiveX servers and controls with Qt
+
+ \brief The QAxServer module is a Windows-only static library that
+ you can use to turn a standard Qt binary into a COM server.
+
+ The QAxServer module is part of the \l ActiveQt framework. It
+ consists of three classes:
+
+ \list
+ \o QAxFactory defines a factory for the creation of COM objects.
+ \o QAxBindable provides an interface between the Qt widget and the
+ COM object.
+ \o QAxAggregated can be subclassed to implement additional COM interfaces.
+ \endlist
+
+ Some \l{ActiveQt Examples}{example implementations} of ActiveX
+ controls and COM objects are provided.
+
+ \sa {ActiveQt Framework}
+
+ Topics:
+
+ \tableofcontents
+
+ \section1 Using the Library
+
+ To turn a standard Qt application into a COM server using the
+ QAxServer library you must add \c qaxserver as a CONFIG setting
+ in your \c .pro file.
+
+ An out-of-process executable server is generated from a \c .pro
+ file like this:
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 0
+
+ To build an in-process server, use a \c .pro file like this:
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 1
+
+ The files \c qaxserver.rc and \c qaxserver.def are part of the
+ framework and can be used from their usual location (specify a
+ path in the \c .pro file), or copied into the project directory.
+ You can modify these files as long as it includes any file as the
+ type library entry, ie. you can add version information or specify
+ a different toolbox icon.
+
+ The \c qaxserver configuration will cause the \c qmake tool to add the
+ required build steps to the build system:
+
+ \list
+ \o Link the binary against \c qaxserver.lib instead of \c qtmain.lib
+ \o Call the \l idc tool to generate an IDL file for the COM server
+ \o Compile the IDL into a type library using the MIDL tool (part of the
+ compiler installation)
+ \o Attach the resulting type library as a binary resource to the server
+ binary (again using the \l idc tool)
+ \o Register the server
+ \endlist
+
+ Note that the QAxServer build system is not supported on Windows 98/ME
+ (attaching of resources to a binary is not possible there), but a server
+ built on Windows NT/2000/XP will work on previous Windows versions as well.
+
+ To skip the post-processing step, also set the \c qaxserver_no_postlink
+ configuration.
+
+ Additionally you can specify a version number using the \c VERSION
+ variable, e.g.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 2
+
+ The version number specified will be used as the version of the type
+ library and of the server when registering.
+
+ \section2 Out-of-Process vs. In-Process
+
+ Whether your COM server should run as a stand-alone executable
+ or as a shared library in the client process depends mainly on the
+ type of COM objects you want to provide in the server.
+
+ An executable server has the advantage of being able to run as a
+ stand-alone application, but adds considerable overhead to the
+ communication between the COM client and the COM object. If the
+ control has a programming error only the server process running
+ the control will crash, and the client application will probably
+ continue to run. Not all COM clients support executable servers.
+
+ An in-process server is usually smaller and has faster startup
+ time. The communication between client and server is done directly
+ through virtual function calls and does not introduce the overhead
+ required for remote procedure calls. However, if the server crashes the
+ client application is likely to crash as well, and not every
+ functionality is available for in-process servers (i.e. register in
+ the COM's running-object-table).
+
+ Both server types can use Qt either as a shared library, or statically
+ linked into the server binary.
+
+ \section2 Typical Errors During the Post-Build Steps
+
+ For the ActiveQt specific post-processing steps to work the
+ server has to meet some requirements:
+
+ \list
+ \o All controls exposed can be created with nothing but a QApplication
+ instance being present
+ \o The initial linking of the server includes a temporary type
+ library resource
+ \o All dependencies required to run the server are in the system path
+ (or in the path used by the calling environment; note that Visual
+ Studio has its own set of environment variables listed in the
+ Tools|Options|Directories dialog).
+ \endlist
+
+ If those requirements are not met one ore more of the following
+ errors are likely to occur:
+
+ \section3 The Server Executable Crashes
+
+ To generate the IDL the widgets exposed as ActiveX controls need to
+ be instantiated (the constructor is called). At this point, nothing
+ else but a QApplication object exists. Your widget constructor must
+ not rely on any other objects to be created, e.g. it should check for
+ null-pointers.
+
+ To debug your server run it with -dumpidl outputfile and check where
+ it crashes.
+
+ Note that no functions of the control are called.
+
+ \section3 The Server Executable Is Not a Valid Win32 Application
+
+ Attaching the type library corrupted the server binary. This is a
+ bug in Windows and happens only with release builds.
+
+ The first linking step has to link a dummy type library into the
+ executable that can later be replaced by idc. Add a resource file
+ with a type library to your project as demonstrated in the examples.
+
+ \section3 "Unable to locate DLL"
+
+ The build system needs to run the server executable to generate
+ the interface definition, and to register the server. If a dynamic
+ link library the server links against is not in the path this
+ might fail (e.g. Visual Studio calls the server using the
+ enivronment settings specified in the "Directories" option). Make
+ sure that all DLLs required by your server are located in a
+ directory that is listed in the path as printed in the error
+ message box.
+
+ \section3 "Cannot open file ..."
+
+ The ActiveX server could not shut down properly when the last
+ client stopped using it. It usually takes about two seconds for
+ the application to terminate, but you might have to use the task
+ manager to kill the process (e.g. when a client doesn't release
+ the controls properly).
+
+ \section1 Implementing Controls
+
+ To implement a COM object with Qt, create a subclass of QObject
+ or any existing QObject subclass. If the class is a subclass of QWidget,
+ the COM object will be an ActiveX control.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 3
+
+ The Q_OBJECT macro is required to provide the meta object information
+ about the widget to the ActiveQt framework.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 4
+
+ Use the Q_CLASSINFO() macro to specify the COM identifiers for the COM
+ object. \c ClassID and \c InterfaceID are required, while \c EventsID is
+ only necessary when your object has signals. To generate these identifiers,
+ use system tools like \c uuidgen or \c guidgen.
+
+ You can specify additional attributes for each of your classes; see
+ \l{Class Information and Tuning} for details.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 5
+
+ Use the Q_PROPERTY() macro to declare properties for the ActiveX control.
+
+ Declare a standard constructor taking a parent object, and functions,
+ signals and slots like for any QObject subclass.
+ \footnote
+ If a standard constructor is not present the compiler will issue
+ an error "no overloaded function takes 2 parameters" when using
+ the default factory through the QAXFACTORY_DEFAULT() macro. If you
+ cannot provide a standard constructor you must implement a
+ QAxFactory custom factory and call the constructor you have in
+ your implementation of QAxFactory::create.
+ \endfootnote
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 6
+
+ The ActiveQt framework will expose properties and public slots as ActiveX
+ properties and methods, and signals as ActiveX events, and convert between
+ the Qt data types and the equivalent COM data types.
+
+ \section2 Data Types
+
+ The Qt data types that are supported for properties are:
+
+ \table
+ \header
+ \o Qt data type
+ \o COM property
+ \row
+ \o bool
+ \o VARIANT_BOOL
+ \row
+ \o QString
+ \o BSTR
+ \row
+ \o int
+ \o int
+ \row
+ \o uint
+ \o unsigned int
+ \row
+ \o double
+ \o double
+ \row
+ \o \l qlonglong
+ \o CY
+ \row
+ \o \l qulonglong
+ \o CY
+ \row
+ \o QColor
+ \o OLE_COLOR
+ \row
+ \o QDate
+ \o DATE
+ \row
+ \o QDateTime
+ \o DATE
+ \row
+ \o QTime
+ \o DATE
+ \row
+ \o QFont
+ \o IFontDisp*
+ \row
+ \o QPixmap
+ \o IPictureDisp*
+ \footnote
+ COM cannot marshal IPictureDisp accross process boundaries,
+ so QPixmap properties cannot be called for out-of-process servers. You
+ can however marshal the image data via e.g. temporary files. See the
+ Microsoft
+ \link http://support.microsoft.com/default.aspx?scid=kb;[LN];Q150034 KB article
+ Q150034 \endlink for more information.
+ \endfootnote
+ \row
+ \o QVariant
+ \o VARIANT
+ \row
+ \o QVariantList (same as QList\<QVariant\>)
+ \o SAFEARRAY(VARIANT)
+ \row
+ \o QStringList
+ \o SAFEARRAY(BSTR)
+ \row
+ \o QByteArray
+ \o SAFEARRAY(BYTE)
+ \row
+ \o QRect
+ \o User defined type
+ \row
+ \o QSize
+ \o User defined type
+ \row
+ \o QPoint
+ \o User defined type
+ \endtable
+
+ The Qt data types that are supported for parameters in signals and
+ slots are:
+ \table
+ \header
+ \o Qt data type
+ \o COM parameter
+ \row
+ \o bool
+ \o [in] VARIANT_BOOL
+ \row
+ \o bool&
+ \o [in, out] VARIANT_BOOL*
+ \row
+ \o QString, const QString&
+ \o [in] BSTR
+ \row
+ \o QString&
+ \o [in, out] BSTR*
+ \row
+ \o QString&
+ \o [in, out] BSTR*
+ \row
+ \o int
+ \o [in] int
+ \row
+ \o int&
+ \o [in,out] int
+ \row
+ \o uint
+ \o [in] unsigned int
+ \row
+ \o uint&
+ \o [in, out] unsigned int*
+ \row
+ \o double
+ \o [in] double
+ \row
+ \o double&
+ \o [in, out] double*
+ \row
+ \o QColor, const QColor&
+ \o [in] OLE_COLOR
+ \row
+ \o QColor&
+ \o [in, out] OLE_COLOR*
+ \row
+ \o QDate, const QDate&
+ \o [in] DATE
+ \row
+ \o QDate&
+ \o [in, out] DATE*
+ \row
+ \o QDateTime, const QDateTime&
+ \o [in] DATE
+ \row
+ \o QDateTime&
+ \o [in, out] DATE*
+ \row
+ \o QFont, const QFont&
+ \o [in] IFontDisp*
+ \row
+ \o QFont&
+ \o [in, out] IFontDisp**
+ \row
+ \o QPixmap, const QPixmap&
+ \o [in] IPictureDisp*
+ \row
+ \o QPixmap&
+ \o [in, out] IPictureDisp**
+ \row
+ \o QList\<QVariant\>, const QList\<QVariant\>&
+ \o [in] SAFEARRAY(VARIANT)
+ \row
+ \o QList\<QVariant\>&
+ \o [in, out] SAFEARRAY(VARIANT)*
+ \row
+ \o QStringList, const QStringList&
+ \o [in] SAFEARRAY(BSTR)
+ \row
+ \o QStringList&
+ \o [in, out] SAFEARRAY(BSTR)*
+ \row
+ \o QByteArray, const QByteArray&
+ \o [in] SAFEARRAY(BYTE)
+ \row
+ \o QByteArray&
+ \o [in, out] SAFEARRAY(BYTE)*
+ \row
+ \o QObject*
+ \o [in] IDispatch*
+ \row
+ \o QRect&
+ \footnote
+ OLE needs to marshal user defined types by reference (ByRef), and cannot
+ marshal them by value (ByVal). This is why const-references and object
+ parameters are not supported for QRect, QSize and QPoint. Also note that
+ servers with this datatype require Windows 98 or DCOM 1.2 to be installed.
+ \endfootnote
+ \o [in, out] struct QRect (user defined)
+ \row
+ \o QSize&
+ \o [in, out] struct QSize (user defined)
+ \row
+ \o QPoint&
+ \o [in, out] struct QPoint (user defined)
+ \endtable
+
+ Also supported are exported enums and flags (see Q_ENUMS() and
+ Q_FLAGS()). The in-parameter types are also supported as
+ return values.
+
+ Properties and signals/slots that have parameters using any other
+ data types are ignored by the ActiveQt framework.
+
+ \section2 Sub-Objects
+
+ COM objects can have multiple sub-objects that can represent a sub element
+ of the COM object. A COM object representing a multi-document spread sheet
+ application can for example provide one sub-object for each spread sheet.
+
+ Any QObject subclass can be used as the type for a sub object in ActiveX, as
+ long as it is known to the QAxFactory. Then the type can be used in properties,
+ or as the return type or paramter of a slot.
+
+ \section2 Property Notification
+
+ To make the properties bindable for the ActiveX client, use multiple
+ inheritance from the QAxBindable class:
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 7
+
+ When implementing the property write functions, use the
+ QAxBindable class's requestPropertyChange() and propertyChanged()
+ functions to allow ActiveX clients to bind to the control
+ properties.
+ \footnote
+ This is not required, but gives the client more control over
+ the ActiveX control.
+ \endfootnote
+
+ \section1 Serving Controls
+
+ To make a COM server available to the COM system it must be registered
+ in the system registry using five unique identifiers.
+ These identifiers are provided by tools like \c guidgen or \c uuidgen.
+ The registration information allows COM to localize the binary providing
+ a requested ActiveX control, marshall remote procedure calls to the
+ control and read type information about the methods and properties exposed
+ by the control.
+
+ To create the COM object when the client asks for it the server must export
+ an implementation of a QAxFactory. The easist way to do this is to use a set
+ of macros:
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 8
+
+ This will export \c MyWidget and \c MyWidget2 as COM objects that can be
+ created by COM clients, and will register \c MySubType as a type that can
+ be used in properties and parameters of \c MyWidget and \c MyWidget2.
+
+ The \link QAxFactory QAxFactory class documentation \endlink explains
+ how to use this macro, and how to implement and use custom factories.
+
+ For out-of-process executable servers you can implement a main()
+ function to instantiate a QApplication object and enter the event
+ loop just like any normal Qt application. By default the
+ application will start as a standard Qt application, but if you
+ pass \c -activex on the command line it will start as an ActiveX
+ server. Use QAxFactory::isServer() to create and run a standard
+ application interface, or to prevent a stand-alone execution:
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 9
+
+ This is however not necessary as ActiveQt provides a default implementation
+ of a main function. The default implemenation calls QAxFactory::startServer(),
+ creates a QApplication instance and calls exec().
+
+ To build the ActiveX server executable run \c qmake
+ to generate the makefile, and use your compiler's
+ make tool as for any other Qt application. The make process will
+ also register the controls in the system registry by calling the
+ resulting executable with the \c -regserver command line option.
+
+ If the ActiveX server is an executable, the following command line
+ options are supported:
+ \table
+ \header \o Option \o Result
+ \row \o \c -regserver \o Registers the server in the system registry
+ \row \o \c -unregserver \o Unregisters the server from the system registry
+ \row \o \c -activex \o Starts the application as an ActiveX server
+ \row \o \c{-dumpidl <file> -version x.y} \o Writes the server's IDL to the
+ specified file. The type library will have version x.y
+ \endtable
+
+ In-process servers can be registered using the \c regsvr32 tool available
+ on all Windows systems.
+
+ \section2 Typical Compile-Time Problems
+
+ The compiler/linker errors listed are based on those issued by the
+ Microsoft Visual C++ 6.0 compiler.
+
+ \section3 "No overloaded function takes 2 parameters"
+
+ When the error occurs in code that uses the QAXFACTORY_DEFAULT()
+ macro, the widget class had no constructor that can be used by the
+ default factory. Either add a standard widget constructor or
+ implement a custom factory that doesn't require one.
+
+ When the error occurs in code that uses the QAXFACTORY_EXPORT()
+ macro, the QAxFactory subclass had no appropriate constructor.
+ Provide a public class constructor like
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 10
+
+ for your factory class.
+
+ \section3 "Syntax error: bad suffix on number"
+
+ The unique identifiers have not been passed as strings into the
+ QAXFACTORY_EXPORT() or QAXFACTORY_DEFAULT() macro.
+
+ \section3 "Unresolved external symbol _ucm_instantiate"
+
+ The server does not export an implementation of a QAxFactory. Use
+ the QAXFACTORY_EXPORT() macro in one of the project's
+ implementation files to instantiate and export a factory, or use
+ the QAXFACTORY_DEFAULT() macro to use the default factory.
+
+ \section3 "_ucm_initialize already defined in ..."
+
+ The server exports more than one implementation of a QAxFactory,
+ or exports the same implementation twice. If you use the default
+ factory, the QAXFACTORY_DEFAULT() macro must only be used once in
+ the project. Use a custom QAxFactory implementation and the
+ QAXFACTORY_EXPORT() macro if the server provides multiple ActiveX
+ controls.
+
+ \section2 Distributing QAxServer Binaries
+
+ ActiveX servers written with Qt can use Qt either as a shared
+ library, or have Qt linked statically into the binary. Both ways
+ will produce rather large packages (either the server binary
+ itself becomes large, or you have to ship the Qt DLL).
+
+ \section3 Installing Stand-Alone Servers
+
+ When your ActiveX server can also run as a stand-alone application,
+ run the server executable with the \c -regserver command line
+ parameter after installing the executable on the target system.
+ After that the controls provided by the server will be available to
+ ActiveX clients.
+
+ \section3 Installing In-Process Servers
+
+ When your ActiveX server is part of an installation package, use the
+ \c regsvr32 tool provided by Microsoft to register the controls on
+ the target system. If this tool is not present, load the DLL into
+ your installer process, resolve the \c DllRegisterServer symbol and
+ call the function:
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 11
+
+ \section3 Distributing Servers over the Internet
+
+ If you want to use controls in your server in web-pages you need to
+ make the server available to the browser used to view your page, and
+ you need to specify the location of the server package in your page.
+
+ To specify the location of a server, use the CODEBASE attribute in
+ the OBJECT tag of your web-site. The value can point to the server
+ file itself, to an INF file listing other files the server requires
+ (e.g. the Qt DLL), or a compressed CAB archive.
+
+ INF and CAB files are documented in almost every book available about
+ ActiveX and COM programming as well as in the MSDN library and various
+ other Online resources. The examples include INF files that can be used
+ to build CAB archives:
+
+ \snippet examples/activeqt/simple/simple.inf 0
+
+ The CABARC tool from Microsoft can easily generate CAB archives:
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 12
+
+ The INF files assume a static build of Qt, so no dependencies to other DLLs
+ are listed in the INF files. To distribute an ActiveX server depending on
+ DLLs you must add the dependencies, and provide the library files
+ with the archive.
+
+ \section1 Using the Controls
+
+ To use the ActiveX controls, e.g. to embed them in a web page, use
+ the \c <object> HTML tag.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 13
+
+ To initialize the control's properties, use
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 14
+
+ If the web browser supports scripting use JavaScript, VBScript
+ and forms to script the control. The
+ \l{ActiveQt Examples} include demonstration HTML pages for the example
+ controls.
+
+ \section2 Supported and Unsupported ActiveX Clients
+
+ The following is largly based on our own experiements with ActiveX
+ controls and client applications, and is by no means complete.
+
+ \section3 Supported Clients
+
+ These standard applications work with ActiveX controls developed with
+ ActiveQt. Note that some clients support only in-process controls.
+
+ \list
+ \o Internet Explorer
+ \o Microsoft ActiveX Control Test Container
+ \o Microsoft Visual Studio 6.0
+ \o Microsoft Visual Studio.NET/2003
+ \o Microsoft Visual Basic 6.0
+ \o MFC- and ATL-based containers
+ \o Sybase PowerBuilder
+ \o ActiveQt based containers
+ \endlist
+
+ Microsoft Office applications are supported, but you need to register
+ the controls as "Insertable" objects. Reimplement QAxFactory::registerClass
+ to add this attribute to the COM class, or set the "Insertable" class info
+ for your class to "yes" using the Q_CLASSINFO macro.
+
+ \section3 Unsupported Clients
+
+ We have not managed to make ActiveQt based COM objects work with the
+ following client applications.
+
+ \list
+ \o Borland C++ Builder (Versions 5 and 6)
+ \o Borland Delphi
+ \endlist
+
+ \section2 Typical Runtime Errors
+
+ \section3 The Server Does Not Respond
+
+ If the system is unable to start the server (check with the task
+ manager whether the server runs a process), make sure that no DLL
+ the server depends on is missing from the system path (e.g. the Qt
+ DLL!). Use a dependency walker to view all dependencies of the server
+ binary.
+
+ If the server runs (e.g. the task manager lists a process), see
+ the following section for information on debugging your server.
+
+ \section3 The Object Cannot Be Created
+
+ If the server could be built and registered correctly during the build
+ process, but the object cannot be initiliazed e.g. by the OLE/COM Object
+ Viewer application, make sure that no DLL the server depends on is
+ missing from the system path (e.g. the Qt DLL). Use a dependency walker
+ to view all dependencies of the server binary.
+
+ If the server runs, see the following section for information on
+ debugging your server.
+
+ \section2 Debugging Runtime Errors
+
+ To debug an in-process server in Visual Studio, set the server project
+ as the active project, and specify a client "executable for debug
+ session" in the project settings (e.g. use the ActiveX Test Container).
+ You can set breakpoints in your code, and also step into ActiveQt and
+ Qt code if you installed the debug version.
+
+ To debug an executable server, run the application in a debugger
+ and start with the command line parameter \c -activex. Then start
+ your client and create an instance of your ActiveX control. COM
+ will use the existing process for the next client trying to create
+ an ActiveX control.
+
+ \section1 Class Information and Tuning
+
+ To provide attributes for each COM class, use the Q_CLASSINFO macro, which is part of
+ Qt's meta object system.
+
+ \table
+ \header
+ \o Key
+ \o Meaning of value
+ \row
+ \o Version
+ \o The version of the class (1.0 is default)
+ \row
+ \o Description
+ \o A string describing the class.
+ \row
+ \o ClassID
+ \o The class ID.
+ You must reimplement QAxFactory::classID if not specified.
+ \row
+ \o InterfaceID
+ \o The interface ID.
+ You must reimplement QAxFactory::interfaceID if not specified.
+ \row
+ \o EventsID
+ \o The event interface ID.
+ No signals are exposed as COM events if not specified.
+ \row
+ \o DefaultProperty
+ \o The property specified represents the default property of this class.
+ Ie. the default property of a push button would be "text".
+ \row
+ \o DefaultSignal
+ \o The signal specified respresents the default signal of this class.
+ Ie. the default signal of a push button would be "clicked".
+ \row
+ \o LicenseKey
+ \o Object creation requires the specified license key. The key can be
+ empty to require a licensed machine. By default classes are not
+ licensed. Also see the following section.
+ \row
+ \o StockEvents
+ \o Objects expose stock events if value is "yes".
+ See \l QAxFactory::hasStockEvents()
+ \row
+ \o ToSuperClass
+ \o Objects expose functionality of all super-classes up to and
+ including the class name in value.
+ See \l QAxFactory::exposeToSuperClass()
+ \row
+ \o Insertable
+ \o If the value is "yes" the class is registered to be "Insertable"
+ and will be listed in OLE 2 containers (ie. Microsoft Office). This
+ attribute is not be set by default.
+ \row
+ \o Aggregatable
+ \o If the value is "no" the class does not support aggregation. By
+ default aggregation is supported.
+ \row
+ \o Creatable
+ \o If the value is "no" the class cannot be created by the client,
+ and is only available through the API of another class (ie. the
+ class is a sub-type).
+ \row
+ \o RegisterObject
+ \o If the value is "yes" objects of this class are registered with
+ OLE and accessible from the running object table (ie. clients
+ can connect to an already running instance of this class). This
+ attribute is only supported in out-of-process servers.
+ \row
+ \o MIME
+ \o The object can handle data and files of the format specified in the
+ value. The value has the format mime:extension:description. Multiple
+ formats are separated by a semicolon.
+ \row
+ \o CoClassAlias
+ \o The classname used in the generated IDL and in the registry. This is
+ esp. useful for C++ classes that live in a namespace - by default,
+ ActiveQt just removes the "::" to make the IDL compile.
+ \endtable
+
+ Note that both keys and values are case sensitive.
+
+ The following declares version 2.0 of a class that exposes only its
+ own API, and is available in the "Insert Objects" dialog of Microsoft
+ Office applications.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 15
+
+ \section2 Developing Licensed Components
+
+ If you develop components you might want to control who is able to instantiate
+ those components. Since the server binary can be shipped to and registered on
+ any client machine it is possible for anybody to use those components in his
+ own software.
+
+ Licensing components can be done using a variety of techniques, e.g. the code
+ creating the control can provide a license key, or the machine on which the
+ control is supposed to run needs to be licensed.
+
+ To mark a Qt class as licensed specify a "LicenseKey" using the
+ Q_CLASSINFO() macro.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 16
+
+ The key is required to be able to create an instance of \c MyLicensedControl
+ on a machine that is not licensed itself. The licensed developer can now
+ redistributes the server binary with his application, which creates the control
+ using the value of "LicenseKey", while users of the application cannot create
+ the control without the license key.
+
+ If a single license key for the control is not sufficient (ie. you want
+ differnet developers to receive different license keys) you can specify an
+ empty key to indicate that the control requires a license, and reimplement
+ \l QAxFactory::validateLicenseKey() to verify that a license exists on the
+ system (ie. through a license file).
+
+ \section2 More Interfaces
+
+ ActiveX controls provided by ActiveQt servers support a minimal set of COM
+ interfaces to implement the OLE specifications. When the ActiveX class inherits
+ from the QAxBindable class it can also implement additional COM interfaces.
+
+ Create a new subclass of QAxAggregated and use multiple inheritance
+ to subclass additional COM interface classes.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 17
+
+ Reimplement the QAxAggregated::queryInterface() function to
+ support the additional COM interfaces.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 18
+
+ Since \c ISomeCOMInterface is a subclass of \c IUnknown you will
+ have to implement the \c QueryInterface(), \c AddRef(), and \c
+ Release() functions. Use the QAXAGG_IUNKNOWN macro in your
+ class definition to do that. If you implement the \c IUnknown
+ functions manually, delegate the calls to the interface pointer
+ returned by the QAxAggregated::controllingUnknown() function,
+ e.g.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 19
+
+ Do not support the \c IUnknown interface itself in your
+ \l{QAxAggregated::queryInterface()}{queryInterface()}
+ implementation.
+
+ Implement the methods of the COM interfaces, and use QAxAggregated::object()
+ if you need to make calls to the QObject subclass implementing the control.
+
+ In your QAxBindable subclass, implement
+ QAxBindable::createAggregate() to return a new object of the
+ QAxAggregated subclass.
+
+ \snippet doc/src/snippets/code/doc_src_qaxserver.qdoc 20
+*/
diff --git a/doc/src/frameworks-technologies/activeqt.qdoc b/doc/src/frameworks-technologies/activeqt.qdoc
new file mode 100644
index 0000000..1490a8a
--- /dev/null
+++ b/doc/src/frameworks-technologies/activeqt.qdoc
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group activeqt-tools
+ \title Tools for ActiveQt
+ \brief Tools to help integrate Qt applications with ActiveX components.
+
+ These tools provide support for integrating Qt with ActiveX components.
+
+ \generatelist{related}
+
+ \sa {ActiveQt Framework}
+*/
+
+/*!
+ \page activeqt.html
+ \title ActiveQt Framework
+ \brief An overview of Qt's ActiveX and COM integration on Windows.
+
+ \ingroup platform-specific
+ \keyword ActiveQt
+
+ Qt's ActiveX and COM support allows Qt for Windows developers to:
+
+ \list 1
+ \o Access and use ActiveX controls and COM objects provided by any
+ ActiveX server in their Qt applications.
+ \o Make their Qt applications available as COM servers, with
+ any number of Qt objects and widgets as COM objects and ActiveX
+ controls.
+ \endlist
+
+ The ActiveQt framework consists of two modules:
+
+ \list
+ \o The \l QAxContainer module is a static
+ library implementing QObject and QWidget subclasses, QAxObject and
+ QAxWidget, that act as containers for COM objects and ActiveX
+ controls.
+ \o The \l QAxServer module is a static library that implements
+ functionality for in-process and executable COM servers. This
+ module provides the QAxAggregated, QAxBindable and QAxFactory
+ classes.
+ \endlist
+
+ To build the static libraries, change into the \c activeqt directory
+ (usually \c QTDIR/src/activeqt), and run \c qmake and your make
+ tool in both the \c container and the \c control subdirectory.
+ The libraries \c qaxcontainer.lib and \c qaxserver.lib will be linked
+ into \c QTDIR/lib.
+
+ If you are using a shared configuration of Qt enter the \c plugin
+ subdirectory and run \c qmake and your make tool to build a
+ plugin that integrates the QAxContainer module into \l{Qt
+ Designer}.
+
+ The ActiveQt modules are part of the \l{Qt Full Framework Edition} and
+ the \l{Open Source Versions of Qt}.
+
+ \sa {QAxContainer Module}, {QAxServer Module}
+*/
diff --git a/doc/src/frameworks-technologies/animation.qdoc b/doc/src/frameworks-technologies/animation.qdoc
new file mode 100644
index 0000000..d67a230
--- /dev/null
+++ b/doc/src/frameworks-technologies/animation.qdoc
@@ -0,0 +1,377 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group animation
+ \title Animation Framework
+*/
+
+/*!
+ \page animation-overview.html
+ \title The Animation Framework
+
+ \brief An overview of the Animation Framework
+
+ \ingroup frameworks-technologies
+
+ \keyword Animation
+
+ The animation framework is part of the Kinetic project, and aims
+ to provide an easy way for creating animated and smooth GUI's. By
+ animating Qt properties, the framework provides great freedom for
+ animating widgets and other \l{QObject}s. The framework can also
+ be used with the Graphics View framework.
+
+ In this overview, we explain the basics of its architecture. We
+ also show examples of the most common techniques that the
+ framework allows for animating QObjects and graphics items.
+
+ \tableofcontents
+
+ \section1 The Animation Architecture
+
+ We will in this section take a high-level look at the animation
+ framework's architecture and how it is used to animate Qt
+ properties. The following diagram shows the most important classes
+ in the animation framework.
+
+ \image animations-architecture.png
+
+ The animation framework foundation consists of the base class
+ QAbstractAnimation, and its two subclasses QVariantAnimation and
+ QAnimationGroup. QAbstractAnimation is the ancestor of all
+ animations. It represents basic properties that are common for all
+ animations in the framework; notably, the ability to start, stop,
+ and pause an animation. It is also receives the time change
+ notifications.
+
+ The animation framework further provides the QPropertyAnimation
+ class, which inherits QVariantAnimation and performs animation of
+ a Qt property, which is part of Qt's \l{Meta-Object
+ System}{meta-object system}. The class performs an interpolation
+ over the property using an easing curve. So when you want to
+ animate a value, you can declare it as a property and make your
+ class a QObject. Note that this gives us great freedom in
+ animating already existing widgets and other \l{QObject}s.
+
+ Complex animations can be constructed by building a tree structure
+ of \l{QAbstractAnimation}s. The tree is built by using
+ \l{QAnimationGroup}s, which function as containers for other
+ animations. Note also that the groups are subclasses of
+ QAbstractAnimation, so groups can themselves contain other groups.
+
+ The animation framework can be used on its own, but is also
+ designed to be part of the state machine framework (See the
+ \l{The State Machine Framework}{state machine framework} for an
+ introduction to the Qt state machine). The state machine provides
+ a special state that can play an animation. A QState can also set
+ properties when the state is entered or exited, and this special
+ animation state will interpolate between these values when given a
+ QPropertyAnimation. We will look more closely at this later.
+
+ Behind the scenes, the animations are controlled by a global
+ timer, which sends \l{QAbstractAnimation::updateCurrentTime()}{updates} to
+ all animations that are playing.
+
+ For detailed descriptions of the classes' function and roles in
+ the framework, please look up their class descriptions.
+
+ \section1 Classes in the Animation Framework
+
+ These classes provide a framework for creating both simple and complex
+ animations.
+
+ \annotatedlist animation
+
+ \section1 Animating Qt Properties
+
+ As mentioned in the previous section, the QPropertyAnimation class
+ can interpolate over Qt properties. It is this class that should
+ be used for animation of values; in fact, its superclass,
+ QVariantAnimation, is an abstract class, and cannot be used
+ directly.
+
+ A major reason we chose to animate Qt properties is that it
+ presents us with freedom to animate already existing classes in
+ the Qt API. Notably, the QWidget class (which we can also embed in
+ a QGraphicsView) has properties for its bounds, colors, etc.
+ Let's look at a small example:
+
+ \code
+ QPushButton button("Animated Button");
+ button.show();
+
+ QPropertyAnimation animation(&button, "geometry");
+ animation.setDuration(10000);
+ animation.setStartValue(QRect(0, 0, 100, 30));
+ animation.setEndValue(QRect(250, 250, 100, 30));
+
+ animation.start();
+ \endcode
+
+ This code will move \c button from the top left corner of the
+ screen to the position (250, 250) in 10 seconds (10000 milliseconds).
+
+ The example above will do a linear interpolation between the
+ start and end value. It is also possible to set values
+ situated between the start and end value. The interpolation
+ will then go by these points.
+
+ \code
+ QPushButton button("Animated Button");
+ button.show();
+
+ QPropertyAnimation animation(&button, "geometry");
+ animation.setDuration(10000);
+
+ animation.setKeyValueAt(0, QRect(0, 0, 100, 30));
+ animation.setKeyValueAt(0.8, QRect(250, 250, 100, 30));
+ animation.setKeyValueAt(1, QRect(0, 0, 100, 30));
+
+ animation.start();
+ \endcode
+
+ In this example, the animation will take the button to (250, 250)
+ in 8 seconds, and then move it back to its original position in
+ the remaining 2 seconds. The movement will be linearly
+ interpolated between these points.
+
+ You also have the possibility to animate values of a QObject
+ that is not declared as a Qt property. The only requirement is
+ that this value has a setter. You can then subclass the class
+ containing the value and declare a property that uses this setter.
+ Note that each Qt property requires a getter, so you will need to
+ provide a getter yourself if this is not defined.
+
+ \code
+ class MyGraphicsRectItem : public QObject, public QGraphicsRectItem
+ {
+ Q_OBJECT
+ Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry)
+ };
+ \endcode
+
+ In the above code example, we subclass QGraphicsRectItem and
+ define a geometry property. We can now animate the widgets
+ geometry even if QGraphicsRectItem does not provide the geometry
+ property.
+
+ For a general introduction to the Qt property system, see its
+ \l{Qt's Property System}{overview}.
+
+ \section1 Animations and the Graphics View Framework
+
+ When you want to animate \l{QGraphicsItem}s, you also use
+ QPropertyAnimation. However, QGraphicsItem does not inherit QObject.
+ A good solution is to subclass the graphics item you wish to animate.
+ This class will then also inherit QObject.
+ This way, QPropertyAnimation can be used for \l{QGraphicsItem}s.
+ The example below shows how this is done. Another possibility is
+ to inherit QGraphicsWidget, which already is a QObject.
+
+ \code
+ class Pixmap : public QObject, public QGraphicsPixmapItem
+ {
+ Q_OBJECT
+ Q_PROPERTY(QPointF pos READ pos WRITE setPos)
+ ...
+ \endcode
+
+ As described in the previous section, we need to define
+ properties that we wish to animate.
+
+ Note that QObject must be the first class inherited as the
+ meta-object system demands this.
+
+ \section1 Easing Curves
+
+ As mentioned, QPropertyAnimation performs an interpolation between
+ the start and end property value. In addition to adding more key
+ values to the animation, you can also use an easing curve. Easing
+ curves describe a function that controls how the speed of the
+ interpolation between 0 and 1 should be, and are useful if you
+ want to control the speed of an animation without changing the
+ path of the interpolation.
+
+ \code
+ QPushButton button("Animated Button");
+ button.show();
+
+ QPropertyAnimation animation(&button, "geometry");
+ animation.setDuration(3000);
+ animation.setStartValue(QRect(0, 0, 100, 30));
+ animation.setEndValue(QRect(250, 250, 100, 30));
+
+ animation.setEasingCurve(QEasingCurve::OutBounce);
+
+ animation.start();
+ \endcode
+
+ Here the animation will follow a curve that makes it bounce like a
+ ball as if it was dropped from the start to the end position.
+ QEasingCurve has a large collection of curves for you to choose
+ from. These are defined by the QEasingCurve::Type enum. If you are
+ in need of another curve, you can also implement one yourself, and
+ register it with QEasingCurve.
+
+ \omit Drop this for the first Lab release
+ (Example of custom easing curve (without the actual impl of
+ the function I expect)
+ \endomit
+
+ \section1 Putting Animations Together
+
+ An application will often contain more than one animation. For
+ instance, you might want to move more than one graphics item
+ simultaneously or move them in sequence after each other.
+
+ The subclasses of QAnimationGroup (QSequentialAnimationGroup and
+ QParallelAnimationGroup) are containers for other animations so
+ that these animations can be animated either in sequence or
+ parallel. The QAnimationGroup is an example of an animation that
+ does not animate properties, but it gets notified of time changes
+ periodically. This enables it to forward those time changes to its
+ contained animations, and thereby controlling when its animations
+ are played.
+
+ Let's look at code examples that use both
+ QSequentialAnimationGroup and QParallelAnimationGroup, starting
+ off with the latter.
+
+ \code
+ QPushButton *bonnie = new QPushButton("Bonnie");
+ bonnie->show();
+
+ QPushButton *clyde = new QPushButton("Clyde");
+ clyde->show();
+
+ QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "geometry");
+ // Set up anim1
+
+ QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "geometry");
+ // Set up anim2
+
+ QParallelAnimationGroup *group = new QParallelAnimationGroup;
+ group->addAnimation(anim1);
+ group->addAnimation(anim2);
+
+ group->start();
+ \endcode
+
+ A parallel group plays more than one animation at the same time.
+ Calling its \l{QAbstractAnimation::}{start()} function will start
+ all animations it governs.
+
+ \code
+ QPushButton button("Animated Button");
+ button.show();
+
+ QPropertyAnimation anim1(&button, "geometry");
+ anim1.setDuration(3000);
+ anim1.setStartValue(QRect(0, 0, 100, 30));
+ anim1.setEndValue(QRect(500, 500, 100, 30));
+
+ QPropertyAnimation anim2(&button, "geometry");
+ anim2.setDuration(3000);
+ anim2.setStartValue(QRect(500, 500, 100, 30));
+ anim2.setEndValue(QRect(1000, 500, 100, 30));
+
+ QSequentialAnimationGroup group;
+
+ group.addAnimation(&anim1);
+ group.addAnimation(&anim2);
+
+ group.start();
+ \endcode
+
+ As you no doubt have guessed, QSequentialAnimationGroup plays
+ its animations in sequence. It starts the next animation in
+ the list after the previous is finished.
+
+ Since an animation group is an animation itself, you can add
+ it to another group. This way, you can build a tree structure
+ of animations which specifies when the animations are played
+ in relation to each other.
+
+ \section1 Animations and States
+
+ When using a \l{The State Machine Framework}{state machine}, we
+ can associate one or more animations to a transition between states
+ using a QSignalTransition or QEventTransition class. These classes
+ are both derived from QAbstractTransition, which defines the
+ convenience function \l{QAbstractTransition::}{addAnimation()} that
+ enables the appending of one or more animations triggered when the
+ transition occurs.
+
+ We also have the possibility to associate properties with the
+ states rather than setting the start and end values ourselves.
+ Below is a complete code example that animates the geometry of a
+ QPushButton.
+
+ \code
+ QPushButton *button = new QPushButton("Animated Button");
+ button->show();
+
+ QStateMachine *machine = new QStateMachine;
+
+ QState *state1 = new QState(machine->rootState());
+ state1->assignProperty(button, "geometry", QRect(0, 0, 100, 30));
+ machine->setInitialState(state1);
+
+ QState *state2 = new QState(machine->rootState());
+ state2->assignProperty(button, "geometry", QRect(250, 250, 100, 30));
+
+ QSignalTransition *transition1 = state1->addTransition(button,
+ SIGNAL(clicked()), state2);
+ transition1->addAnimation(new QPropertyAnimation(button, "geometry"));
+
+ QSignalTransition *transition2 = state2->addTransition(button,
+ SIGNAL(clicked()), state1);
+ transition2->addAnimation(new QPropertyAnimation(button, "geometry"));
+
+ machine->start();
+ \endcode
+
+ For a more comprehensive example of how to use the state machine
+ framework for animations, see the states example (it lives in the
+ \c{examples/animation/states} directory).
+*/
+
diff --git a/doc/src/frameworks-technologies/containers.qdoc b/doc/src/frameworks-technologies/containers.qdoc
new file mode 100644
index 0000000..be3e3eb
--- /dev/null
+++ b/doc/src/frameworks-technologies/containers.qdoc
@@ -0,0 +1,810 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group tools
+ \title Non-GUI Classes
+ \ingroup groups
+
+ \brief Collection classes such as list, queue, stack and string, along
+ with other classes that can be used without needing QApplication.
+
+ The non-GUI classes are general-purpose collection and string classes
+ that may be used independently of the GUI classes.
+
+ In particular, these classes do not depend on QApplication at all,
+ and so can be used in non-GUI programs.
+
+*/
+
+/*!
+ \page containers.html
+ \title Generic Containers
+ \ingroup frameworks-technologies
+ \ingroup groups
+ \keyword container class
+ \keyword container classes
+
+ \brief Qt's template-based container classes.
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ The Qt library provides a set of general purpose template-based
+ container classes. These classes can be used to store items of a
+ specified type. For example, if you need a resizable array of
+ \l{QString}s, use QVector<QString>.
+
+ These container classes are designed to be lighter, safer, and
+ easier to use than the STL containers. If you are unfamiliar with
+ the STL, or prefer to do things the "Qt way", you can use these
+ classes instead of the STL classes.
+
+ The container classes are \l{implicitly shared}, they are
+ \l{reentrant}, and they are optimized for speed, low memory
+ consumption, and minimal inline code expansion, resulting in
+ smaller executables. In addition, they are \l{thread-safe}
+ in situations where they are used as read-only containers
+ by all threads used to access them.
+
+ For traversing the items stored in a container, you can use one
+ of two types of iterators: \l{Java-style iterators} and
+ \l{STL-style iterators}. The Java-style iterators are easier to
+ use and provide high-level functionality, whereas the STL-style
+ iterators are slightly more efficient and can be used together
+ with Qt's and STL's \l{generic algorithms}.
+
+ Qt also offers a \l{foreach} keyword that make it very
+ easy to iterate over all the items stored in a container.
+
+ \section1 The Container Classes
+
+ Qt provides the following sequential containers: QList,
+ QLinkedList, QVector, QStack, and QQueue. For most
+ applications, QList is the best type to use. Although it is
+ implemented as an array-list, it provides very fast prepends and
+ appends. If you really need a linked-list, use QLinkedList; if you
+ want your items to occupy consecutive memory locations, use QVector.
+ QStack and QQueue are convenience classes that provide LIFO and
+ FIFO semantics.
+
+ Qt also provides these associative containers: QMap,
+ QMultiMap, QHash, QMultiHash, and QSet. The "Multi" containers
+ conveniently support multiple values associated with a single
+ key. The "Hash" containers provide faster lookup by using a hash
+ function instead of a binary search on a sorted set.
+
+ As special cases, the QCache and QContiguousCache classes provide
+ efficient hash-lookup of objects in a limited cache storage.
+
+ \table
+ \header \o Class \o Summary
+
+ \row \o \l{QList}<T>
+ \o This is by far the most commonly used container class. It
+ stores a list of values of a given type (T) that can be accessed
+ by index. Internally, the QList is implemented using an array,
+ ensuring that index-based access is very fast.
+
+ Items can be added at either end of the list using
+ QList::append() and QList::prepend(), or they can be inserted in
+ the middle using QList::insert(). More than any other container
+ class, QList is highly optimized to expand to as little code as
+ possible in the executable. QStringList inherits from
+ QList<QString>.
+
+ \row \o \l{QLinkedList}<T>
+ \o This is similar to QList, except that it uses
+ iterators rather than integer indexes to access items. It also
+ provides better performance than QList when inserting in the
+ middle of a huge list, and it has nicer iterator semantics.
+ (Iterators pointing to an item in a QLinkedList remain valid as
+ long as the item exists, whereas iterators to a QList can become
+ invalid after any insertion or removal.)
+
+ \row \o \l{QVector}<T>
+ \o This stores an array of values of a given type at adjacent
+ positions in memory. Inserting at the front or in the middle of
+ a vector can be quite slow, because it can lead to large numbers
+ of items having to be moved by one position in memory.
+
+ \row \o \l{QStack}<T>
+ \o This is a convenience subclass of QVector that provides
+ "last in, first out" (LIFO) semantics. It adds the following
+ functions to those already present in QVector:
+ \l{QStack::push()}{push()}, \l{QStack::pop()}{pop()},
+ and \l{QStack::top()}{top()}.
+
+ \row \o \l{QQueue}<T>
+ \o This is a convenience subclass of QList that provides
+ "first in, first out" (FIFO) semantics. It adds the following
+ functions to those already present in QList:
+ \l{QQueue::enqueue()}{enqueue()},
+ \l{QQueue::dequeue()}{dequeue()}, and \l{QQueue::head()}{head()}.
+
+ \row \o \l{QSet}<T>
+ \o This provides a single-valued mathematical set with fast
+ lookups.
+
+ \row \o \l{QMap}<Key, T>
+ \o This provides a dictionary (associative array) that maps keys
+ of type Key to values of type T. Normally each key is associated
+ with a single value. QMap stores its data in Key order; if order
+ doesn't matter QHash is a faster alternative.
+
+ \row \o \l{QMultiMap}<Key, T>
+ \o This is a convenience subclass of QMap that provides a nice
+ interface for multi-valued maps, i.e. maps where one key can be
+ associated with multiple values.
+
+ \row \o \l{QHash}<Key, T>
+ \o This has almost the same API as QMap, but provides
+ significantly faster lookups. QHash stores its data in an
+ arbitrary order.
+
+ \row \o \l{QMultiHash}<Key, T>
+ \o This is a convenience subclass of QHash that
+ provides a nice interface for multi-valued hashes.
+
+ \endtable
+
+ Containers can be nested. For example, it is perfectly possible
+ to use a QMap<QString, QList<int> >, where the key type is
+ QString and the value type QList<int>. The only pitfall is that
+ you must insert a space between the closing angle brackets (>);
+ otherwise the C++ compiler will misinterpret the two >'s as a
+ right-shift operator (>>) and report a syntax error.
+
+ The containers are defined in individual header files with the
+ same name as the container (e.g., \c <QLinkedList>). For
+ convenience, the containers are forward declared in \c
+ <QtContainerFwd>.
+
+ \keyword assignable data type
+ \keyword assignable data types
+
+ The values stored in the various containers can be of any
+ \e{assignable data type}. To qualify, a type must provide a
+ default constructor, a copy constructor, and an assignment
+ operator. This covers most data types you are likely to want to
+ store in a container, including basic types such as \c int and \c
+ double, pointer types, and Qt data types such as QString, QDate,
+ and QTime, but it doesn't cover QObject or any QObject subclass
+ (QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a
+ QList<QWidget>, the compiler will complain that QWidget's copy
+ constructor and assignment operators are disabled. If you want to
+ store these kinds of objects in a container, store them as
+ pointers, for example as QList<QWidget *>.
+
+ Here's an example custom data type that meets the requirement of
+ an assignable data type:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 0
+
+ If we don't provide a copy constructor or an assignment operator,
+ C++ provides a default implementation that performs a
+ member-by-member copy. In the example above, that would have been
+ sufficient. Also, if you don't provide any constructors, C++
+ provides a default constructor that initializes its member using
+ default constructors. Although it doesn't provide any
+ explicit constructors or assignment operator, the following data
+ type can be stored in a container:
+
+ \snippet doc/src/snippets/streaming/main.cpp 0
+
+ Some containers have additional requirements for the data types
+ they can store. For example, the Key type of a QMap<Key, T> must
+ provide \c operator<(). Such special requirements are documented
+ in a class's detailed description. In some cases, specific
+ functions have special requirements; these are described on a
+ per-function basis. The compiler will always emit an error if a
+ requirement isn't met.
+
+ Qt's containers provide operator<<() and operator>>() so that they
+ can easily be read and written using a QDataStream. This means
+ that the data types stored in the container must also support
+ operator<<() and operator>>(). Providing such support is
+ straightforward; here's how we could do it for the Movie struct
+ above:
+
+ \snippet doc/src/snippets/streaming/main.cpp 1
+ \codeline
+ \snippet doc/src/snippets/streaming/main.cpp 2
+
+ \keyword default-constructed values
+
+ The documentation of certain container class functions refer to
+ \e{default-constructed values}; for example, QVector
+ automatically initializes its items with default-constructed
+ values, and QMap::value() returns a default-constructed value if
+ the specified key isn't in the map. For most value types, this
+ simply means that a value is created using the default
+ constructor (e.g. an empty string for QString). But for primitive
+ types like \c{int} and \c{double}, as well as for pointer types,
+ the C++ language doesn't specify any initialization; in those
+ cases, Qt's containers automatically initialize the value to 0.
+
+ \section1 The Iterator Classes
+
+ Iterators provide a uniform means to access items in a container.
+ Qt's container classes provide two types of iterators: Java-style
+ iterators and STL-style iterators.
+
+ \section2 Java-Style Iterators
+
+ The Java-style iterators are new in Qt 4 and are the standard
+ ones used in Qt applications. They are more convenient to use than
+ the STL-style iterators, at the price of being slightly less
+ efficient. Their API is modelled on Java's iterator classes.
+
+ For each container class, there are two Java-style iterator data
+ types: one that provides read-only access and one that provides
+ read-write access.
+
+ \table
+ \header \o Containers \o Read-only iterator
+ \o Read-write iterator
+ \row \o QList<T>, QQueue<T> \o QListIterator<T>
+ \o QMutableListIterator<T>
+ \row \o QLinkedList<T> \o QLinkedListIterator<T>
+ \o QMutableLinkedListIterator<T>
+ \row \o QVector<T>, QStack<T> \o QVectorIterator<T>
+ \o QMutableVectorIterator<T>
+ \row \o QSet<T> \o QSetIterator<T>
+ \o QMutableSetIterator<T>
+ \row \o QMap<Key, T>, QMultiMap<Key, T> \o QMapIterator<Key, T>
+ \o QMutableMapIterator<Key, T>
+ \row \o QHash<Key, T>, QMultiHash<Key, T> \o QHashIterator<Key, T>
+ \o QMutableHashIterator<Key, T>
+ \endtable
+
+ In this discussion, we will concentrate on QList and QMap. The
+ iterator types for QLinkedList, QVector, and QSet have exactly
+ the same interface as QList's iterators; similarly, the iterator
+ types for QHash have the same interface as QMap's iterators.
+
+ Unlike STL-style iterators (covered \l{STL-style
+ iterators}{below}), Java-style iterators point \e between items
+ rather than directly \e at items. For this reason, they are
+ either pointing to the very beginning of the container (before
+ the first item), at the very end of the container (after the last
+ item), or between two items. The diagram below shows the valid
+ iterator positions as red arrows for a list containing four
+ items:
+
+ \img javaiterators1.png
+
+ Here's a typical loop for iterating through all the elements of a
+ QList<QString> in order and printing them to the console:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 1
+
+ It works as follows: The QList to iterate over is passed to the
+ QListIterator constructor. At that point, the iterator is located
+ just in front of the first item in the list (before item "A").
+ Then we call \l{QListIterator::hasNext()}{hasNext()} to
+ check whether there is an item after the iterator. If there is, we
+ call \l{QListIterator::next()}{next()} to jump over that
+ item. The next() function returns the item that it jumps over. For
+ a QList<QString>, that item is of type QString.
+
+ Here's how to iterate backward in a QList:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 2
+
+ The code is symmetric with iterating forward, except that we
+ start by calling \l{QListIterator::toBack()}{toBack()}
+ to move the iterator after the last item in the list.
+
+ The diagram below illustrates the effect of calling
+ \l{QListIterator::next()}{next()} and
+ \l{QListIterator::previous()}{previous()} on an iterator:
+
+ \img javaiterators2.png
+
+ The following table summarizes the QListIterator API:
+
+ \table
+ \header \o Function \o Behavior
+ \row \o \l{QListIterator::toFront()}{toFront()}
+ \o Moves the iterator to the front of the list (before the first item)
+ \row \o \l{QListIterator::toBack()}{toBack()}
+ \o Moves the iterator to the back of the list (after the last item)
+ \row \o \l{QListIterator::hasNext()}{hasNext()}
+ \o Returns true if the iterator isn't at the back of the list
+ \row \o \l{QListIterator::next()}{next()}
+ \o Returns the next item and advances the iterator by one position
+ \row \o \l{QListIterator::peekNext()}{peekNext()}
+ \o Returns the next item without moving the iterator
+ \row \o \l{QListIterator::hasPrevious()}{hasPrevious()}
+ \o Returns true if the iterator isn't at the front of the list
+ \row \o \l{QListIterator::previous()}{previous()}
+ \o Returns the previous item and moves the iterator back by one position
+ \row \o \l{QListIterator::peekPrevious()}{peekPrevious()}
+ \o Returns the previous item without moving the iterator
+ \endtable
+
+ QListIterator provides no functions to insert or remove items
+ from the list as we iterate. To accomplish this, you must use
+ QMutableListIterator. Here's an example where we remove all
+ odd numbers from a QList<int> using QMutableListIterator:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 3
+
+ The next() call in the loop is made every time. It jumps over the
+ next item in the list. The
+ \l{QMutableListIterator::remove()}{remove()} function removes the
+ last item that we jumped over from the list. The call to
+ \l{QMutableListIterator::remove()}{remove()} does not invalidate
+ the iterator, so it is safe to continue using it. This works just
+ as well when iterating backward:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 4
+
+ If we just want to modify the value of an existing item, we can
+ use \l{QMutableListIterator::setValue()}{setValue()}. In the code
+ below, we replace any value larger than 128 with 128:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 5
+
+ Just like \l{QMutableListIterator::remove()}{remove()},
+ \l{QMutableListIterator::setValue()}{setValue()} operates on the
+ last item that we jumped over. If we iterate forward, this is the
+ item just before the iterator; if we iterate backward, this is
+ the item just after the iterator.
+
+ The \l{QMutableListIterator::next()}{next()} function returns a
+ non-const reference to the item in the list. For simple
+ operations, we don't even need
+ \l{QMutableListIterator::setValue()}{setValue()}:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 6
+
+ As mentioned above, QLinkedList's, QVector's, and QSet's iterator
+ classes have exactly the same API as QList's. We will now turn to
+ QMapIterator, which is somewhat different because it iterates on
+ (key, value) pairs.
+
+ Like QListIterator, QMapIterator provides
+ \l{QMapIterator::toFront()}{toFront()},
+ \l{QMapIterator::toBack()}{toBack()},
+ \l{QMapIterator::hasNext()}{hasNext()},
+ \l{QMapIterator::next()}{next()},
+ \l{QMapIterator::peekNext()}{peekNext()},
+ \l{QMapIterator::hasPrevious()}{hasPrevious()},
+ \l{QMapIterator::previous()}{previous()}, and
+ \l{QMapIterator::peekPrevious()}{peekPrevious()}. The key and
+ value components are extracted by calling key() and value() on
+ the object returned by next(), peekNext(), previous(), or
+ peekPrevious().
+
+ The following example removes all (capital, country) pairs where
+ the capital's name ends with "City":
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 7
+
+ QMapIterator also provides a key() and a value() function that
+ operate directly on the iterator and that return the key and
+ value of the last item that the iterator jumped above. For
+ example, the following code copies the contents of a QMap into a
+ QHash:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 8
+
+ If we want to iterate through all the items with the same
+ value, we can use \l{QMapIterator::findNext()}{findNext()}
+ or \l{QMapIterator::findPrevious()}{findPrevious()}.
+ Here's an example where we remove all the items with a particular
+ value:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 9
+
+ \section2 STL-Style Iterators
+
+ STL-style iterators have been available since the release of Qt
+ 2.0. They are compatible with Qt's and STL's \l{generic
+ algorithms} and are optimized for speed.
+
+ For each container class, there are two STL-style iterator types:
+ one that provides read-only access and one that provides
+ read-write access. Read-only iterators should be used wherever
+ possible because they are faster than read-write iterators.
+
+ \table
+ \header \o Containers \o Read-only iterator
+ \o Read-write iterator
+ \row \o QList<T>, QQueue<T> \o QList<T>::const_iterator
+ \o QList<T>::iterator
+ \row \o QLinkedList<T> \o QLinkedList<T>::const_iterator
+ \o QLinkedList<T>::iterator
+ \row \o QVector<T>, QStack<T> \o QVector<T>::const_iterator
+ \o QVector<T>::iterator
+ \row \o QSet<T> \o QSet<T>::const_iterator
+ \o QSet<T>::iterator
+ \row \o QMap<Key, T>, QMultiMap<Key, T> \o QMap<Key, T>::const_iterator
+ \o QMap<Key, T>::iterator
+ \row \o QHash<Key, T>, QMultiHash<Key, T> \o QHash<Key, T>::const_iterator
+ \o QHash<Key, T>::iterator
+ \endtable
+
+ The API of the STL iterators is modelled on pointers in an array.
+ For example, the \c ++ operator advances the iterator to the next
+ item, and the \c * operator returns the item that the iterator
+ points to. In fact, for QVector and QStack, which store their
+ items at adjacent memory positions, the
+ \l{QVector::iterator}{iterator} type is just a typedef for \c{T *},
+ and the \l{QVector::iterator}{const_iterator} type is
+ just a typedef for \c{const T *}.
+
+ In this discussion, we will concentrate on QList and QMap. The
+ iterator types for QLinkedList, QVector, and QSet have exactly
+ the same interface as QList's iterators; similarly, the iterator
+ types for QHash have the same interface as QMap's iterators.
+
+ Here's a typical loop for iterating through all the elements of a
+ QList<QString> in order and converting them to lowercase:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 10
+
+ Unlike \l{Java-style iterators}, STL-style iterators point
+ directly at items. The begin() function of a container returns an
+ iterator that points to the first item in the container. The
+ end() function of a container returns an iterator to the
+ imaginary item one position past the last item in the container.
+ end() marks an invalid position; it must never be dereferenced.
+ It is typically used in a loop's break condition. If the list is
+ empty, begin() equals end(), so we never execute the loop.
+
+ The diagram below shows the valid iterator positions as red
+ arrows for a vector containing four items:
+
+ \img stliterators1.png
+
+ Iterating backward with an STL-style iterator requires us to
+ decrement the iterator \e before we access the item. This
+ requires a \c while loop:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 11
+
+ In the code snippets so far, we used the unary \c * operator to
+ retrieve the item (of type QString) stored at a certain iterator
+ position, and we then called QString::toLower() on it. Most C++
+ compilers also allow us to write \c{i->toLower()}, but some
+ don't.
+
+ For read-only access, you can use const_iterator, constBegin(),
+ and constEnd(). For example:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 12
+
+ The following table summarizes the STL-style iterators' API:
+
+ \table
+ \header \o Expression \o Behavior
+ \row \o \c{*i} \o Returns the current item
+ \row \o \c{++i} \o Advances the iterator to the next item
+ \row \o \c{i += n} \o Advances the iterator by \c n items
+ \row \o \c{--i} \o Moves the iterator back by one item
+ \row \o \c{i -= n} \o Moves the iterator back by \c n items
+ \row \o \c{i - j} \o Returns the number of items between iterators \c i and \c j
+ \endtable
+
+ The \c{++} and \c{--} operators are available both as prefix
+ (\c{++i}, \c{--i}) and postfix (\c{i++}, \c{i--}) operators. The
+ prefix versions modify the iterators and return a reference to
+ the modified iterator; the postfix versions take a copy of the
+ iterator before they modify it, and return that copy. In
+ expressions where the return value is ignored, we recommend that
+ you use the prefix operators (\c{++i}, \c{--i}), as these are
+ slightly faster.
+
+ For non-const iterator types, the return value of the unary \c{*}
+ operator can be used on the left side of the assignment operator.
+
+ For QMap and QHash, the \c{*} operator returns the value
+ component of an item. If you want to retrieve the key, call key()
+ on the iterator. For symmetry, the iterator types also provide a
+ value() function to retrieve the value. For example, here's how
+ we would print all items in a QMap to the console:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 13
+
+ Thanks to \l{implicit sharing}, it is very inexpensive for a
+ function to return a container per value. The Qt API contains
+ dozens of functions that return a QList or QStringList per value
+ (e.g., QSplitter::sizes()). If you want to iterate over these
+ using an STL iterator, you should always take a copy of the
+ container and iterate over the copy. For example:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 14
+
+ This problem doesn't occur with functions that return a const or
+ non-const reference to a container.
+
+ \l{Implicit sharing} has another consequence on STL-style
+ iterators: You must not take a copy of a container while
+ non-const iterators are active on that container. Java-style
+ iterators don't suffer from that limitation.
+
+ \keyword foreach
+ \section1 The foreach Keyword
+
+ If you just want to iterate over all the items in a container
+ in order, you can use Qt's \c foreach keyword. The keyword is a
+ Qt-specific addition to the C++ language, and is implemented
+ using the preprocessor.
+
+ Its syntax is: \c foreach (\e variable, \e container) \e
+ statement. For example, here's how to use \c foreach to iterate
+ over a QLinkedList<QString>:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 15
+
+ The \c foreach code is significantly shorter than the equivalent
+ code that uses iterators:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 16
+
+ Unless the data type contains a comma (e.g., \c{QPair<int,
+ int>}), the variable used for iteration can be defined within the
+ \c foreach statement:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 17
+
+ And like any other C++ loop construct, you can use braces around
+ the body of a \c foreach loop, and you can use \c break to leave
+ the loop:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 18
+
+ With QMap and QHash, \c foreach accesses the value component of
+ the (key, value) pairs. If you want to iterate over both the keys
+ and the values, you can use iterators (which are fastest), or you
+ can write code like this:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 19
+
+ For a multi-valued map:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 20
+
+ Qt automatically takes a copy of the container when it enters a
+ \c foreach loop. If you modify the container as you are
+ iterating, that won't affect the loop. (If you don't modify the
+ container, the copy still takes place, but thanks to \l{implicit
+ sharing} copying a container is very fast.) Similarly, declaring
+ the variable to be a non-const reference, in order to modify the
+ current item in the list will not work either.
+
+ In addition to \c foreach, Qt also provides a \c forever
+ pseudo-keyword for infinite loops:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 21
+
+ If you're worried about namespace pollution, you can disable
+ these macros by adding the following line to your \c .pro file:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 22
+
+ \section1 Other Container-Like Classes
+
+ Qt includes three template classes that resemble containers in
+ some respects. These classes don't provide iterators and cannot
+ be used with the \c foreach keyword.
+
+ \list
+ \o QVarLengthArray<T, Prealloc> provides a low-level
+ variable-length array. It can be used instead of QVector in
+ places where speed is particularly important.
+
+ \o QCache<Key, T> provides a cache to store objects of a certain
+ type T associated with keys of type Key.
+
+ \o QContiguousCache<T> provides an efficient way of caching data
+ that is typically accessed in a contiguous way.
+
+ \o QPair<T1, T2> stores a pair of elements.
+ \endlist
+
+ Additional non-template types that compete with Qt's template
+ containers are QBitArray, QByteArray, QString, and QStringList.
+
+ \section1 Algorithmic Complexity
+
+ Algorithmic complexity is concerned about how fast (or slow) each
+ function is as the number of items in the container grow. For
+ example, inserting an item in the middle of a QLinkedList is an
+ extremely fast operation, irrespective of the number of items
+ stored in the QLinkedList. On the other hand, inserting an item
+ in the middle of a QVector is potentially very expensive if the
+ QVector contains many items, since half of the items must be
+ moved one position in memory.
+
+ To describe algorithmic complexity, we use the following
+ terminology, based on the "big Oh" notation:
+
+ \keyword constant time
+ \keyword logarithmic time
+ \keyword linear time
+ \keyword linear-logarithmic time
+ \keyword quadratic time
+
+ \list
+ \o \bold{Constant time:} O(1). A function is said to run in constant
+ time if it requires the same amount of time no matter how many
+ items are present in the container. One example is
+ QLinkedList::insert().
+
+ \o \bold{Logarithmic time:} O(log \e n). A function that runs in
+ logarithmic time is a function whose running time is
+ proportional to the logarithm of the number of items in the
+ container. One example is qBinaryFind().
+
+ \o \bold{Linear time:} O(\e n). A function that runs in linear time
+ will execute in a time directly proportional to the number of
+ items stored in the container. One example is
+ QVector::insert().
+
+ \o \bold{Linear-logarithmic time:} O(\e{n} log \e n). A function
+ that runs in linear-logarithmic time is asymptotically slower
+ than a linear-time function, but faster than a quadratic-time
+ function.
+
+ \o \bold{Quadratic time:} O(\e{n}\unicode{178}). A quadratic-time function
+ executes in a time that is proportional to the square of the
+ number of items stored in the container.
+ \endlist
+
+ The following table summarizes the algorithmic complexity of Qt's
+ sequential container classes:
+
+ \table
+ \header \o \o Index lookup \o Insertion \o Prepending \o Appending
+ \row \o QLinkedList<T> \o O(\e n) \o O(1) \o O(1) \o O(1)
+ \row \o QList<T> \o O(1) \o O(n) \o Amort. O(1) \o Amort. O(1)
+ \row \o QVector<T> \o O(1) \o O(n) \o O(n) \o Amort. O(1)
+ \endtable
+
+ In the table, "Amort." stands for "amortized behavior". For
+ example, "Amort. O(1)" means that if you call the function
+ only once, you might get O(\e n) behavior, but if you call it
+ multiple times (e.g., \e n times), the average behavior will be
+ O(1).
+
+ The following table summarizes the algorithmic complexity of Qt's
+ associative containers and sets:
+
+ \table
+ \header \o{1,2} \o{2,1} Key lookup \o{2,1} Insertion
+ \header \o Average \o Worst case \o Average \o Worst case
+ \row \o QMap<Key, T> \o O(log \e n) \o O(log \e n) \o O(log \e n) \o O(log \e n)
+ \row \o QMultiMap<Key, T> \o O(log \e n) \o O(log \e n) \o O(log \e n) \o O(log \e n)
+ \row \o QHash<Key, T> \o Amort. O(1) \o O(\e n) \o Amort. O(1) \o O(\e n)
+ \row \o QSet<Key> \o Amort. O(1) \o O(\e n) \o Amort. O(1) \o O(\e n)
+ \endtable
+
+ With QVector, QHash, and QSet, the performance of appending items
+ is amortized O(log \e n). It can be brought down to O(1) by
+ calling QVector::reserve(), QHash::reserve(), or QSet::reserve()
+ with the expected number of items before you insert the items.
+ The next section discusses this topic in more depth.
+
+ \section1 Growth Strategies
+
+ QVector<T>, QString, and QByteArray store their items
+ contiguously in memory; QList<T> maintains an array of pointers
+ to the items it stores to provide fast index-based access (unless
+ T is a pointer type or a basic type of the size of a pointer, in
+ which case the value itself is stored in the array); QHash<Key,
+ T> keeps a hash table whose size is proportional to the number
+ of items in the hash. To avoid reallocating the data every single
+ time an item is added at the end of the container, these classes
+ typically allocate more memory than necessary.
+
+ Consider the following code, which builds a QString from another
+ QString:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 23
+
+ We build the string \c out dynamically by appending one character
+ to it at a time. Let's assume that we append 15000 characters to
+ the QString string. Then the following 18 reallocations (out of a
+ possible 15000) occur when QString runs out of space: 4, 8, 12,
+ 16, 20, 52, 116, 244, 500, 1012, 2036, 4084, 6132, 8180, 10228,
+ 12276, 14324, 16372. At the end, the QString has 16372 Unicode
+ characters allocated, 15000 of which are occupied.
+
+ The values above may seem a bit strange, but here are the guiding
+ principles:
+ \list
+ \o QString allocates 4 characters at a time until it reaches size 20.
+ \o From 20 to 4084, it advances by doubling the size each time.
+ More precisely, it advances to the next power of two, minus
+ 12. (Some memory allocators perform worst when requested exact
+ powers of two, because they use a few bytes per block for
+ book-keeping.)
+ \o From 4084 on, it advances by blocks of 2048 characters (4096
+ bytes). This makes sense because modern operating systems
+ don't copy the entire data when reallocating a buffer; the
+ physical memory pages are simply reordered, and only the data
+ on the first and last pages actually needs to be copied.
+ \endlist
+
+ QByteArray and QList<T> use more or less the same algorithm as
+ QString.
+
+ QVector<T> also uses that algorithm for data types that can be
+ moved around in memory using memcpy() (including the basic C++
+ types, the pointer types, and Qt's \l{shared classes}) but uses a
+ different algorithm for data types that can only be moved by
+ calling the copy constructor and a destructor. Since the cost of
+ reallocating is higher in that case, QVector<T> reduces the
+ number of reallocations by always doubling the memory when
+ running out of space.
+
+ QHash<Key, T> is a totally different case. QHash's internal hash
+ table grows by powers of two, and each time it grows, the items
+ are relocated in a new bucket, computed as qHash(\e key) %
+ QHash::capacity() (the number of buckets). This remark applies to
+ QSet<T> and QCache<Key, T> as well.
+
+ For most applications, the default growing algorithm provided by
+ Qt does the trick. If you need more control, QVector<T>,
+ QHash<Key, T>, QSet<T>, QString, and QByteArray provide a trio of
+ functions that allow you to check and specify how much memory to
+ use to store the items:
+
+ \list
+ \o \l{QString::capacity()}{capacity()} returns the
+ number of items for which memory is allocated (for QHash and
+ QSet, the number of buckets in the hash table).
+ \o \l{QString::reserve()}{reserve}(\e size) explicitly
+ preallocates memory for \e size items.
+ \o \l{QString::squeeze()}{squeeze()} frees any memory
+ not required to store the items.
+ \endlist
+
+ If you know approximately how many items you will store in a
+ container, you can start by calling reserve(), and when you are
+ done populating the container, you can call squeeze() to release
+ the extra preallocated memory.
+*/
diff --git a/doc/src/frameworks-technologies/dbus-adaptors.qdoc b/doc/src/frameworks-technologies/dbus-adaptors.qdoc
new file mode 100644
index 0000000..890cac3
--- /dev/null
+++ b/doc/src/frameworks-technologies/dbus-adaptors.qdoc
@@ -0,0 +1,494 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page usingadaptors.html
+ \title Using QtDBus Adaptors
+
+ \ingroup best-practices
+
+ Adaptors are special classes that are attached to any QObject-derived class
+ and provide the interface to the external world using D-Bus. Adaptors are
+ intended to be lightweight classes whose main purpose is to relay calls to
+ and from the real object, possibly validating or converting the input from
+ the external world and, thus, protecting the real object.
+
+ Unlike multiple inheritance, adaptors can be added at any time to any object
+ (but not removed), which allows for greater flexibility when exporting
+ existing classes. Another advantage of adaptors is to provide similar but not
+ identical functionality in methods of the same name in different interfaces,
+ a case which can be quite common when adding a new version of a standard
+ interface to an object.
+
+ In order to use an adaptor, one must create a class which inherits
+ QDBusAbstractAdaptor. Since that is a standard QObject-derived class, the
+ Q_OBJECT macro must appear in the declaration and the source file must be
+ processed with the \l {moc} tool. The class must also contain one
+ Q_CLASSINFO entry with the \c {"D-Bus Interface"} name, declaring which
+ interface it is exporting. Only one entry per class is supported.
+
+ Any public slot in the class will be accessible through the bus over messages
+ of the MethodCall type. (See \l {Declaring Slots in D-Bus Adaptors} for more
+ information). Signals in the class will be automatically relayed over D-Bus.
+ However, not all types are allowed signals or slots' parameter lists: see
+ \l {The QtDBus Type System} for more information.
+
+ Also, any property declared with Q_PROPERTY will be automatically exposed
+ over the Properties interface on D-Bus. Since the QObject property system
+ does not allow for non-readable properties, it is not possible to declare
+ write-only properties using adaptors.
+
+ More information:
+ \list
+ \o \l{Declaring Slots in D-Bus Adaptors}
+ \o \l{Declaring Signals in D-Bus Adaptors}
+ \o \l{The QtDBus Type System}
+ \o \l{D-Bus Adaptor Example}
+ \endlist
+
+ \sa QDBusAbstractAdaptor
+*/
+
+/*!
+ \page qdbusadaptorexample.html
+ \title D-Bus Adaptor Example
+
+ \previouspage The QtDBus Type System
+ \contentspage Using QtDBus Adaptors
+
+ The following example code shows how a D-Bus interface can be implemented
+ using an adaptor.
+
+ A sample usage of QDBusAbstractAdaptor is as follows:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 0
+
+ The code above would create an interface that could be represented more or less in the following
+ canonical representation:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 1
+
+ This adaptor could be used in the application's main function as follows
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 2
+
+ Break-down analysis:
+ \tableofcontents
+
+ \section1 The header
+
+ The header of the example is:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 3
+
+ The code does the following:
+ \list
+ \o it declares the adaptor MainApplicationAdaptor, which descends from QDBusAbstractAdaptor
+ \o it declares the Qt meta-object data using the Q_OBJECT macro
+ \o it declares the name of the D-Bus interface it implements.
+ \endlist
+
+ \section1 The properties
+
+ The properties are declared as follows:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 4
+
+ And are implemented as follows:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 5
+
+ The code declares three properties: one of them is a read-write property called "caption" of
+ string type. The other two are read-only, also of the string type.
+
+ The properties organizationName and organizationDomain are simple relays of the app object's
+ organizationName and organizationDomain properties. However, the caption property requires
+ verifying if the application has a main window associated with it: if there isn't any, the
+ caption property is empty. Note how it is possible to access data defined in other objects
+ through the getter/setter functions.
+
+ \section1 The constructor
+
+ The constructor:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 6
+
+ The constructor does the following:
+ \list
+ \o it initialises its base class (QDBusAbstractAdaptor) with the parent object it is related to.
+ \o it stores the app pointer in a member variable. Note that it would be possible to access the
+ same object using the QDBusAbstractAdaptor::object() function, but it would be necessary to
+ use \a static_cast<> to properly access the methods in QApplication that are not part of
+ QObject.
+ \o it connects the application's signal \a aboutToQuit to its own signal \a aboutToQuit.
+ \o it connects the application's signal \a focusChanged to a private slot to do some further
+ processing before emitting a D-Bus signal.
+ \endlist
+
+ Note that there is no destructor in the example. An eventual destructor could be used to emit
+ one last signal before the object is destroyed, for instance.
+
+ \section1 Slots/methods
+
+ The public slots in the example (which will be exported as D-Bus methods) are the following:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 7
+
+ This snippet of code defines 4 methods with different properties each:
+ \list 1
+ \o \c quit: this method takes no parameters and is defined to be asynchronous. That is, callers
+ are expected to use "fire-and-forget" mechanism when calling this method, since it provides no
+ useful reply. This is represented in D-Bus by the use of the
+ org.freedesktop.DBus.Method.NoReply annotation. See \l Q_NOREPLY for more information on
+ asynchronous methods
+
+ \o \c reparseConfiguration: this simple method, with no input or output arguments simply relays
+ the call to the application's reparseConfiguration member function.
+
+ \o \c mainWindowObject: this method takes no input parameter, but returns one string output
+ argument, containing the path to the main window object (if the application has a main
+ window), or an empty string if it has no main window. Note that this method could have also
+ been written: void mainWindowObject(QString &path).
+
+ \o \c setSessionManagement: this method takes one input argument (a boolean) and, depending on
+ its value, it calls one function or another in the application.
+ \endlist
+
+ See also: \l Q_NOREPLY.
+
+ \section1 Signals
+
+ The signals in this example are defined as follows:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 8
+
+ However, signal definition isn't enough: signals have to be emitted. One simple way of emitting
+ signals is to connect another signal to them, so that Qt's signal handling system chains them
+ automatically. This is what is done for the \a aboutToQuit signal.
+
+ When this is the case, one can use the QDBusAbstractAdaptor::setAutoRelaySignals to
+ automatically connect every signal from the real object to the adaptor.
+
+ When simple signal-to-signal connection isn't enough, one can use a private slot do do some
+ work. This is what was done for the mainWindowHasFocus signal:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 9
+
+ This private slot (which will not be exported as a method via D-Bus) was connected to the
+ \c focusChanged signal in the adaptor's constructor. It is therefore able to shape the
+ application's signal into what the interface expects it to be.
+*/
+
+/*!
+ \page qdbusdeclaringslots.html
+ \title Declaring Slots in D-Bus Adaptors
+
+ \contentspage Using QtDBus Adaptors
+ \nextpage Declaring Signals in D-Bus Adaptors
+
+ Slots in D-Bus adaptors are declared just like normal, public slots, but their
+ parameters must follow certain rules (see \l{The QtDBus Type System} for more
+ information). Slots whose parameters do not follow those rules or that are not
+ public will not be accessible via D-Bus.
+
+ Slots can have one parameter of type \c{const QDBusMessage &}, which must
+ appear at the end of the input parameter list, before any output parameters.
+ This parameter, if present, will be initialized with a copy of the
+ current message being processed, which allows the callee to obtain
+ information about the caller, such as its connection name.
+
+ Slots can be of three kinds:
+ \list 1
+ \o Asynchronous
+ \o Input-only
+ \o Input-and-output
+ \endlist
+
+ \section1 Asynchronous Slots
+ Asynchronous slots are those that do not normally return any reply to the
+ caller. For that reason, they cannot take any output parameters. In most
+ cases, by the time the first line of the slot is run, the caller function
+ has already resumed working.
+
+ However, slots must not rely on that behavior. Scheduling and message-dispatching
+ issues could change the order in which the slot is run. Code intending to
+ synchronize with the caller should provide its own method of synchronization.
+
+ Asynchronous slots are marked by the keyword \l Q_NOREPLY in the method
+ signature, before the \c void return type and the slot name. (See the
+ \c quit() slot in the \l{D-Bus Adaptor Example}).
+
+ \section1 Input-Only Slots
+
+ Input-only slots are normal slots that take parameters passed by value or
+ by constant reference. However, unlike asynchronous slots, the caller is
+ usually waiting for completion of the callee before resuming operation.
+ Therefore, non-asynchronous slots should not block or should state it its
+ documentation that they may do so.
+
+ Input-only slots have no special marking in their signature, except that
+ they take only parameters passed by value or by constant reference.
+ Optionally, slots can take a QDBusMessage parameter as a last parameter,
+ which can be used to perform additional analysis of the method call message.
+
+ \section1 Input and Output Slots
+
+ Like input-only slots, input-and-output slots are those that the caller is
+ waiting for a reply. Unlike input-only ones, though, this reply will contain
+ data. Slots that output data may contain non-constant references and may
+ return a value as well. However, the output parameters must all appear at
+ the end of the argument list and may not have input arguments interleaved.
+ Optionally, a QDBusMessage argument may appear between the input and the
+ output arguments.
+
+ \section1 Automatic Replies
+
+ Method replies are generated automatically with the contents of the output
+ parameters (if there were any) by the QtDBus implementation. Slots need not
+ worry about constructing proper QDBusMessage objects and sending them over
+ the connection.
+
+ However, the possibility of doing so remains there. Should the slot find out
+ it needs to send a special reply or even an error, it can do so by using
+ QDBusMessage::createReply() or QDBusMessage::createErrorReply() on the
+ QDBusMessage parameter and send it with QDBusConnection::send(). The
+ QtDBus implementation will not generate any reply if the slot did so.
+
+ \warning When a caller places a method call and waits for a reply, it will
+ only wait for a limited amount of time. Slots intending to take a long time
+ to complete should make that fact clear in documentation so that callers
+ properly set higher timeouts.
+
+ \section1 Delayed Replies
+
+ In some circumstances, the called slot may not be able to process
+ the request immediately. This is frequently the case when the
+ request involves an I/O or networking operation which may block.
+
+ If this is the case, the slot should return control to the
+ application's main loop to avoid freezing the user interface, and
+ resume the process later. To accomplish this, it should make use
+ of the extra \c QDBusMessage parameter at the end of the input
+ parameter list and request a delayed reply.
+
+ We do this by writing a slot that stores the request data in a
+ persistent structure, indicating to the caller using
+ \l{QDBusMessage::setDelayedReply()}{QDBusMessage::setDelayedReply(true)}
+ that the response will be sent later.
+
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 10
+
+ The use of
+ \l{QDBusConnection::send()}{QDBusConnection::sessionBus().send(data->reply)}
+ is needed to explicitly inform the caller that the response will be delayed.
+ In this case, the return value is unimportant; we return an arbitrary value
+ to satisfy the compiler.
+
+ When the request is processed and a reply is available, it should be sent
+ using the \c QDBusMessage object that was obtained. In our example, the
+ reply code could be something as follows:
+
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 11
+
+ As can be seen in the example, when a delayed reply is in place,
+ the return value(s) from the slot will be ignored by QtDBus. They
+ are used only to determine the slot's signature when communicating
+ the adaptor's description to remote applications, or in case the
+ code in the slot decides not to use a delayed reply.
+
+ The delayed reply itself is requested from QtDBus by calling
+ QDBusMessage::reply() on the original message. It then becomes the
+ resposibility of the called code to eventually send a reply to the
+ caller.
+
+ \warning When a caller places a method call and waits for a reply, it will
+ only wait for a limited amount of time. Slots intending to take a long time
+ to complete should make that fact clear in documentation so that callers
+ properly set higher timeouts.
+
+ \sa {Using QtDBus Adaptors}, {Declaring Signals in D-Bus Adaptors},
+ {The QtDBus Type System}, QDBusConnection, QDBusMessage
+*/
+
+/*!
+ \page qdbusdeclaringsignals.html
+ \title Declaring Signals in D-Bus Adaptors
+
+ \previouspage Declaring Slots in D-Bus Adaptors
+ \contentspage Using QtDBus Adaptors
+ \nextpage The QtDBus Type System
+
+ Any signal in a class derived from QDBusAbstractAdaptor will be automatically
+ relayed into D-Bus, provided that the signal's parameters conform to certain
+ rules (see \l{The QtDBus Type System} for more information). No special code
+ is necessary to make this relay.
+
+ However, signals must still be emitted. The easiest way to emit an adaptor
+ signal is to connect another signal to it, so that Qt's signals and slots
+ mechanism automatically emits the adaptor signal, too. This can be done in
+ the adaptor's constructor, as has been done in the
+ \l{D-Bus Adaptor Example}{D-Bus Adaptor example}.
+
+ The QDBusAbstractAdaptor::setAutoRelaySignals() convenience function can also
+ be used to make and break connections between signals in the real object and
+ the corresponding signals in the adaptor. It will inspect the list of signals
+ in both classes and connect those whose parameters match exactly.
+
+ \sa {Using QtDBus Adaptors},
+ {Declaring Slots in D-Bus Adaptors},
+ {The QtDBus Type System}, QDBusAbstractAdaptor
+*/
+
+/*!
+ \page qdbustypesystem.html
+ \title The QtDBus Type System
+
+ \previouspage Declaring Signals in D-Bus Adaptors
+ \contentspage Using QtDBus Adaptors
+ \nextpage D-Bus Adaptor Example
+
+ D-Bus has an extensible type system based on a few primitives and
+ composition of the primitives in arrays and structures. QtDBus
+ implements the interface to that type system through the
+ QDBusArgument class, allowing user programs to send and receive
+ practically every C++ type over the bus.
+
+ \section1 Primitive Types
+
+ The primitive types are supported natively by QDBusArgument and
+ need no special customization to be sent or received. They are
+ listed below, along with the C++ class they relate to:
+
+ \table
+ \header
+ \o Qt type
+ \o D-Bus equivalent type
+ \row
+ \o uchar
+ \o BYTE
+ \row
+ \o bool
+ \o BOOLEAN
+ \row
+ \o short
+ \o INT16
+ \row
+ \o ushort
+ \o UINT16
+ \row
+ \o int
+ \o INT32
+ \row
+ \o uint
+ \o UINT32
+ \row
+ \o qlonglong
+ \o INT64
+ \row
+ \o qulonglong
+ \o UINT64
+ \row
+ \o double
+ \o DOUBLE
+ \row
+ \o QString
+ \o STRING
+ \row
+ \o QDBusVariant
+ \o VARIANT
+ \row
+ \o QDBusObjectPath
+ \o OBJECT_PATH
+ \row
+ \o QDBusSignature
+ \o SIGNATURE
+ \endtable
+
+ Aside from the primitive types, QDBusArgument also supports two
+ non-primitive types natively, due to their widespread use in Qt
+ applications: QStringList and QByteArray.
+
+ \section1 Compound Types
+
+ D-Bus specifies three types of aggregations of primitive types
+ that allow one to create compound types. They are \c ARRAY, \c
+ STRUCT and maps/dictionaries.
+
+ Arrays are sets of zero or more elements of the same type, while
+ structures are a set of a fixed number of elements, each of any
+ type. Maps or dictionaries are implemented as arrays of a pair of
+ elements, so there can be zero or more elements in one map.
+
+ \section1 Extending the Type System
+
+ In order to use one's own type with QtDBus, the type has to be
+ declared as a Qt meta-type with the Q_DECLARE_METATYPE() macro and
+ registered with the qDBusRegisterMetaType() function. The
+ streaming operators \c{operator>>} and \c{operator<<} will be
+ automatically found by the registration system.
+
+ QtDBus provides template specializations for arrays and maps for
+ use with Qt's \l{Container classes}{container classes}, such as
+ QMap and QList, so it is not necessary to write the streaming
+ operator functions for those. For other types, and specially for
+ types implementing structures, the operators have to be explicitly
+ implemented.
+
+ See the documentation for QDBusArgument for examples for
+ structures, arrays and maps.
+
+ \section1 The Type System in Use
+
+ All of the QtDBus types (primitives and user-defined alike) can be
+ used to send and receive messages of all types over the bus.
+
+ \warning You may not use any type that is not on the list above,
+ including \a typedefs to the types listed. This also includes
+ QList<QVariant> and QMap<QString,QVariant>.
+*/
+
+/*!
+ \macro Q_NOREPLY
+ \relates QDBusAbstractAdaptor
+ \since 4.2
+
+ The Q_NOREPLY macro can be used to mark a method to be called and not wait for it to finish
+ processing before returning from QDBusInterface::call(). The called method cannot return any
+ output arguments and, if it does, any such arguments will be discarded.
+
+ You can use this macro in your own adaptors by placing it before your method's return value
+ (which must be "void") in the class declaration, as shown in the example:
+ \snippet doc/src/snippets/code/doc_src_qdbusadaptors.qdoc 12
+
+ Its presence in the method implementation (outside the class declaration) is optional.
+
+ \sa {Using QtDBus Adaptors}
+*/
diff --git a/doc/src/frameworks-technologies/dbus-intro.qdoc b/doc/src/frameworks-technologies/dbus-intro.qdoc
new file mode 100644
index 0000000..9a9b4c6
--- /dev/null
+++ b/doc/src/frameworks-technologies/dbus-intro.qdoc
@@ -0,0 +1,229 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page intro-to-dbus.html
+ \title Introduction to D-Bus
+ \brief An introduction to Inter-Process Communication and Remote Procedure Calling with D-Bus.
+
+ \keyword QtDBus
+ \ingroup frameworks-technologies
+
+ \section1 Introduction
+
+ D-Bus is an Inter-Process Communication (IPC) and Remote Procedure
+ Calling (RPC) mechanism originally developed for Linux to replace
+ existing and competing IPC solutions with one unified protocol. It
+ has also been designed to allow communication between system-level
+ processes (such as printer and hardware driver services) and
+ normal user processes.
+
+ It uses a fast, binary message-passing protocol, which is suitable
+ for same-machine communication due to its low latency and low
+ overhead. Its specification is currently defined by the
+ \tt{freedesktop.org} project, and is available to all parties.
+
+ Communication in general happens through a central server
+ application, called the "bus" (hence the name), but direct
+ application-to-application communication is also possible. When
+ communicating on a bus, applications can query which other
+ applications and services are available, as well as activate one
+ on demand.
+
+ \section1 The Buses
+
+ D-Bus buses are used to when many-to-many communication is
+ desired. In order to achieve that, a central server is launched
+ before any applications can connect to the bus: this server is
+ responsible for keeping track of the applications that are
+ connected and for properly routing messages from their source to
+ their destination.
+
+ In addition, D-Bus defines two well-known buses, called the
+ system bus and the session bus. These buses are special in the
+ sense that they have well-defined semantics: some services are
+ defined to be found in one or both of these buses.
+
+ For example, an application wishing to query the list of hardware
+ devices attached to the computer will probably communicate to a
+ service available on the system bus, while the service providing
+ opening of the user's web browser will be probably found on the
+ session bus.
+
+ On the system bus, one can also expect to find restrictions on
+ what services each application is allowed to offer. Therefore, one
+ can be reasonably certain that, if a certain service is present,
+ it is being offered by a trusted application.
+
+ \section1 Concepts
+
+ \section2 Messages
+
+ On the low level, applications communicate over D-Bus by sending
+ messages to one another. Messages are used to relay the remote
+ procedure calls as well as the replies and errors associated
+ with them. When used over a bus, messages have a destination,
+ which means they are routed only to the interested parties,
+ avoiding congestion due to "swarming" or broadcasting.
+
+ A special kind of message called a "signal message"
+ (a concept based on Qt's \l {Signals and Slots} mechanism),
+ however, does not have a pre-defined destination. Since its
+ purpose is to be used in a one-to-many context, signal messages
+ are designed to work over an "opt-in" mechanism.
+
+ The QtDBus module fully encapsulates the low-level concept of
+ messages into a simpler, object-oriented approach familiar to Qt
+ developers. In most cases, the developer need not worry about
+ sending or receiving messages.
+
+ \section2 Service Names
+
+ When communicating over a bus, applications obtain what is
+ called a "service name": it is how that application chooses to be
+ known by other applications on the same bus. The service names
+ are brokered by the D-Bus bus daemon and are used to
+ route messages from one application to another. An analogous
+ concept to service names are IP addresses and hostnames: a
+ computer normally has one IP address and may have one or more
+ hostnames associated with it, according to the services that it
+ provides to the network.
+
+ On the other hand, if a bus is not used, service names are also
+ not used. If we compare this to a computer network again, this
+ would equate to a point-to-point network: since the peer is
+ known, there is no need to use hostnames to find it or its IP
+ address.
+
+ The format of a D-Bus service name is in fact very similar to a
+ host name: it is a dot-separated sequence of letters and
+ digits. The common practice is even to name one's service name
+ according to the domain name of the organization that defined
+ that service.
+
+ For example, the D-Bus service is defined by
+ \tt{freedesktop.org} and can be found on the bus under the
+ service name:
+
+ \snippet doc/src/snippets/code/doc_src_introtodbus.qdoc 0
+
+ \section2 Object Paths
+
+ Like network hosts, applications provide specific services to
+ other applications by exporting objects. Those objects are
+ hierarchically organised, much like the parent-child
+ relationship that classes derived from QObject possess. One
+ difference, however, is that there is the concept of "root
+ object", that all objects have as ultimate parent.
+
+ If we continue our analogy with Web services, object paths
+ equate to the path part of a URL:
+
+ \img qurl-ftppath.png
+
+ Like them, object paths in D-Bus are formed resembling path
+ names on the filesystem: they are slash-separated labels, each
+ consisting of letters, digits and the underscore character
+ ("_"). They must always start with a slash and must not end with
+ one.
+
+ \section2 Interfaces
+
+ Interfaces are similar to C++ abstract classes and Java's
+ \c interface keyword and declare the "contract" that is
+ established between caller and callee. That is, they establish
+ the names of the methods, signals and properties that are
+ available as well as the behavior that is expected from either
+ side when communication is established.
+
+ Qt uses a very similar mechanism in its \l {How to Create Qt
+ Plugins}{Plugin system}: Base classes in C++ are associated
+ with a unique identifier by way of the Q_DECLARE_INTERFACE()
+ macro.
+
+ D-Bus interface names are, in fact, named in a manner similar to
+ what is suggested by the Qt Plugin System: an identifier usually
+ constructed from the domain name of the entity that defined that
+ interface.
+
+ \section2 Cheat Sheet
+
+ To facilitate remembering of the naming formats and their
+ purposes, the following table can be used:
+
+ \table 90%
+ \header \o D-Bus Concept \o Analogy \o Name format
+ \row \o Service name \o Network hostnames \o Dot-separated
+ ("looks like a hostname")
+ \row \o Object path \o URL path component \o Slash-separated
+ ("looks like a path")
+ \row \o Interface \o Plugin identifier \o Dot-separated
+ \endtable
+
+ \section1 Debugging
+
+ When developing applications that use D-Bus, it is sometimes useful to be able
+ to see information about the messages that are sent and received across the
+ bus by each application.
+
+ This feature can be enabled on a per-application basis by setting the
+ \c QDBUS_DEBUG environment variable before running each application.
+ For example, we can enable debugging only for the car in the
+ \l{D-Bus Remote Controlled Car Example} by running the controller and the
+ car in the following way:
+
+ \snippet doc/src/snippets/code/doc_src_introtodbus.qdoc QDBUS_DEBUG
+
+ Information about the messages will be written to the console the application
+ was launched from.
+
+ \section1 Further Reading
+
+ The following documents contain information about Qt's D-Bus integration
+ features, and provide details about the mechanisms used to send and receive
+ type information over the bus:
+
+ \list
+ \o \l{Using QtDBus Adaptors}
+ \o \l{The QtDBus Type System}
+ \o \l{QtDBus XML compiler (qdbusxml2cpp)}
+ \endlist
+*/
diff --git a/doc/src/frameworks-technologies/desktop-integration.qdoc b/doc/src/frameworks-technologies/desktop-integration.qdoc
new file mode 100644
index 0000000..d7c8590
--- /dev/null
+++ b/doc/src/frameworks-technologies/desktop-integration.qdoc
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group desktop
+ \title Desktop Integration Classes
+*/
+
+/*!
+ \page desktop-integration.html
+ \title Desktop Integration
+ \brief Integrating with the user's desktop environment.
+
+ \ingroup best-practices
+
+ Qt applications behave well in the user's desktop environment, but certain
+ integrations require additional, and sometimes platform specific, techniques.
+
+ \tableofcontents
+
+ \section1 Useful Classes
+
+ Various classes in Qt are designed to help developers integrate applications into
+ users' desktop environments. These classes enable developers to take advantage
+ of native services while still using a cross-platform API.
+
+ \annotatedlist desktop
+
+ \section1 Setting the Application Icon
+
+ In order to change the icon of the executable application file
+ itself, as it is presented on the desktop (i.e., prior to
+ application execution), it is necessary to employ another,
+ platform-dependent technique.
+
+ \tableofcontents {1 Setting the Application Icon}
+
+ \section1 Opening External Resources
+
+ Although Qt provides facilities to handle and display resources, such as
+ \l{QImageIOHandler}{common image formats} and \l{QTextDocument}{HTML},
+ it is sometimes necessary to open files and external resources using external
+ applications.
+
+ QDesktopServices provides an interface to services offered by the user's desktop
+ environment. In particular, the \l{QDesktopServices::}{openUrl()} function is
+ used to open resources using the appropriate application, which may have been
+ specifically configured by the user.
+
+ \section1 System Tray Icons
+
+ Many modern desktop environments feature docks or panels with \e{system trays}
+ in which applications can install icons. Applications often use system tray icons
+ to display status information, either by updating the icon itself or by showing
+ information in "balloon messages". Additionally, many applications provide
+ pop-up menus that can be accessed via their system tray icons.
+
+ The QSystemTrayIcon class exposes all of the above features via an intuitive
+ Qt-style API that can be used on all desktop platforms.
+
+ \section1 Desktop Widgets
+
+ On systems where the user's desktop is displayed using more than one screen,
+ certain types of applications may need to obtain information about the
+ configuration of the user's workspace to ensure that new windows and dialogs
+ are opened in appropriate locations.
+
+ The QDesktopWidget class can be used to monitor the positions of widgets and
+ notify applications about changes to the way the desktop is split over the
+ available screens. This enables applications to implement policies for
+ positioning new windows so that, for example, they do not distract a user
+ who is working on a specific task.
+*/
diff --git a/doc/src/frameworks-technologies/dnd.qdoc b/doc/src/frameworks-technologies/dnd.qdoc
new file mode 100644
index 0000000..95ddced
--- /dev/null
+++ b/doc/src/frameworks-technologies/dnd.qdoc
@@ -0,0 +1,449 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group draganddrop
+ \title Drag And Drop Classes
+
+ \brief Classes dealing with drag and drop and mime type encoding and decoding.
+*/
+
+/*!
+ \page dnd.html
+ \title Drag and Drop
+ \brief An overview of the drag and drop system provided by Qt.
+
+ \ingroup frameworks-technologies
+
+ Drag and drop provides a simple visual mechanism which users can use
+ to transfer information between and within applications. (In the
+ literature this is referred to as a "direct manipulation model".) Drag
+ and drop is similar in function to the clipboard's cut and paste
+ mechanism.
+
+ \tableofcontents
+
+ This document describes the basic drag and drop mechanism and
+ outlines the approach used to enable it in custom widgets. Drag
+ and drop operations are also supported by Qt's item views and by
+ the graphics view framework; more information is available in the
+ \l{Using Drag and Drop with Item Views} and \l{The Graphics View
+ Framework} documents.
+
+ \section1 Drag and Drop Classes
+
+ These classes deal with drag and drop and the necessary mime type
+ encoding and decoding.
+
+ \annotatedlist draganddrop
+
+ \section1 Configuration
+
+ The QApplication object provides some properties that are related
+ to drag and drop operations:
+
+ \list
+ \i \l{QApplication::startDragTime} describes the amount of time in
+ milliseconds that the user must hold down a mouse button over an
+ object before a drag will begin.
+ \i \l{QApplication::startDragDistance} indicates how far the user has to
+ move the mouse while holding down a mouse button before the movement
+ will be interpreted as dragging. Use of high values for this quantity
+ prevents accidental dragging when the user only meant to click on an
+ object.
+ \endlist
+
+ These quantities provide sensible default values for you to use if you
+ provide drag and drop support in your widgets.
+
+ \section1 Dragging
+
+ To start a drag, create a QDrag object, and call its
+ exec() function. In most applications, it is a good idea to begin a drag
+ and drop operation only after a mouse button has been pressed and the
+ cursor has been moved a certain distance. However, the simplest way to
+ enable dragging from a widget is to reimplement the widget's
+ \l{QWidget::mousePressEvent()}{mousePressEvent()} and start a drag
+ and drop operation:
+
+ \snippet doc/src/snippets/dragging/mainwindow.cpp 0
+ \dots 8
+ \snippet doc/src/snippets/dragging/mainwindow.cpp 2
+
+ Although the user may take some time to complete the dragging operation,
+ as far as the application is concerned the exec() function is a blocking
+ function that returns with \l{Qt::DropActions}{one of several values}.
+ These indicate how the operation ended, and are described in more detail
+ below.
+
+ Note that the exec() function does not block the main event loop.
+
+ For widgets that need to distinguish between mouse clicks and drags, it
+ is useful to reimplement the widget's
+ \l{QWidget::mousePressEvent()}{mousePressEvent()} function to record to
+ start position of the drag:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 6
+
+ Later, in \l{QWidget::mouseMoveEvent()}{mouseMoveEvent()}, we can determine
+ whether a drag should begin, and construct a drag object to handle the
+ operation:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 7
+ \dots
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 8
+
+ This particular approach uses the \l QPoint::manhattanLength() function
+ to get a rough estimate of the distance between where the mouse click
+ occurred and the current cursor position. This function trades accuracy
+ for speed, and is usually suitable for this purpose.
+
+ \section1 Dropping
+
+ To be able to receive media dropped on a widget, call
+ \l{QWidget::setAcceptDrops()}{setAcceptDrops(true)} for the widget,
+ and reimplement the \l{QWidget::dragEnterEvent()}{dragEnterEvent()} and
+ \l{QWidget::dropEvent()}{dropEvent()} event handler functions.
+
+ For example, the following code enables drop events in the constructor of
+ a QWidget subclass, making it possible to usefully implement drop event
+ handlers:
+
+ \snippet doc/src/snippets/dropevents/window.cpp 0
+ \dots
+ \snippet doc/src/snippets/dropevents/window.cpp 1
+ \snippet doc/src/snippets/dropevents/window.cpp 2
+
+ The dragEnterEvent() function is typically used to inform Qt about the
+ types of data that the widget accepts.
+ You must reimplement this function if you want to receive either
+ QDragMoveEvent or QDropEvent in your reimplementations of
+ \l{QWidget::dragMoveEvent()}{dragMoveEvent()} and
+ \l{QWidget::dropEvent()}{dropEvent()}.
+
+ The following code shows how \l{QWidget::dragEnterEvent()}{dragEnterEvent()}
+ can be reimplemented to
+ tell the drag and drop system that we can only handle plain text:
+
+ \snippet doc/src/snippets/dropevents/window.cpp 3
+
+ The \l{QWidget::dropEvent()}{dropEvent()} is used to unpack dropped data
+ and handle it in way that is suitable for your application.
+
+ In the following code, the text supplied in the event is passed to a
+ QTextBrowser and a QComboBox is filled with the list of MIME types that
+ are used to describe the data:
+
+ \snippet doc/src/snippets/dropevents/window.cpp 4
+
+ In this case, we accept the proposed action without checking what it is.
+ In a real world application, it may be necessary to return from the
+ \l{QWidget::dropEvent()}{dropEvent()} function without accepting the
+ proposed action or handling
+ the data if the action is not relevant. For example, we may choose to
+ ignore Qt::LinkAction actions if we do not support
+ links to external sources in our application.
+
+ \section2 Overriding Proposed Actions
+
+ We may also ignore the proposed action, and perform some other action on
+ the data. To do this, we would call the event object's
+ \l{QDropEvent::setDropAction()}{setDropAction()} with the preferred
+ action from Qt::DropAction before calling \l{QEvent::}{accept()}.
+ This ensures that the replacement drop action is used instead of the
+ proposed action.
+
+ For more sophisticated applications, reimplementing
+ \l{QWidget::dragMoveEvent()}{dragMoveEvent()} and
+ \l{QWidget::dragLeaveEvent()}{dragLeaveEvent()} will let you make
+ certain parts of your widgets sensitive to drop events, and give you more
+ control over drag and drop in your application.
+
+ \section2 Subclassing Complex Widgets
+
+ Certain standard Qt widgets provide their own support for drag and drop.
+ When subclassing these widgets, it may be necessary to reimplement
+ \l{QWidget::dragMoveEvent()}{dragMoveEvent()} in addition to
+ \l{QWidget::dragEnterEvent()}{dragEnterEvent()} and
+ \l{QWidget::dropEvent()}{dropEvent()} to prevent the base class from
+ providing default drag and drop handling, and to handle any special
+ cases you are interested in.
+
+ \section1 Drag and Drop Actions
+
+ In the simplest case, the target of a drag and drop action receives a
+ copy of the data being dragged, and the source decides whether to
+ delete the original. This is described by the \c CopyAction action.
+ The target may also choose to handle other actions, specifically the
+ \c MoveAction and \c LinkAction actions. If the source calls
+ QDrag::exec(), and it returns \c MoveAction, the source is responsible
+ for deleting any original data if it chooses to do so. The QMimeData
+ and QDrag objects created by the source widget \e{should not be deleted}
+ - they will be destroyed by Qt. The target is responsible for taking
+ ownership of the data sent in the drag and drop operation; this is
+ usually done by keeping references to the data.
+
+ If the target understands the \c LinkAction action, it should
+ store its own reference to the original information; the source
+ does not need to perform any further processing on the data. The
+ most common use of drag and drop actions is when performing a
+ Move within the same widget; see the section on \l{Drop Actions}
+ for more information about this feature.
+
+ The other major use of drag actions is when using a reference type
+ such as text/uri-list, where the dragged data are actually references
+ to files or objects.
+
+ \section1 Adding New Drag and Drop Types
+
+ Drag and drop is not limited to text and images. Any type of information
+ can be transferred in a drag and drop operation. To drag information
+ between applications, the applications must be able to indicate to each
+ other which data formats they can accept and which they can produce.
+ This is achieved using
+ \l{http://www.rfc-editor.org/rfc/rfc1341.txt}{MIME types}. The QDrag
+ object constructed by the source contains a list of MIME types that it
+ uses to represent the data (ordered from most appropriate to least
+ appropriate), and the drop target uses one of these to access the data.
+ For common data types, the convenience functions handle the MIME types
+ used transparently but, for custom data types, it is necessary to
+ state them explicitly.
+
+ To implement drag and drop actions for a type of information that is
+ not covered by the QDrag convenience functions, the first and most
+ important step is to look for existing formats that are appropriate:
+ The Internet Assigned Numbers Authority (\l{http://www.iana.org}{IANA})
+ provides a
+ \l{http://www.iana.org/assignments/media-types/}{hierarchical
+ list of MIME media types} at the Information Sciences Institute
+ (\l{http://www.isi.edu}{ISI}).
+ Using standard MIME types maximizes the interoperability of
+ your application with other software now and in the future.
+
+ To support an additional media type, simply set the data in the QMimeData
+ object with the \l{QMimeData::setData()}{setData()} function, supplying
+ the full MIME type and a QByteArray containing the data in the appropriate
+ format. The following code takes a pixmap from a label and stores it
+ as a Portable Network Graphics (PNG) file in a QMimeData object:
+
+ \snippet doc/src/snippets/separations/finalwidget.cpp 0
+
+ Of course, for this case we could have simply used
+ \l{QMimeData::setImageData()}{setImageData()} instead to supply image data
+ in a variety of formats:
+
+ \snippet doc/src/snippets/separations/finalwidget.cpp 1
+
+ The QByteArray approach is still useful in this case because it provides
+ greater control over the amount of data stored in the QMimeData object.
+
+ Note that custom datatypes used in item views must be declared as
+ \l{QMetaObject}{meta objects} and that stream operators for them
+ must be implemented.
+
+ \section1 Drop Actions
+
+ In the clipboard model, the user can \e cut or \e copy the source
+ information, then later paste it. Similarly in the drag and drop
+ model, the user can drag a \e copy of the information or they can drag
+ the information itself to a new place (\e moving it). The
+ drag and drop model has an additional complication for the programmer:
+ The program doesn't know whether the user wants to cut or copy the
+ information until the operation is complete. This often makes no
+ difference when dragging information between applications, but within
+ an application it is important to check which drop action was used.
+
+ We can reimplement the mouseMoveEvent() for a widget, and start a drag
+ and drop operation with a combination of possible drop actions. For
+ example, we may want to ensure that dragging always moves objects in
+ the widget:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 7
+ \dots
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 8
+
+ The action returned by the exec() function may default to a
+ \c CopyAction if the information is dropped into another application
+ but, if it is dropped in another widget in the same application, we
+ may obtain a different drop action.
+
+ The proposed drop actions can be filtered in a widget's dragMoveEvent()
+ function. However, it is possible to accept all proposed actions in
+ the dragEnterEvent() and let the user decide which they want to accept
+ later:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 0
+
+ When a drop occurs in the widget, the dropEvent() handler function is
+ called, and we can deal with each possible action in turn. First, we
+ deal with drag and drop operations within the same widget:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 1
+
+ In this case, we refuse to deal with move operations. Each type of drop
+ action that we accept is checked and dealt with accordingly:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 2
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 3
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 4
+ \dots
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 5
+
+ Note that we checked for individual drop actions in the above code.
+ As mentioned above in the section on
+ \l{#Overriding Proposed Actions}{Overriding Proposed Actions}, it is
+ sometimes necessary to override the proposed drop action and choose a
+ different one from the selection of possible drop actions.
+ To do this, you need to check for the presence of each action in the value
+ supplied by the event's \l{QDropEvent::}{possibleActions()}, set the drop
+ action with \l{QDropEvent::}{setDropAction()}, and call
+ \l{QEvent::}{accept()}.
+
+ \section1 Drop Rectangles
+
+ The widget's dragMoveEvent() can be used to restrict drops to certain parts
+ of the widget by only accepting the proposed drop actions when the cursor
+ is within those areas. For example, the following code accepts any proposed
+ drop actions when the cursor is over a child widget (\c dropFrame):
+
+ \snippet doc/src/snippets/droprectangle/window.cpp 0
+
+ The dragMoveEvent() can also be used if you need to give visual
+ feedback during a drag and drop operation, to scroll the window, or
+ whatever is appropriate.
+
+ \section1 The Clipboard
+
+ Applications can also communicate with each other by putting data on
+ the clipboard. To access this, you need to obtain a QClipboard object
+ from the QApplication object:
+
+ \snippet examples/widgets/charactermap/mainwindow.cpp 3
+
+ The QMimeData class is used to represent data that is transferred to and
+ from the clipboard. To put data on the clipboard, you can use the
+ setText(), setImage(), and setPixmap() convenience functions for common
+ data types. These functions are similar to those found in the QMimeData
+ class, except that they also take an additional argument that controls
+ where the data is stored: If \l{QClipboard::Mode}{Clipboard} is
+ specified, the data is placed on the clipboard; if
+ \l{QClipboard::Mode}{Selection} is specified, the data is placed in the
+ mouse selection (on X11 only). By default, data is put on the clipboard.
+
+ For example, we can copy the contents of a QLineEdit to the clipboard
+ with the following code:
+
+ \snippet examples/widgets/charactermap/mainwindow.cpp 11
+
+ Data with different MIME types can also be put on the clipboard.
+ Construct a QMimeData object and set data with setData() function in
+ the way described in the previous section; this object can then be
+ put on the clipboard with the
+ \l{QClipboard::setMimeData()}{setMimeData()} function.
+
+ The QClipboard class can notify the application about changes to the
+ data it contains via its \l{QClipboard::dataChanged()}{dataChanged()}
+ signal. For example, we can monitor the clipboard by connecting this
+ signal to a slot in a widget:
+
+ \snippet doc/src/snippets/clipboard/clipwindow.cpp 0
+
+ The slot connected to this signal can read the data on the clipboard
+ using one of the MIME types that can be used to represent it:
+
+ \snippet doc/src/snippets/clipboard/clipwindow.cpp 1
+ \dots
+ \snippet doc/src/snippets/clipboard/clipwindow.cpp 2
+
+ The \l{QClipboard::selectionChanged()}{selectionChanged()} signal can
+ be used on X11 to monitor the mouse selection.
+
+ \section1 Examples
+
+ \list
+ \o \l{draganddrop/draggableicons}{Draggable Icons}
+ \o \l{draganddrop/draggabletext}{Draggable Text}
+ \o \l{draganddrop/dropsite}{Drop Site}
+ \o \l{draganddrop/fridgemagnets}{Fridge Magnets}
+ \o \l{draganddrop/puzzle}{Drag and Drop Puzzle}
+ \endlist
+
+ \section1 Interoperating with Other Applications
+
+ On X11, the public \l{http://www.newplanetsoftware.com/xdnd/}{XDND
+ protocol} is used, while on Windows Qt uses the OLE standard, and
+ Qt for Mac OS X uses the Carbon Drag Manager. On X11, XDND uses MIME,
+ so no translation is necessary. The Qt API is the same regardless of
+ the platform. On Windows, MIME-aware applications can communicate by
+ using clipboard format names that are MIME types. Already some
+ Windows applications use MIME naming conventions for their
+ clipboard formats. Internally, Qt uses QWindowsMime and
+ QMacPasteboardMime for translating proprietary clipboard formats
+ to and from MIME types.
+
+ On X11, Qt also supports drops via the Motif Drag & Drop Protocol. The
+ implementation incorporates some code that was originally written by
+ Daniel Dardailler, and adapted for Qt by Matt Koss <koss@napri.sk>
+ and Nokia. Here is the original copyright notice:
+
+ \legalese
+ Copyright 1996 Daniel Dardailler.
+
+ Permission to use, copy, modify, distribute, and sell this software
+ for any purpose is hereby granted without fee, provided that the above
+ copyright notice appear in all copies and that both that copyright
+ notice and this permission notice appear in supporting documentation,
+ and that the name of Daniel Dardailler not be used in advertising or
+ publicity pertaining to distribution of the software without specific,
+ written prior permission. Daniel Dardailler makes no representations
+ about the suitability of this software for any purpose. It is
+ provided "as is" without express or implied warranty.
+
+ Modifications Copyright 1999 Matt Koss, under the same license as
+ above.
+ \endlegalese
+ \omit NOTE: The copyright notice is from qmotifdnd_x11.cpp. \endomit
+
+ Note: The Motif Drag \& Drop Protocol only allows receivers to
+ request data in response to a QDropEvent. If you attempt to
+ request data in response to e.g. a QDragMoveEvent, an empty
+ QByteArray is returned.
+*/
diff --git a/doc/src/frameworks-technologies/eventsandfilters.qdoc b/doc/src/frameworks-technologies/eventsandfilters.qdoc
new file mode 100644
index 0000000..3f849e6
--- /dev/null
+++ b/doc/src/frameworks-technologies/eventsandfilters.qdoc
@@ -0,0 +1,235 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group events
+ \title Event Classes
+ \ingroup groups
+
+ \brief Classes used to create and handle events.
+
+ These classes are used to create and handle events.
+
+ For more information see the \link object.html Object model\endlink
+ and \link signalsandslots.html Signals and Slots\endlink.
+*/
+
+/*!
+ \page eventsandfilters.html
+ \title Events and Event Filters
+ \brief A guide to event handling in Qt.
+
+ \ingroup frameworks-technologies
+
+ In Qt, events are objects, derived from the abstract QEvent class,
+ that represent things that have happened either within an application
+ or as a result of outside activity that the application needs to know
+ about. Events can be received and handled by any instance of a
+ QObject subclass, but they are especially relevant to widgets. This
+ document describes how events are delivered and handled in a typical
+ application.
+
+ \tableofcontents
+
+ \section1 How Events are Delivered
+
+ When an event occurs, Qt creates an event object to represent it by
+ constructing an instance of the appropriate QEvent subclass, and
+ delivers it to a particular instance of QObject (or one of its
+ subclasses) by calling its \l{QObject::}{event()} function.
+
+ This function does not handle the event itself; based on the type
+ of event delivered, it calls an event handler for that specific
+ type of event, and sends a response based on whether the event
+ was accepted or ignored.
+
+ \omit
+ Event delivery means that an
+ event has occurred, the QEvent indicates precisely what, and the
+ QObject needs to respond. Most events are specific to QWidget and its
+ subclasses, but there are important events that aren't related to
+ graphics (e.g., \l{QTimer}{timer events}).
+ \endomit
+
+ Some events, such as QMouseEvent and QKeyEvent, come from the
+ window system; some, such as QTimerEvent, come from other sources;
+ some come from the application itself.
+
+ \section1 Event Types
+
+ Most events types have special classes, notably QResizeEvent,
+ QPaintEvent, QMouseEvent, QKeyEvent, and QCloseEvent. Each class
+ subclasses QEvent and adds event-specific functions. For example,
+ QResizeEvent adds \l{QResizeEvent::}{size()} and
+ \l{QResizeEvent::}{oldSize()} to enable widgets to discover how
+ their dimensions have been changed.
+
+ Some classes support more than one actual event type. QMouseEvent
+ supports mouse button presses, double-clicks, moves, and other
+ related operations.
+
+ Each event has an associated type, defined in QEvent::Type, and this
+ can be used as a convenient source of run-time type information to
+ quickly determine which subclass a given event object was constructed
+ from.
+
+ Since programs need to react in varied and complex ways, Qt's
+ event delivery mechanisms are flexible. The documentation for
+ QCoreApplication::notify() concisely tells the whole story; the
+ \e{Qt Quarterly} article
+ \l{http://qt.nokia.com/doc/qq/qq11-events.html}{Another Look at Events}
+ rehashes it less concisely. Here we will explain enough for 95%
+ of applications.
+
+ \section1 Event Handlers
+
+ The normal way for an event to be delivered is by calling a virtual
+ function. For example, QPaintEvent is delivered by calling
+ QWidget::paintEvent(). This virtual function is responsible for
+ reacting appropriately, normally by repainting the widget. If you
+ do not perform all the necessary work in your implementation of the
+ virtual function, you may need to call the base class's implementation.
+
+ For example, the following code handles left mouse button clicks on
+ a custom checkbox widget while passing all other button clicks to the
+ base QCheckBox class:
+
+ \snippet doc/src/snippets/events/events.cpp 0
+
+ If you want to replace the base class's function, you must
+ implement everything yourself. However, if you only want to extend
+ the base class's functionality, then you implement what you want and
+ call the base class to obtain the default behavior for any cases you
+ do not want to handle.
+
+ Occasionally, there isn't such an event-specific function, or the
+ event-specific function isn't sufficient. The most common example
+ involves \key Tab key presses. Normally, QWidget intercepts these to
+ move the keyboard focus, but a few widgets need the \key{Tab} key for
+ themselves.
+
+ These objects can reimplement QObject::event(), the general event
+ handler, and either do their event handling before or after the usual
+ handling, or they can replace the function completely. A very unusual
+ widget that both interprets \key Tab and has an application-specific
+ custom event might contain the following \l{QObject::event()}{event()}
+ function:
+
+ \snippet doc/src/snippets/events/events.cpp 1
+
+ Note that QWidget::event() is still called for all of the cases not
+ handled, and that the return value indicates whether an event was
+ dealt with; a \c true value prevents the event from being sent on
+ to other objects.
+
+ \section1 Event Filters
+
+ Sometimes an object needs to look at, and possibly intercept, the
+ events that are delivered to another object. For example, dialogs
+ commonly want to filter key presses for some widgets; for example,
+ to modify \key{Return}-key handling.
+
+ The QObject::installEventFilter() function enables this by setting
+ up an \e{event filter}, causing a nominated filter object to receive
+ the events for a target object in its QObject::eventFilter()
+ function. An event filter gets to process events before the target
+ object does, allowing it to inspect and discard the events as
+ required. An existing event filter can be removed using the
+ QObject::removeEventFilter() function.
+
+ When the filter object's \l{QObject::}{eventFilter()} implementation
+ is called, it can accept or reject the event, and allow or deny
+ further processing of the event. If all the event filters allow
+ further processing of an event (by each returning \c false), the event
+ is sent to the target object itself. If one of them stops processing
+ (by returning \c true), the target and any later event filters do not
+ get to see the event at all.
+
+ \snippet doc/src/snippets/eventfilters/filterobject.cpp 0
+
+ The above code shows another way to intercept \key{Tab} key press
+ events sent to a particular target widget. In this case, the filter
+ handles the relevant events and returns \c true to stop them from
+ being processed any further. All other events are ignored, and the
+ filter returns \c false to allow them to be sent on to the target
+ widget, via any other event filters that are installed on it.
+
+ It is also possible to filter \e all events for the entire application,
+ by installing an event filter on the QApplication or QCoreApplication
+ object. Such global event filters are called before the object-specific
+ filters. This is very powerful, but it also slows down event delivery
+ of every single event in the entire application; the other techniques
+ discussed should generally be used instead.
+
+ \section1 Sending Events
+
+ Many applications want to create and send their own events. You can
+ send events in exactly the same ways as Qt's own event loop by
+ constructing suitable event objects and sending them with
+ QCoreApplication::sendEvent() and QCoreApplication::postEvent().
+
+ \l{QCoreApplication::}{sendEvent()} processes the event immediately.
+ When it returns, the event filters and/or the object itself have
+ already processed the event. For many event classes there is a function
+ called isAccepted() that tells you whether the event was accepted
+ or rejected by the last handler that was called.
+
+ \l{QCoreApplication::}{postEvent()} posts the event on a queue for
+ later dispatch. The next time Qt's main event loop runs, it dispatches
+ all posted events, with some optimization. For example, if there are
+ several resize events, they are are compressed into one. The same
+ applies to paint events: QWidget::update() calls
+ \l{QCoreApplication::}{postEvent()}, which eliminates flickering and
+ increases speed by avoiding multiple repaints.
+
+ \l{QCoreApplication::}{postEvent()} is also used during object
+ initialization, since the posted event will typically be dispatched
+ very soon after the initialization of the object is complete.
+ When implementing a widget, it is important to realise that events
+ can be delivered very early in its lifetime so, in its constructor,
+ be sure to initialize member variables early on, before there's any
+ chance that it might receive an event.
+
+ To create events of a custom type, you need to define an event
+ number, which must be greater than QEvent::User, and you may need to
+ subclass QEvent in order to pass specific information about your
+ custom event. See the QEvent documentation for further details.
+*/
diff --git a/doc/src/frameworks-technologies/gestures.qdoc b/doc/src/frameworks-technologies/gestures.qdoc
new file mode 100644
index 0000000..317bb31
--- /dev/null
+++ b/doc/src/frameworks-technologies/gestures.qdoc
@@ -0,0 +1,170 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gestures-overview.html
+ \startpage index.html Qt Reference Documentation
+
+ \title Gestures Programming
+ \ingroup howto
+ \brief An overview of the Qt support for Gesture programming.
+
+ The QGesture class provides the ability to form gestures from a series
+ of events independent of the input method. A gesture could be a particular
+ movement of a mouse, a touch screen action, or a series of events from
+ some other source. The nature of the input, the interpretation
+ of the gesture and the action taken are the choice of the implementing
+ developer.
+
+ \tableofcontents
+
+
+ \section1 Creating Your Own Gesture Recognizer
+
+ QGesture is a base class for a user defined gesture recognizer class. In
+ order to implement the recognizer you will need to subclass the
+ QGesture class and implement the pure virtual function \l{QGesture::filterEvent()}{filterEvent()}. Once
+ you have implemented the \l{QGesture::filterEvent()}{filterEvent()} function to
+ make your own recognizer you can process events. A sequence of events may,
+ according to your own rules, represent a gesture. The events can be singly
+ passed to the recognizer via the \l{QGesture::filterEvent()}{filterEvent()} function or as a stream of
+ events by specifying a parent source of events. The events can be from any
+ source and could result in any action as defined by the user. The source
+ and action need not be graphical though that would be the most likely
+ scenario. To find how to connect a source of events to automatically feed into the recognizer see QGesture.
+
+ Recognizers based on QGesture can emit any of the following signals:
+
+ \snippet doc/src/snippets/gestures/qgesture.h qgesture-signals
+
+ These signals are emitted when the state changes with the call to
+ \l{QGesture::updateState()}{updateState()}, more than one signal may
+ be emitted when a change of state occurs. There are four GestureStates
+
+ \table
+ \header \o New State \o Description \o QGesture Actions on Entering this State
+ \row \o Qt::NoGesture \o Initial value \o emit \l {QGesture::cancelled()}{cancelled()}
+ \row \o Qt::GestureStarted \o A continuous gesture has started \o emit \l{QGesture::started()}{started()} and emit \l{QGesture::triggered()}{triggered()}
+ \row \o Qt::GestureUpdated \o A gesture continues \o emit \l{QGesture::triggered()}{triggered()}
+ \row \o Qt::GestureFinished \o A gesture has finished. \o emit \l{QGesture::finished()}{finished()}
+ \endtable
+
+ \note \l{QGesture::started()}{started()} can be emitted if entering any
+ state greater than NoGesture if NoGesture was the previous state. This
+ means that your state machine does not need to explicitly use the
+ Qt::GestureStarted state, you can simply proceed from NoGesture to
+ Qt::GestureUpdated to emit a \l{QGesture::started()}{started()} signal
+ and a \l{QGesture::triggered()}{triggered()} signal.
+
+ You may use some or all of these states when implementing the pure
+ virtual function \l{QGesture::filterEvent()}{filterEvent()}.
+ \l{QGesture::filterEvent()}{filterEvent()} will usually implement a
+ state machine using the GestureState enums, but the details of which
+ states are used is up to the developer.
+
+ You may also need to reimplement the virtual function \l{QGesture::reset()}{reset()}
+ if internal data or objects need to be re-initialized. The function must
+ conclude with a call to \l{QGesture::updateState()}{updateState()} to
+ change the current state to Qt::NoGesture.
+
+ \section1 An Example, ImageViewer
+
+ To illustrate how to use QGesture we will look at the ImageViewer
+ example. This example uses QPanGesture, standard gesture, and an
+ implementation of TapAndHoldGesture. Note that TapAndHoldGesture is
+ platform dependent.
+
+ \snippet doc/src/snippets/gestures/imageviewer/tapandholdgesture.cpp tapandhold-reset
+
+ In ImageViewer we see that the ImageWidget class uses two gestures:
+ \l QPanGesture and TapAndHoldGesture. The
+ QPanGesture is a standard gesture which is part of Qt.
+ TapAndHoldGesture is defined and implemented as part of the example.
+ The ImageWidget listens for signals from the gestures, but is not
+ interested in the \l{QGesture::started()}{started()} signal.
+
+ \snippet doc/src/snippets/gestures/imageviewer/imagewidget.h imagewidget-slots
+
+ TapAndHoldGesture uses QTouchEvent events and mouse events to detect
+ start, update and end events that can be mapped onto the GestureState
+ changes. The implementation in this case uses a timer as well. If the
+ timeout event occurs a given number of times after the start of the gesture
+ then the gesture is considered to have finished whether or not the
+ appropriate touch or mouse event has occurred. Also if a large jump in
+ the position of the event occurs, as calculated by the \l {QPoint::manhattanLength()}{manhattanLength()}
+ call, then the gesture is cancelled by calling \l{QGesture::reset()}{reset()}
+ which tidies up and uses \l{QGesture::updateState()}{updateState()} to
+ change state to NoGesture which will result in the \l{QGesture::cancelled()}{cancelled()}
+ signal being emitted by the recognizer.
+
+ ImageWidget handles the signals by connecting the slots to the signals,
+ although \c cancelled() is not connected here.
+
+ \snippet doc/src/snippets/gestures/imageviewer/imagewidget.cpp imagewidget-connect
+
+ These functions in turn will have to be aware of which gesture
+ object was the source of the signal since we have more than one source
+ per slot. This is easily done by using the QObject::sender() function
+ as shown here
+
+ \snippet doc/src/snippets/gestures/imageviewer/imagewidget.cpp imagewidget-triggered-1
+
+ As \l{QGesture::triggered()}{triggered()} signals are handled by
+ gestureTriggered() there may be position updates invoking calls to,
+ for example, goNextImage(), this will cause a change in the image
+ handling logic of ImageWidget and a call to updateImage() to display
+ the changed state.
+
+ Following the logic of how the QEvent is processed we can summmarize
+ it as follows:
+ \list
+ \o filterEvent() becomes the event filter of the parent ImageWidget object for a QPanGesture object and a
+ TapAndHoldGesture object.
+ \o filterEvent() then calls updateState() to change states
+ \o updateState() emits the appropriate signal(s) for the state change.
+ \o The signals are caught by the defined slots in ImageWidget
+ \o The widget logic changes and an update() results in a paint event.
+ \endlist
+
+
+
+*/
+
diff --git a/doc/src/frameworks-technologies/graphicsview.qdoc b/doc/src/frameworks-technologies/graphicsview.qdoc
new file mode 100644
index 0000000..70ced2c
--- /dev/null
+++ b/doc/src/frameworks-technologies/graphicsview.qdoc
@@ -0,0 +1,574 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group graphicsview-api
+ \title Graphics View Classes
+*/
+
+/*!
+ \page graphicsview.html
+ \title The Graphics View Framework
+ \brief An overview of the Graphics View framework for interactive 2D
+ graphics.
+
+ \ingroup frameworks-technologies
+
+ \keyword Graphics View
+ \keyword GraphicsView
+ \keyword Graphics
+ \keyword Canvas
+ \since 4.2
+
+ Graphics View provides a surface for managing and interacting with a large
+ number of custom-made 2D graphical items, and a view widget for
+ visualizing the items, with support for zooming and rotation.
+
+ The framework includes an event propagation architecture that allows
+ precise double-precision interaction capabilities for the items on the
+ scene. Items can handle key events, mouse press, move, release and
+ double click events, and they can also track mouse movement.
+
+ Graphics View uses a BSP (Binary Space Partitioning) tree to provide very
+ fast item discovery, and as a result of this, it can visualize large
+ scenes in real-time, even with millions of items.
+
+ Graphics View was introduced in Qt 4.2, replacing its predecessor,
+ QCanvas. If you are porting from QCanvas, see \l{Porting to Graphics
+ View}.
+
+ Topics:
+
+ \tableofcontents
+
+ \section1 The Graphics View Architecture
+
+ Graphics View provides an item-based approach to model-view programming,
+ much like InterView's convenience classes QTableView, QTreeView and
+ QListView. Several views can observe a single scene, and the scene
+ contains items of varying geometric shapes.
+
+ \section2 The Scene
+
+ QGraphicsScene provides the Graphics View scene. The scene has the
+ following responsibilities:
+
+ \list
+ \o Providing a fast interface for managing a large number of items
+ \o Propagating events to each item
+ \o Managing item state, such as selection and focus handling
+ \o Providing untransformed rendering functionality; mainly for printing
+ \endlist
+
+ The scene serves as a container for QGraphicsItem objects. Items are
+ added to the scene by calling QGraphicsScene::addItem(), and then
+ retrieved by calling one of the many item discovery functions.
+ QGraphicsScene::items() and its overloads return all items contained
+ by or intersecting with a point, a rectangle, a polygon or a general
+ vector path. QGraphicsScene::itemAt() returns the topmost item at a
+ particular point. All item discovery functions return the items in
+ descending stacking order (i.e., the first returned item is topmost,
+ and the last item is bottom-most).
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 0
+
+ QGraphicsScene's event propagation architecture schedules scene events
+ for delivery to items, and also manages propagation between items. If
+ the scene receives a mouse press event at a certain position, the
+ scene passes the event on to whichever item is at that position.
+
+ QGraphicsScene also manages certain item states, such as item
+ selection and focus. You can select items on the scene by calling
+ QGraphicsScene::setSelectionArea(), passing an arbitrary shape. This
+ functionality is also used as a basis for rubberband selection in
+ QGraphicsView. To get the list of all currently selected items, call
+ QGraphicsScene::selectedItems(). Another state handled by
+ QGraphicsScene is whether or not an item has keyboard input focus. You
+ can set focus on an item by calling QGraphicsScene::setFocusItem() or
+ QGraphicsItem::setFocus(), or get the current focus item by calling
+ QGraphicsScene::focusItem().
+
+ Finally, QGraphicsScene allows you to render parts of the scene into a
+ paint device through the QGraphicsScene::render() function. You can
+ read more about this in the Printing section later in this document.
+
+ \section2 The View
+
+ QGraphicsView provides the view widget, which visualizes the contents
+ of a scene. You can attach several views to the same scene, to provide
+ several viewports into the same data set. The view widget is a scroll
+ area, and provides scroll bars for navigating through large scenes. To
+ enable OpenGL support, you can set a QGLWidget as the viewport by
+ calling QGraphicsView::setViewport().
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 1
+
+ The view receives input events from the keyboard and mouse, and
+ translates these to scene events (converting the coordinates used
+ to scene coordinates where appropriate), before sending the events
+ to the visualized scene.
+
+ Using its transformation matrix, QGraphicsView::transform(), the view can
+ \e transform the scene's coordinate system. This allows advanced
+ navigation features such as zooming and rotation. For convenience,
+ QGraphicsView also provides functions for translating between view and
+ scene coordinates: QGraphicsView::mapToScene() and
+ QGraphicsView::mapFromScene().
+
+ \img graphicsview-view.png
+
+ \section2 The Item
+
+ QGraphicsItem is the base class for graphical items in a
+ scene. Graphics View provides several standard items for typical
+ shapes, such as rectangles (QGraphicsRectItem), ellipses
+ (QGraphicsEllipseItem) and text items (QGraphicsTextItem), but the
+ most powerful QGraphicsItem features are available when you write a
+ custom item. Among other things, QGraphicsItem supports the following
+ features:
+
+ \list
+ \o Mouse press, move, release and double click events, as well as mouse
+ hover events, wheel events, and context menu events.
+ \o Keyboard input focus, and key events
+ \o Drag and drop
+ \o Grouping, both through parent-child relationships, and with
+ QGraphicsItemGroup
+ \o Collision detection
+ \endlist
+
+ Items live in a local coordinate system, and like QGraphicsView, it
+ also provides many functions for mapping coordinates between the item
+ and the scene, and from item to item. Also, like QGraphicsView, it can
+ transform its coordinate system using a matrix:
+ QGraphicsItem::transform(). This is useful for rotating and scaling
+ individual items.
+
+ Items can contain other items (children). Parent items'
+ transformations are inherited by all its children. Regardless of an
+ item's accumulated transformation, though, all its functions (e.g.,
+ QGraphicsItem::contains(), QGraphicsItem::boundingRect(),
+ QGraphicsItem::collidesWith()) still operate in local coordinates.
+
+ QGraphicsItem supports collision detection through the
+ QGraphicsItem::shape() function, and QGraphicsItem::collidesWith(),
+ which are both virtual functions. By returning your item's shape as a
+ local coordinate QPainterPath from QGraphicsItem::shape(),
+ QGraphicsItem will handle all collision detection for you. If you want
+ to provide your own collision detection, however, you can reimplement
+ QGraphicsItem::collidesWith().
+
+ \img graphicsview-items.png
+
+ \section1 Classes in the Graphics View Framework
+
+ These classes provide a framework for creating interactive applications.
+
+ \annotatedlist graphicsview-api
+
+ \section1 The Graphics View Coordinate System
+
+ Graphics View is based on the Cartesian coordinate system; items'
+ position and geometry on the scene are represented by sets of two
+ numbers: the x-coordinate, and the y-coordinate. When observing a scene
+ using an untransformed view, one unit on the scene is represented by
+ one pixel on the screen.
+
+ \note The inverted Y-axis coordinate system (where \c y grows upwards)
+ is unsupported as Graphics Views uses Qt's coordinate system.
+
+ There are three effective coordinate systems in play in Graphics View:
+ Item coordinates, scene coordinates, and view coordinates. To simplify
+ your implementation, Graphics View provides convenience functions that
+ allow you to map between the three coordinate systems.
+
+ When rendering, Graphics View's scene coordinates correspond to
+ QPainter's \e logical coordinates, and view coordinates are the same as
+ \e device coordinates. In \l{The Coordinate System}, you can read about
+ the relationship between logical coordinates and device coordinates.
+
+ \img graphicsview-parentchild.png
+
+ \section2 Item Coordinates
+
+ Items live in their own local coordinate system. Their coordinates
+ are usually centered around its center point (0, 0), and this is
+ also the center for all transformations. Geometric primitives in the
+ item coordinate system are often referred to as item points, item
+ lines, or item rectangles.
+
+ When creating a custom item, item coordinates are all you need to
+ worry about; QGraphicsScene and QGraphicsView will perform all
+ transformations for you. This makes it very easy to implement custom
+ items. For example, if you receive a mouse press or a drag enter
+ event, the event position is given in item coordinates. The
+ QGraphicsItem::contains() virtual function, which returns true if a
+ certain point is inside your item, and false otherwise, takes a
+ point argument in item coordinates. Similarly, an item's bounding
+ rect and shape are in item coordinates.
+
+ At item's \e position is the coordinate of the item's center point
+ in its parent's coordinate system; sometimes referred to as \e
+ parent coordinates. The scene is in this sense regarded as all
+ parent-less items' "parent". Top level items' position are in scene
+ coordinates.
+
+ Child coordinates are relative to the parent's coordinates. If the
+ child is untransformed, the difference between a child coordinate
+ and a parent coordinate is the same as the distance between the
+ items in parent coordinates. For example: If an untransformed child
+ item is positioned precisely in its parent's center point, then the
+ two items' coordinate systems will be identical. If the child's
+ position is (10, 0), however, the child's (0, 10) point will
+ correspond to its parent's (10, 10) point.
+
+ Because items' position and transformation are relative to the
+ parent, child items' coordinates are unaffected by the parent's
+ transformation, although the parent's transformation implicitly
+ transforms the child. In the above example, even if the parent is
+ rotated and scaled, the child's (0, 10) point will still correspond
+ to the parent's (10, 10) point. Relative to the scene, however, the
+ child will follow the parent's transformation and position. If the
+ parent is scaled (2x, 2x), the child's position will be at scene
+ coordinate (20, 0), and its (10, 0) point will correspond to the
+ point (40, 0) on the scene.
+
+ With QGraphicsItem::pos() being one of the few exceptions,
+ QGraphicsItem's functions operate in item coordinates, regardless of
+ the item, or any of its parents' transformation. For example, an
+ item's bounding rect (i.e. QGraphicsItem::boundingRect()) is always
+ given in item coordinates.
+
+ \section2 Scene Coordinates
+
+ The scene represents the base coordinate system for all its items.
+ The scene coordinate system describes the position of each top-level
+ item, and also forms the basis for all scene events delivered to the
+ scene from the view. Each item on the scene has a scene position
+ and bounding rectangle (QGraphicsItem::scenePos(),
+ QGraphicsItem::sceneBoundingRect()), in addition to its local item
+ pos and bounding rectangle. The scene position describes the item's
+ position in scene coordinates, and its scene bounding rect forms the
+ basis for how QGraphicsScene determines what areas of the scene have
+ changed. Changes in the scene are communicated through the
+ QGraphicsScene::changed() signal, and the argument is a list of
+ scene rectangles.
+
+ \section2 View Coordinates
+
+ View coordinates are the coordinates of the widget. Each unit in
+ view coordinates corresponds to one pixel. What's special about this
+ coordinate system is that it is relative to the widget, or viewport,
+ and unaffected by the observed scene. The top left corner of
+ QGraphicsView's viewport is always (0, 0), and the bottom right
+ corner is always (viewport width, viewport height). All mouse events
+ and drag and drop events are originally received as view
+ coordinates, and you need to map these coordinates to the scene in
+ order to interact with items.
+
+ \section2 Coordinate Mapping
+
+ Often when dealing with items in a scene, it can be useful to map
+ coordinates and arbitrary shapes from the scene to an item, from
+ item to item, or from the view to the scene. For example, when you
+ click your mouse in QGraphicsView's viewport, you can ask the scene
+ what item is under the cursor by calling
+ QGraphicsView::mapToScene(), followed by
+ QGraphicsScene::itemAt(). If you want to know where in the viewport
+ an item is located, you can call QGraphicsItem::mapToScene() on the
+ item, then QGraphicsView::mapFromScene() on the view. Finally, if
+ you use want to find what items are inside a view ellipse, you can
+ pass a QPainterPath to mapToScene(), and then pass the mapped path
+ to QGraphicsScene::items().
+
+ You can map coordinates and shapes to and from and item's scene by
+ calling QGraphicsItem::mapToScene() and
+ QGraphicsItem::mapFromScene(). You can also map to an item's parent
+ item by calling QGraphicsItem::mapToParent() and
+ QGraphicsItem::mapFromParent(), or between items by calling
+ QGraphicsItem::mapToItem() and QGraphicsItem::mapFromItem(). All
+ mapping functions can map both points, rectangles, polygons and
+ paths.
+
+ The same mapping functions are available in the view, for mapping to
+ and from the scene. QGraphicsView::mapFromScene() and
+ QGraphicsView::mapToScene(). To map from a view to an item, you
+ first map to the scene, and then map from the scene to the item.
+
+ \section1 Key Features
+
+ \section2 Zooming and rotating
+
+ QGraphicsView supports the same affine transformations as QPainter
+ does through QGraphicsView::setMatrix(). By applying a transformation
+ to the view, you can easily add support for common navigation features
+ such as zooming and rotating.
+
+ Here is an example of how to implement zoom and rotate slots in a
+ subclass of QGraphicsView:
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 2
+
+ The slots could be connected to \l{QToolButton}{QToolButtons} with
+ \l{QAbstractButton::autoRepeat}{autoRepeat} enabled.
+
+ QGraphicsView keeps the center of the view aligned when you transform
+ the view.
+
+ See also the \l{Elastic Nodes Example}{Elastic Nodes} example for
+ code that shows how to implement basic zooming features.
+
+ \section2 Printing
+
+ Graphics View provides single-line printing through its rendering
+ functions, QGraphicsScene::render() and QGraphicsView::render(). The
+ functions provide the same API: You can have the scene or the view
+ render all or parts of their contents into any paint device by passing
+ a QPainter to either of the rendering functions. This example shows
+ how to print the whole scene into a full page, using QPrinter.
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 3
+
+ The difference between the scene and view rendering functions is that
+ one operates in scene coordinates, and the other in view coordinates.
+ QGraphicsScene::render() is often preferred for printing whole
+ segments of a scene untransformed, such as for plotting geometrical
+ data, or for printing a text document. QGraphicsView::render(), on the
+ other hand, is suitable for taking screenshots; its default behavior
+ is to render the exact contents of the viewport using the provided
+ painter.
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 4
+
+ When the source and target areas' sizes do not match, the source
+ contents are stretched to fit into the target area. By passing a
+ Qt::AspectRatioMode to the rendering function you are using, you can
+ choose to maintain or ignore the aspect ratio of the scene when the
+ contents are stretched.
+
+ \section2 Drag and Drop
+
+ Because QGraphicsView inherits QWidget indirectly, it already provides
+ the same drag and drop functionality that QWidget provides. In
+ addition, as a convenience, the Graphics View framework provides drag
+ and drop support for the scene, and for each and every item. As the
+ view receives a drag, it translates the drag and drop events into a
+ QGraphicsSceneDragDropEvent, which is then forwarded to the scene. The
+ scene takes over scheduling of this event, and sends it to the first
+ item under the mouse cursor that accepts drops.
+
+ To start a drag from an item, create a QDrag object, passing a pointer
+ to the widget that starts the drag. Items can be observed by many
+ views at the same time, but only one view can start the drag. Drags
+ are in most cases started as a result of pressing or moving the mouse,
+ so in mousePressEvent() or mouseMoveEvent(), you can get the
+ originating widget pointer from the event. For example:
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 5
+
+ To intercept drag and drop events for the scene, you reimplement
+ QGraphicsScene::dragEnterEvent() and whichever event handlers your
+ particular scene needs, in a QGraphicsItem subclass. You can read more
+ about drag and drop in Graphics View in the documentation for each of
+ QGraphicsScene's event handlers.
+
+ Items can enable drag and drop support by calling
+ QGraphicsItem::setAcceptDrops(). To handle the incoming drag,
+ reimplement QGraphicsItem::dragEnterEvent(),
+ QGraphicsItem::dragMoveEvent(), QGraphicsItem::dragLeaveEvent(), and
+ QGraphicsItem::dropEvent().
+
+ See also the \l{Drag and Drop Robot Example}{Drag and Drop Robot} example
+ for a demonstration of Graphics View's support for drag and drop
+ operations.
+
+ \section2 Cursors and Tooltips
+
+ Like QWidget, QGraphicsItem also supports cursors
+ (QGraphicsItem::setCursor()), and tooltips
+ (QGraphicsItem::setToolTip()). The cursors and tooltips are activated
+ by QGraphicsView as the mouse cursor enters the item's area (detected
+ by calling QGraphicsItem::contains()).
+
+ You can also set a default cursor directly on the view by calling
+ QGraphicsView::setCursor().
+
+ See also the \l{Drag and Drop Robot Example}{Drag and Drop Robot}
+ example for code that implements tooltips and cursor shape handling.
+
+ \section2 Animation
+
+ Graphics View supports animation at several levels. You can easily
+ assemble animation paths by associating a QGraphicsItemAnimation with
+ your item. This allows timeline controlled animations that operate at
+ a steady speed on all platforms (although the frame rate may vary
+ depending on the platform's performance). QGraphicsItemAnimation
+ allows you to create a path for an item's position, rotation, scale,
+ shear and translation. The animation can be controlled by a QSlider,
+ or more commonly by QTimeLine.
+
+ Another option is to create a custom item that inherits from QObject
+ and QGraphicsItem. The item can the set up its own timers, and control
+ animations with incremental steps in QObject::timerEvent().
+
+ A third option, which is mostly available for compatibility with
+ QCanvas in Qt 3, is to \e advance the scene by calling
+ QGraphicsScene::advance(), which in turn calls
+ QGraphicsItem::advance().
+
+ See also the \l{Drag and Drop Robot Example}{Drag and Drop Robot}
+ example for an illustration of timeline-based animation techniques.
+
+ \section2 OpenGL Rendering
+
+ To enable OpenGL rendering, you simply set a new QGLWidget as the
+ viewport of QGraphicsView by calling QGraphicsView::setViewport(). If
+ you want OpenGL with antialiasing, you need OpenGL sample buffer
+ support (see QGLFormat::sampleBuffers()).
+
+ Example:
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 6
+
+ \section2 Item Groups
+
+ By making an item a child of another, you can achieve the most
+ essential feature of item grouping: the items will move together, and
+ all transformations are propagated from parent to child.
+
+ In addition, QGraphicsItemGroup is a special item that combines child
+ event handling with a useful interface for adding and removing items
+ to and from a group. Adding an item to a QGraphicsItemGroup will keep
+ the item's original position and transformation, whereas reparenting
+ items in general will cause the child to reposition itself relative to
+ its new parent. For convenience, you can create
+ \l{QGraphicsItemGroup}s through the scene by calling
+ QGraphicsScene::createItemGroup().
+
+ \section2 Widgets and Layouts
+
+ Qt 4.4 introduced support for geometry and layout-aware items through
+ QGraphicsWidget. This special base item is similar to QWidget, but
+ unlike QWidget, it doesn't inherit from QPaintDevice; rather from
+ QGraphicsItem instead. This allows you to write complete widgets with
+ events, signals & slots, size hints and policies, and you can also
+ manage your widgets geometries in layouts through
+ QGraphicsLinearLayout and QGraphicsGridLayout.
+
+ \section3 QGraphicsWidget
+
+ Building on top of QGraphicsItem's capabilities and lean footprint,
+ QGraphicsWidget provides the best of both worlds: extra
+ functionality from QWidget, such as the style, font, palette, layout
+ direction, and its geometry, and resolution independence and
+ transformation support from QGraphicsItem. Because Graphics View
+ uses real coordinates instead of integers, QGraphicsWidget's
+ geometry functions also operate on QRectF and QPointF. This also
+ applies to frame rects, margins and spacing. With QGraphicsWidget
+ it's not uncommon to specify contents margins of (0.5, 0.5, 0.5,
+ 0.5), for example. You can create both subwidgets and "top-level"
+ windows; in some cases you can now use Graphics View for advanced
+ MDI applications.
+
+ Some of QWidget's properties are supported, including window flags
+ and attributes, but not all. You should refer to QGraphicsWidget's
+ class documentation for a complete overview of what is and what is
+ not supported. For example, you can create decorated windows by
+ passing the Qt::Window window flag to QGraphicsWidget's constructor,
+ but Graphics View currently doesn't support the Qt::Sheet and
+ Qt::Drawer flags that are common on Mac OS X.
+
+ The capabilities of QGraphicsWidget are expected to grow depending
+ on community feedback.
+
+ \section3 QGraphicsLayout
+
+ QGraphicsLayout is part of a second-generation layout framework
+ designed specifically for QGraphicsWidget. Its API is very similar
+ to that of QLayout. You can manage widgets and sublayouts inside
+ either QGraphicsLinearLayout and QGraphicsGridLayout. You can also
+ easily write your own layout by subclassing QGraphicsLayout
+ yourself, or add your own QGraphicsItem items to the layout by
+ writing an adaptor subclass of QGraphicsLayoutItem.
+
+ \section2 Embedded Widget Support
+
+ Graphics View provides seamless support for embedding any widget
+ into the scene. You can embed simple widgets, such as QLineEdit or
+ QPushButton, complex widgets such as QTabWidget, and even complete
+ main windows. To embed your widget to the scene, simply call
+ QGraphicsScene::addWidget(), or create an instance of
+ QGraphicsProxyWidget to embed your widget manually.
+
+ Through QGraphicsProxyWidget, Graphics View is able to deeply
+ integrate the client widget features including its cursors,
+ tooltips, mouse, tablet and keyboard events, child widgets,
+ animations, pop-ups (e.g., QComboBox or QCompleter), and the widget's
+ input focus and activation. QGraphicsProxyWidget even integrates the
+ embedded widget's tab order so that you can tab in and out of
+ embedded widgets. You can even embed a new QGraphicsView into your
+ scene to provide complex nested scenes.
+
+ When transforming an embedded widget, Graphics View makes sure that
+ the widget is transformed resolution independently, allowing the
+ fonts and style to stay crisp when zoomed in. (Note that the effect
+ of resolution independence depends on the style.)
+
+ \section1 Performance
+
+ \section2 Floating Point Instructions
+
+ In order to accurately and quickly apply transformations and effects to
+ items, Graphics View is built with the assumption that the user's hardware
+ is able to provide reasonable performance for floating point instructions.
+
+ Many workstations and desktop computers are equipped with suitable hardware
+ to accelerate this kind of computation, but some embedded devices may only
+ provide libraries to handle mathematical operations or emulate floating
+ point instructions in software.
+
+ As a result, certain kinds of effects may be slower than expected on certain
+ devices. It may be possible to compensate for this performance hit by making
+ optimizations in other areas; for example, by using \l{#OpenGL Rendering}{OpenGL}
+ to render a scene. However, any such optimizations may themselves cause a
+ reduction in performance if they also rely on the presence of floating point
+ hardware.
+*/
diff --git a/doc/src/frameworks-technologies/implicit-sharing.qdoc b/doc/src/frameworks-technologies/implicit-sharing.qdoc
new file mode 100644
index 0000000..4f9c8db
--- /dev/null
+++ b/doc/src/frameworks-technologies/implicit-sharing.qdoc
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/* TODO: Move some of the documentation from QSharedDataPointer into this
+ document. */
+
+/*!
+ \group shared
+ \title Implicitly Shared Classes
+*/
+
+/*!
+ \page implicit-sharing.html
+ \title Implicit Sharing
+ \ingroup frameworks-technologies
+
+ \brief Reference counting for fast copying.
+
+ \keyword implicit data sharing
+ \keyword implicit sharing
+ \keyword implicitly shared
+ \keyword reference counting
+ \keyword shared implicitly
+ \keyword shared classes
+
+ Many C++ classes in Qt use implicit data sharing to maximize
+ resource usage and minimize copying. Implicitly shared classes are
+ both safe and efficient when passed as arguments, because only a
+ pointer to the data is passed around, and the data is copied only
+ if and when a function writes to it, i.e., \e {copy-on-write}.
+
+ \tableofcontents
+
+ \section1 Overview
+
+ A shared class consists of a pointer to a shared data block that
+ contains a reference count and the data.
+
+ When a shared object is created, it sets the reference count to 1. The
+ reference count is incremented whenever a new object references the
+ shared data, and decremented when the object dereferences the shared
+ data. The shared data is deleted when the reference count becomes
+ zero.
+
+ \keyword deep copy
+ \keyword shallow copy
+
+ When dealing with shared objects, there are two ways of copying an
+ object. We usually speak about \e deep and \e shallow copies. A deep
+ copy implies duplicating an object. A shallow copy is a reference
+ copy, i.e. just a pointer to a shared data block. Making a deep copy
+ can be expensive in terms of memory and CPU. Making a shallow copy is
+ very fast, because it only involves setting a pointer and incrementing
+ the reference count.
+
+ Object assignment (with operator=()) for implicitly shared objects is
+ implemented using shallow copies.
+
+ The benefit of sharing is that a program does not need to duplicate
+ data unnecessarily, which results in lower memory use and less copying
+ of data. Objects can easily be assigned, sent as function arguments,
+ and returned from functions.
+
+ Implicit sharing takes place behind the scenes; the programmer
+ does not need to worry about it. Even in multithreaded
+ applications, implicit sharing takes place, as explained in
+ \l{Thread-Support in Qt Modules#Threads and Implicitly Shared Classes}
+ {Threads and Implicitly Shared Classes}.
+
+ When implementing your own implicitly shared classes, use the
+ QSharedData and QSharedDataPointer classes.
+
+ \section1 Implicit Sharing in Detail
+
+ Implicit sharing automatically detaches the object from a shared
+ block if the object is about to change and the reference count is
+ greater than one. (This is often called \e {copy-on-write} or
+ \e {value semantics}.)
+
+ An implicitly shared class has total control of its internal data. In
+ any member functions that modify its data, it automatically detaches
+ before modifying the data.
+
+ The QPen class, which uses implicit sharing, detaches from the shared
+ data in all member functions that change the internal data.
+
+ Code fragment:
+ \snippet doc/src/snippets/code/doc_src_groups.qdoc 0
+
+
+ \section1 List of Classes
+
+ The classes listed below automatically detach from common data if
+ an object is about to be changed. The programmer will not even
+ notice that the objects are shared. Thus you should treat
+ separate instances of them as separate objects. They will always
+ behave as separate objects but with the added benefit of sharing
+ data whenever possible. For this reason, you can pass instances
+ of these classes as arguments to functions by value without
+ concern for the copying overhead.
+
+ Example:
+ \snippet doc/src/snippets/code/doc_src_groups.qdoc 1
+
+ In this example, \c p1 and \c p2 share data until QPainter::begin()
+ is called for \c p2, because painting a pixmap will modify it.
+
+ \warning Do not copy an implicitly shared container (QMap,
+ QVector, etc.) while you are iterating over it using an non-const
+ \l{STL-style iterator}.
+
+ \keyword implicitly shared classes
+ \annotatedlist shared
+*/
diff --git a/doc/src/frameworks-technologies/ipc.qdoc b/doc/src/frameworks-technologies/ipc.qdoc
new file mode 100644
index 0000000..0cde1b9
--- /dev/null
+++ b/doc/src/frameworks-technologies/ipc.qdoc
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page ipc.html
+ \title Inter-Process Communication in Qt
+ \brief Inter-Process communication in Qt applications.
+
+ \ingroup frameworks-technologies
+
+ Qt provides several ways to implement Inter-Process Communication
+ (IPC) in Qt applications.
+
+ \section1 TCP/IP
+
+ The cross-platform \l{QtNetwork} module provides classes that make
+ network programming portable and easy. It offers high-level
+ classes (e.g., QNetworkAccessManager, QFtp) that communicate using
+ specific application-level protocols, and lower-level classes
+ (e.g., QTcpSocket, QTcpServer, QSslSocket) for implementing
+ protocols.
+
+ \section1 Shared Memory
+
+ The cross-platform shared memory class, QSharedMemory, provides
+ access to the operating system's shared memory implementation.
+ It allows safe access to shared memory segments by multiple threads
+ and processes. Additionally, QSystemSemaphore can be used to control
+ access to resources shared by the system, as well as to communicate
+ between processes.
+
+ \section1 D-Bus
+
+ The \l{QtDBus} module is a Unix-only library
+ you can use to implement IPC using the D-Bus protocol. It extends
+ Qt's \l{signalsandslots.html} {Signals and Slots} mechanism to the
+ IPC level, allowing a signal emitted by one process to be
+ connected to a slot in another process. This \l {Introduction to
+ D-Bus} page has detailed information on how to use the \l{QtDBus}
+ module.
+
+ \section1 Qt COmmunications Protocol (QCOP)
+
+ The QCopChannel class implements a protocol for transferring messages
+ between client processes across named channels. QCopChannel is
+ only available in \l{Qt for Embedded Linux}. Like the \l{QtDBus}
+ module, QCOP extends Qt's \l{Signals and Slots} mechanism to the
+ IPC level, allowing a signal emitted by one process to be
+ connected to a slot in another process, but unlike QtDBus, QCOP
+ does not depend on a third party library.
+*/
diff --git a/doc/src/frameworks-technologies/model-view-programming.qdoc b/doc/src/frameworks-technologies/model-view-programming.qdoc
new file mode 100644
index 0000000..3786d79
--- /dev/null
+++ b/doc/src/frameworks-technologies/model-view-programming.qdoc
@@ -0,0 +1,2498 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group model-view
+ \title Model/View Classes
+*/
+
+/*!
+ \page model-view-programming.html
+ \nextpage An Introduction to Model/View Programming
+ \startpage index.html Qt Reference Documentation
+
+ \title Model/View Programming
+ \brief A guide to the extensible model/view architecture used by Qt's
+ item view classes.
+
+ \ingroup frameworks-technologies
+
+ \list
+ \o \l{An Introduction to Model/View Programming}
+ \tableofcontents{1 An Introduction to Model/View Programming}
+ \o \l{Using Models and Views}
+ \tableofcontents{1 Using Models and Views}
+ \o \l{Model Classes}
+ \tableofcontents{1 Model Classes}
+ \o \l{Creating New Models}
+ \tableofcontents{1 Creating New Models}
+ \o \l{View Classes}
+ \tableofcontents{1 View Classes}
+ \o \l{Handling Selections in Item Views}
+ \tableofcontents{1 Handling Selections in Item Views}
+ \o \l{Delegate Classes}
+ \tableofcontents{1 Delegate Classes}
+ \o \l{Item View Convenience Classes}
+ \tableofcontents{1 Item View Convenience Classes}
+ \o \l{Using Drag and Drop with Item Views}
+ \tableofcontents{1 Using Drag and Drop with Item Views}
+ \o \l{Proxy Models}
+ \tableofcontents{1 Proxy Models}
+ \o \l{Model Subclassing Reference}
+ \tableofcontents{1 Model Subclassing Reference}
+ \endlist
+
+ \keyword Model/View Classes
+ \section1 All Model/View Classes
+
+ These classes use the model/view design pattern in which the
+ underlying data (in the model) is kept separate from the way the data
+ is presented and manipulated by the user (in the view).
+
+ \annotatedlist model-view
+
+ \section1 Related Examples
+
+ \list
+ \o \l{itemviews/dirview}{Dir View}
+ \o \l{itemviews/spinboxdelegate}{Spin Box Delegate}
+ \o \l{itemviews/pixelator}{Pixelator}
+ \o \l{itemviews/simpletreemodel}{Simple Tree Model}
+ \o \l{itemviews/chart}{Chart}
+ \endlist
+*/
+
+/*!
+ \page model-view-introduction.html
+ \previouspage Model/View Programming
+ \nextpage Using Models and Views
+ \startpage index.html Qt Reference Documentation
+
+ \title An Introduction to Model/View Programming
+
+ \tableofcontents
+
+ Qt 4 introduces a new set of item view classes that use a model/view
+ architecture to manage the relationship between data and the way it
+ is presented to the user. The separation of functionality introduced by
+ this architecture gives developers greater flexibility to customize the
+ presentation of items, and provides a standard model interface to allow
+ a wide range of data sources to be used with existing item views.
+ In this document, we give a brief introduction to the model/view paradigm,
+ outline the concepts involved, and describe the architecture of the item
+ view system. Each of the components in the architecture is explained,
+ and examples are given that show how to use the classes provided.
+
+ \section1 The Model/View Architecture
+
+ Model-View-Controller (MVC) is a design pattern originating from
+ Smalltalk that is often used when building user interfaces.
+ In \l{Design Patterns}, Gamma et al. write:
+
+ \quotation
+ MVC consists of three kinds of objects. The Model is the application
+ object, the View is its screen presentation, and the Controller defines
+ the way the user interface reacts to user input. Before MVC, user
+ interface designs tended to lump these objects together. MVC decouples
+ them to increase flexibility and reuse.
+ \endquotation
+
+ If the view and the controller objects are combined, the result is
+ the model/view architecture. This still separates the way that data
+ is stored from the way that it is presented to the user, but provides
+ a simpler framework based on the same principles. This separation
+ makes it possible to display the same data in several different views,
+ and to implement new types of views, without changing the underlying
+ data structures.
+ To allow flexible handling of user input, we introduce the concept of
+ the \e delegate. The advantage of having a delegate in this framework
+ is that it allows the way items of data are rendered and edited to be
+ customized.
+
+ \table
+ \row \i \inlineimage modelview-overview.png
+ \i \bold{The model/view architecture}
+
+ The model communicates with a source of data, providing an \e interface
+ for the other components in the architecture. The nature of the
+ communication depends on the type of data source, and the way the model
+ is implemented.
+
+ The view obtains \e{model indexes} from the model; these are references
+ to items of data. By supplying model indexes to the model, the view can
+ retrieve items of data from the data source.
+
+ In standard views, a \e delegate renders the items of data. When an item
+ is edited, the delegate communicates with the model directly using
+ model indexes.
+ \endtable
+
+ Generally, the model/view classes can be separated into the three groups
+ described above: models, views, and delegates. Each of these components
+ is defined by \e abstract classes that provide common interfaces and,
+ in some cases, default implementations of features.
+ Abstract classes are meant to be subclassed in order to provide the full
+ set of functionality expected by other components; this also allows
+ specialized components to be written.
+
+ Models, views, and delegates communicate with each other using \e{signals
+ and slots}:
+
+ \list
+ \o Signals from the model inform the view about changes to the data
+ held by the data source.
+ \o Signals from the view provide information about the user's interaction
+ with the items being displayed.
+ \o Signals from the delegate are used during editing to tell the
+ model and view about the state of the editor.
+ \endlist
+
+ \section2 Models
+
+ All item models are based on the QAbstractItemModel class. This class
+ defines an interface that is used by views and delegates to access data.
+ The data itself does not have to be stored in the model; it can be held
+ in a data structure or repository provided by a separate class, a file,
+ a database, or some other application component.
+
+ The basic concepts surrounding models are presented in the section
+ on \l{Model Classes}.
+
+ QAbstractItemModel
+ provides an interface to data that is flexible enough to handle views
+ that represent data in the form of tables, lists, and trees. However,
+ when implementing new models for list and table-like data structures,
+ the QAbstractListModel and QAbstractTableModel classes are better
+ starting points because they provide appropriate default implementations
+ of common functions. Each of these classes can be subclassed to provide
+ models that support specialized kinds of lists and tables.
+
+ The process of subclassing models is discussed in the section on
+ \l{Creating New Models}.
+
+ Qt provides some ready-made models that can be used to handle items of
+ data:
+
+ \list
+ \o QStringListModel is used to store a simple list of QString items.
+ \o QStandardItemModel manages more complex tree structures of items, each
+ of which can contain arbitrary data.
+ \o QDirModel provides information about files and directories in the local
+ filing system.
+ \o QSqlQueryModel, QSqlTableModel, and QSqlRelationalTableModel are used
+ to access databases using model/view conventions.
+ \endlist
+
+ If these standard models do not meet your requirements, you can subclass
+ QAbstractItemModel, QAbstractListModel, or QAbstractTableModel to create
+ your own custom models.
+
+ \section2 Views
+
+ Complete implementations are provided for different kinds of
+ views: QListView displays a list of items, QTableView displays data
+ from a model in a table, and QTreeView shows model items of data in a
+ hierarchical list. Each of these classes is based on the
+ QAbstractItemView abstract base class. Although these classes are
+ ready-to-use implementations, they can also be subclassed to provide
+ customized views.
+
+ The available views are examined in the section on \l{View Classes}.
+
+ \section2 Delegates
+
+ QAbstractItemDelegate is the abstract base class for delegates in the
+ model/view framework. Since Qt 4.4, the default delegate implementation is
+ provided by QStyledItemDelegate, and this is used as the default delegate
+ by Qt's standard views. However, QStyledItemDelegate and QItemDelegate are
+ independent alternatives to painting and providing editors for items in
+ views. The difference between them is that QStyledItemDelegate uses the
+ current style to paint its items. We therefore recommend using
+ QStyledItemDelegate as the base class when implementing custom delegates or
+ when working with Qt style sheets.
+
+ Delegates are described in the section on \l{Delegate Classes}.
+
+ \section2 Sorting
+
+ There are two ways of approaching sorting in the model/view
+ architecture; which approach to choose depends on your underlying
+ model.
+
+ If your model is sortable, i.e, if it reimplements the
+ QAbstractItemModel::sort() function, both QTableView and QTreeView
+ provide an API that allows you to sort your model data
+ programmatically. In addition, you can enable interactive sorting
+ (i.e. allowing the users to sort the data by clicking the view's
+ headers), by connecting the QHeaderView::sortIndicatorChanged() signal
+ to the QTableView::sortByColumn() slot or the
+ QTreeView::sortByColumn() slot, respectively.
+
+ The alternative approach, if your model do not have the required
+ interface or if you want to use a list view to present your data,
+ is to use a proxy model to transform the structure of your model
+ before presenting the data in the view. This is covered in detail
+ in the section on \l {Proxy Models}.
+
+ \section2 Convenience Classes
+
+ A number of \e convenience classes are derived from the standard view
+ classes for the benefit of applications that rely on Qt's item-based
+ item view and table classes. They are not intended to be subclassed,
+ but simply exist to provide a familiar interface to the equivalent classes
+ in Qt 3.
+ Examples of such classes include \l QListWidget, \l QTreeWidget, and
+ \l QTableWidget; these provide similar behavior to the \c QListBox,
+ \c QListView, and \c QTable classes in Qt 3.
+
+ These classes are less flexible than the view classes, and cannot be
+ used with arbitrary models. We recommend that you use a model/view
+ approach to handling data in item views unless you strongly need an
+ item-based set of classes.
+
+ If you wish to take advantage of the features provided by the model/view
+ approach while still using an item-based interface, consider using view
+ classes, such as QListView, QTableView, and QTreeView with
+ QStandardItemModel.
+
+ \section1 The Model/View Components
+
+ The following sections describe the way in which the model/view pattern
+ is used in Qt. Each section provides an example of use, and is followed
+ by a section showing how you can create new components.
+*/
+
+/*!
+ \page model-view-using.html
+ \contentspage model-view-programming.html Contents
+ \previouspage An Introduction to Model/View Programming
+ \nextpage Model Classes
+
+ \title Using Models and Views
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ Two of the standard models provided by Qt are QStandardItemModel and
+ QDirModel. QStandardItemModel is a multi-purpose model that can be used
+ to represent various different data structures needed by list, table,
+ and tree views. This model also holds the items of data.
+ QDirModel is a model that maintains information about the contents of a
+ directory. As a result, it does not hold any items of data itself, but
+ simply represents files and directories on the local filing system.
+
+ QDirModel provides a ready-to-use model to experiment with, and can be
+ easily configured to use existing data. Using this model, we can show how
+ to set up a model for use with ready-made views, and explore how to
+ manipulate data using model indexes.
+
+ \section1 Using Views with an Existing Model
+
+ The QListView and QTreeView classes are the most suitable views
+ to use with QDirModel. The example presented below displays the
+ contents of a directory in a tree view next to the same information in
+ a list view. The views share the user's selection so that the selected
+ items are highlighted in both views.
+
+ \img shareddirmodel.png
+
+ We set up a QDirModel so that it is ready for use, and create some
+ views to display the contents of a directory. This shows the simplest
+ way to use a model. The construction and use of the model is
+ performed from within a single \c main() function:
+
+ \snippet doc/src/snippets/shareddirmodel/main.cpp 0
+
+ The model is set up to use data from a default directory. We create two
+ views so that we can examine the items held in the model in two
+ different ways:
+
+ \snippet doc/src/snippets/shareddirmodel/main.cpp 5
+
+ The views are constructed in the same way as other widgets. Setting up
+ a view to display the items in the model is simply a matter of calling its
+ \l{QAbstractItemView::setModel()}{setModel()} function with the directory
+ model as the argument. The calls to
+ \l{QAbstractItemView::setRootIndex()}{setRootIndex()} tell the views which
+ directory to display by supplying a \e{model index} that we obtain from
+ the directory model.
+
+ The \c index() function used in this case is unique to QDirModel; we supply
+ it with a directory and it returns a model index. Model indexes are
+ discussed in the \l{Model Classes} chapter.
+
+ The rest of the function just displays the views within a splitter
+ widget, and runs the application's event loop:
+
+ \snippet doc/src/snippets/shareddirmodel/main.cpp 8
+
+ In the above example, we neglected to mention how to handle selections
+ of items. This subject is covered in more detail in the chapter on
+ \l{Handling Selections in Item Views}. Before examining how selections
+ are handled, you may find it useful to read the \l{Model Classes} chapter
+ which describes the concepts used in the model/view framework.
+*/
+
+/*!
+ \page model-view-model.html
+ \contentspage model-view-programming.html Contents
+ \previouspage Using Models and Views
+ \nextpage Creating New Models
+
+ \title Model Classes
+
+ \tableofcontents
+
+ \section1 Basic Concepts
+
+ In the model/view architecture, the model provides a standard interface
+ that views and delegates use to access data. In Qt, the standard
+ interface is defined by the QAbstractItemModel class. No matter how the
+ items of data are stored in any underlying data structure, all subclasses
+ of QAbstractItemModel represent the data as a hierarchical structure
+ containing tables of items. Views use this \e convention to access items
+ of data in the model, but they are not restricted in the way that they
+ present this information to the user.
+
+ \image modelview-models.png
+
+ Models also notify any attached views about changes to data through the
+ signals and slots mechanism.
+
+ This chapter describes some basic concepts that are central to the way
+ item of data are accessed by other components via a model class. More
+ advanced concepts are discussed in later chapters.
+
+ \section2 Model Indexes
+
+ To ensure that the representation of the data is kept separate from the
+ way it is accessed, the concept of a \e{model index} is introduced. Each
+ piece of information that can be obtained via a model is represented by
+ a model index. Views and delegates use these indexes to request items of
+ data to display.
+
+ As a result, only the model needs to know how to obtain data, and the type
+ of data managed by the model can be defined fairly generally. Model indexes
+ contain a pointer to the model that created them, and this prevents
+ confusion when working with more than one model.
+
+ \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 0
+
+ Model indexes provide \e temporary references to pieces of information, and
+ can be used to retrieve or modify data via the model. Since models may
+ reorganize their internal structures from time to time, model indexes may
+ become invalid, and \e{should not be stored}. If a long-term reference to a
+ piece of information is required, a \e{persistent model index} must be
+ created. This provides a reference to the information that the model keeps
+ up-to-date. Temporary model indexes are provided by the QModelIndex class,
+ and persistent model indexes are provided by the QPersistentModelIndex
+ class.
+
+ To obtain a model index that corresponds to an item of data, three
+ properties must be specified to the model: a row number, a column number,
+ and the model index of a parent item. The following sections describe
+ and explain these properties in detail.
+
+ \section2 Rows and Columns
+
+ In its most basic form, a model can be accessed as a simple table in which
+ items are located by their row and column numbers. \e{This does not mean
+ that the underlying pieces of data are stored in an array structure}; the
+ use of row and column numbers is only a convention to allow components to
+ communicate with each other. We can retrieve information about any given
+ item by specifying its row and column numbers to the model, and we receive
+ an index that represents the item:
+
+ \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 1
+
+ Models that provide interfaces to simple, single level data structures like
+ lists and tables do not need any other information to be provided but, as
+ the above code indicates, we need to supply more information when obtaining
+ a model index.
+
+ \table
+ \row \i \inlineimage modelview-tablemodel.png
+ \i \bold{Rows and columns}
+
+ The diagram shows a representation of a basic table model in which each
+ item is located by a pair of row and column numbers. We obtain a model
+ index that refers to an item of data by passing the relevant row and
+ column numbers to the model.
+
+ \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 2
+
+ Top level items in a model are always referenced by specifying
+ \c QModelIndex() as their parent item. This is discussed in the next
+ section.
+ \endtable
+
+ \section2 Parents of Items
+
+ The table-like interface to item data provided by models is ideal when
+ using data in a table or list view; the row and column number system maps
+ exactly to the way the views display items. However, structures such as
+ tree views require the model to expose a more flexible interface to the
+ items within. As a result, each item can also be the parent of another
+ table of items, in much the same way that a top-level item in a tree view
+ can contain another list of items.
+
+ When requesting an index for a model item, we must provide some information
+ about the item's parent. Outside the model, the only way to refer to an
+ item is through a model index, so a parent model index must also be given:
+
+ \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 3
+
+ \table
+ \row \i \inlineimage modelview-treemodel.png
+ \i \bold{Parents, rows, and columns}
+
+ The diagram shows a representation of a tree model in which each item is
+ referred to by a parent, a row number, and a column number.
+
+ Items "A" and "C" are represented as top-level siblings in the model:
+
+ \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 4
+
+ Item "A" has a number of children. A model index for item "B" is
+ obtained with the following code:
+
+ \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 5
+ \endtable
+
+ \section2 Item Roles
+
+ Items in a model can perform various \e roles for other components,
+ allowing different kinds of data to be supplied for different situations.
+ For example, Qt::DisplayRole is used to access a string that can be
+ displayed as text in a view. Typically, items contain data for a number of
+ different roles, and the standard roles are defined by Qt::ItemDataRole.
+
+ We can ask the model for the item's data by passing it the model index
+ corresponding to the item, and by specifying a role to obtain the type
+ of data we want:
+
+ \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 6
+
+ \table
+ \row \i \inlineimage modelview-roles.png
+ \i \bold{Item roles}
+
+ The role indicates to the model which type of data is being referred to.
+ Views can display the roles in different ways, so it is important to
+ supply appropriate information for each role.
+
+ The \l{Creating New Models} section covers some specific uses of roles in
+ more detail.
+ \endtable
+
+ Most common uses for item data are covered by the standard roles defined in
+ Qt::ItemDataRole. By supplying appropriate item data for each role, models
+ can provide hints to views and delegates about how items should be
+ presented to the user. Different kinds of views have the freedom to
+ interpret or ignore this information as required. It is also possible to
+ define additional roles for application-specific purposes.
+
+ \section2 Summary of Concepts
+
+ \list
+ \o Model indexes give views and delegates information about the location
+ of items provided by models in a way that is independent of any
+ underlying data structures.
+ \o Items are referred to by their row and column numbers, and by the model
+ index of their parent items.
+ \o Model indexes are constructed by models at the request of other
+ components, such as views and delegates.
+ \o If a valid model index is specified for the parent item when an index is
+ requested using \l{QAbstractItemModel::index()}{index()}, the index
+ returned will refer to an item beneath that parent item in the
+ model.
+ The index obtained refers to a child of that item.
+ \o If an invalid model index is specified for the parent item when an index
+ is requested using \l{QAbstractItemModel::index()}{index()}, the index
+ returned will refer to a top-level item in the model.
+ \o The \l{Qt::ItemDataRole}{role} distinguishes between the
+ different kinds of data associated with an item.
+ \endlist
+
+ \section2 Using Model Indexes
+
+ To demonstrate how data can be retrieved from a model, using model
+ indexes, we set up a QDirModel without a view and display the
+ names of files and directories in a widget.
+ Although this does not show a normal way of using a model, it demonstrates
+ the conventions used by models when dealing with model indexes.
+
+ We construct a directory model in the following way:
+
+ \snippet doc/src/snippets/simplemodel-use/main.cpp 0
+
+ In this case, we set up a default QDirModel, obtain a parent index using
+ a specific implementation of \l{QDirModel::index()}{index()} provided by
+ that model, and we count the number of rows in the model using the
+ \l{QDirModel::rowCount()}{rowCount()} function.
+
+ For simplicity, we are only interested in the items in the first column
+ of the model. We examine each row in turn, obtaining a model index for
+ the first item in each row, and read the data stored for that item
+ in the model.
+
+ \snippet doc/src/snippets/simplemodel-use/main.cpp 1
+
+ To obtain a model index, we specify the row number, column number (zero
+ for the first column), and the appropriate model index for the parent
+ of all the items that we want.
+ The text stored in each item is retrieved using the model's
+ \l{QDirModel::data()}{data()} function. We specify the model index and
+ the \l{Qt::ItemDataRole}{DisplayRole} to obtain data for the
+ item in the form of a string.
+
+ \snippet doc/src/snippets/simplemodel-use/main.cpp 2
+ \codeline
+ \snippet doc/src/snippets/simplemodel-use/main.cpp 3
+
+ The above example demonstrates the basic principles used to retrieve
+ data from a model:
+
+ \list
+ \i The dimensions of a model can be found using
+ \l{QAbstractItemModel::rowCount()}{rowCount()} and
+ \l{QAbstractItemModel::columnCount()}{columnCount()}.
+ These functions generally require a parent model index to be
+ specified.
+ \i Model indexes are used to access items in the model. The row, column,
+ and parent model index are needed to specify the item.
+ \i To access top-level items in a model, specify a null model index
+ as the parent index with \c QModelIndex().
+ \i Items contain data for different roles. To obtain the data for a
+ particular role, both the model index and the role must be supplied
+ to the model.
+ \endlist
+
+
+ \section1 Further Reading
+
+ New models can be created by implementing the standard interface provided
+ by QAbstractItemModel. In the \l{Creating New Models} chapter, we will
+ demonstrate this by creating a convenient ready-to-use model for holding
+ lists of strings.
+*/
+
+/*!
+ \page model-view-view.html
+ \contentspage model-view-programming.html Contents
+ \previouspage Creating New Models
+ \nextpage Handling Selections in Item Views
+
+ \title View Classes
+
+ \tableofcontents
+
+ \section1 Concepts
+
+ In the model/view architecture, the view obtains items of data from the
+ model and presents them to the user. The way that the data is
+ presented need not resemble the representation of the data provided by
+ the model, and may be \e{completely different} from the underlying data
+ structure used to store items of data.
+
+ The separation of content and presentation is achieved by the use of a
+ standard model interface provided by QAbstractItemModel, a standard view
+ interface provided by QAbstractItemView, and the use of model indexes
+ that represent items of data in a general way.
+ Views typically manage the overall layout of the data obtained from
+ models. They may render individual items of data themselves, or use
+ \l{Delegate Classes}{delegates} to handle both rendering and editing
+ features.
+
+ As well as presenting data, views handle navigation between items,
+ and some aspects of item selection. The views also implement basic
+ user interface features, such as context menus and drag and drop.
+ A view can provide default editing facilities for items, or it may
+ work with a \l{Delegate Classes}{delegate} to provide a custom
+ editor.
+
+ A view can be constructed without a model, but a model must be
+ provided before it can display useful information. Views keep track of
+ the items that the user has selected through the use of
+ \l{Handling Selections in Item Views}{selections} which can be maintained
+ separately for each view, or shared between multiple views.
+
+ Some views, such as QTableView and QTreeView, display headers as well
+ as items. These are also implemented by a view class, QHeaderView.
+ Headers usually access the same model as the view that contains them.
+ They retrieve data from the model using the
+ \l{QAbstractItemModel::headerData()} function, and usually display
+ header information in the form of a label. New headers can be
+ subclassed from the QHeaderView class to provide more specialized
+ labels for views.
+
+ \section1 Using an Existing View
+
+ Qt provides three ready-to-use view classes that present data from
+ models in ways that are familiar to most users.
+ QListView can display items from a model as a simple list, or in the
+ form of a classic icon view. QTreeView displays items from a
+ model as a hierarchy of lists, allowing deeply nested structures to be
+ represented in a compact way. QTableView presents items from a model
+ in the form of a table, much like the layout of a spreadsheet
+ application.
+
+ \img standard-views.png
+
+ The default behavior of the standard views shown above should be
+ sufficient for most applications. They provide basic editing
+ facilities, and can be customized to suit the needs of more specialized
+ user interfaces.
+
+ \section2 Using a Model
+
+ We take the string list model that \l{Creating New Models}{we created as
+ an example model}, set it up with some data, and construct a view to
+ display the contents of the model. This can all be performed within a
+ single function:
+
+ \snippet doc/src/snippets/stringlistmodel/main.cpp 0
+
+ Note that the \c StringListModel is declared as a \l QAbstractItemModel.
+ This allows us to use the abstract interface to the model, and
+ ensures that the code will still work even if we replace the string list
+ model with a different model in the future.
+
+ The list view provided by \l QListView is sufficient for presenting
+ the items in the string list model. We construct the view, and set up
+ the model using the following lines of code:
+
+ \snippet doc/src/snippets/stringlistmodel/main.cpp 2
+ \snippet doc/src/snippets/stringlistmodel/main.cpp 4
+
+ The view is shown in the normal way:
+
+ \snippet doc/src/snippets/stringlistmodel/main.cpp 5
+
+ The view renders the contents of a model, accessing data via the model's
+ interface. When the user tries to edit an item, the view uses a default
+ delegate to provide an editor widget.
+
+ \img stringlistmodel.png
+
+ The above image shows how a QListView represents the data in the string
+ list model. Since the model is editable, the view automatically allows
+ each item in the list to be edited using the default delegate.
+
+ \section2 Using Multiple Views onto the Same Model
+
+ Providing multiple views onto the same model is simply a matter of
+ setting the same model for each view. In the following code we create
+ two table views, each using the same simple table model which we have
+ created for this example:
+
+ \snippet doc/src/snippets/sharedtablemodel/main.cpp 0
+ \codeline
+ \snippet doc/src/snippets/sharedtablemodel/main.cpp 1
+
+ The use of signals and slots in the model/view architecture means that
+ changes to the model can be propagated to all the attached views,
+ ensuring that we can always access the same data regardless of the
+ view being used.
+
+ \img sharedmodel-tableviews.png
+
+ The above image shows two different views onto the same model, each
+ containing a number of selected items. Although the data from the model
+ is shown consistently across view, each view maintains its own internal
+ selection model. This can be useful in certain situations but, for
+ many applications, a shared selection model is desirable.
+
+ \section1 Handling Selections of Items
+
+ The mechanism for handling selections of items within views is provided
+ by the \l QItemSelectionModel class. All of the standard views construct
+ their own selection models by default, and interact with them in the
+ normal way. The selection model being used by a view can be obtained
+ through the \l{QAbstractItemView::selectionModel()}{selectionModel()}
+ function, and a replacement selection model can be specified with
+ \l{QAbstractItemView::setSelectionModel()}{setSelectionModel()}.
+ The ability to control the selection model used by a view is useful
+ when we want to provide multiple consistent views onto the same model
+ data.
+
+ Generally, unless you are subclassing a model or view, you will not
+ need to manipulate the contents of selections directly. However, the
+ interface to the selection model can be accessed, if required, and
+ this is explored in the chapter on
+ \l{Handling Selections in Item Views}.
+
+ \section2 Sharing Selections Between Views
+
+ Although it is convenient that the view classes provide their own
+ selection models by default, when we use more than one view onto the
+ same model it is often desirable that both the model's data and the
+ user's selection are shown consistently in all views.
+ Since the view classes allow their internal selection models to be
+ replaced, we can achieve a unified selection between views with the
+ following line:
+
+ \snippet doc/src/snippets/sharedtablemodel/main.cpp 2
+
+ The second view is given the selection model for the first view.
+ Both views now operate on the same selection model, keeping both
+ the data and the selected items synchronized.
+
+ \img sharedselection-tableviews.png
+
+ In the example shown above, two views of the same type were used to
+ display the same model's data. However, if two different types of view
+ were used, the selected items may be represented very differently in
+ each view; for example, a contiguous selection in a table view can be
+ represented as a fragmented set of highlighted items in a tree view.
+
+*/
+
+/*!
+ \page model-view-delegate.html
+ \contentspage model-view-programming.html Contents
+ \previouspage Handling Selections in Item Views
+ \nextpage Item View Convenience Classes
+
+ \title Delegate Classes
+
+ \tableofcontents
+
+ \section1 Concepts
+
+ Unlike the Model-View-Controller pattern, the model/view design does not
+ include a completely separate component for managing interaction with
+ the user. Generally, the view is responsible for the presentation of
+ model data to the user, and for processing user input. To allow some
+ flexibility in the way this input is obtained, the interaction is
+ performed by delegates. These components provide input capabilities
+ and are also responsible for rendering individual items in some views.
+ The standard interface for controlling delegates is defined in the
+ \l QAbstractItemDelegate class.
+
+ Delegates are expected to be able to render their contents themselves
+ by implementing the \l{QItemDelegate::paint()}{paint()}
+ and \l{QItemDelegate::sizeHint()}{sizeHint()} functions.
+ However, simple widget-based delegates can subclass \l QItemDelegate
+ instead of \l QAbstractItemDelegate, and take advantage of the default
+ implementations of these functions.
+
+ Editors for delegates can be implemented either by using widgets to manage
+ the editing process or by handling events directly.
+ The first approach is covered later in this chapter, and it is also
+ shown in the \l{Spin Box Delegate Example}{Spin Box Delegate} example.
+
+ The \l{Pixelator Example}{Pixelator} example shows how to create a
+ custom delegate that performs specialized rendering for a table view.
+
+ \section1 Using an Existing Delegate
+
+ The standard views provided with Qt use instances of \l QItemDelegate
+ to provide editing facilities. This default implementation of the
+ delegate interface renders items in the usual style for each of the
+ standard views: \l QListView, \l QTableView, and \l QTreeView.
+
+ All the standard roles are handled by the default delegate used by
+ the standard views. The way these are interpreted is described in the
+ QItemDelegate documentation.
+
+ The delegate used by a view is returned by the
+ \l{QAbstractItemView::itemDelegate()}{itemDelegate()} function.
+ The \l{QAbstractItemView::setItemDelegate()}{setItemDelegate()} function
+ allows you to install a custom delegate for a standard view, and it is
+ necessary to use this function when setting the delegate for a custom
+ view.
+
+ \section1 A Simple Delegate
+
+ The delegate implemented here uses a \l QSpinBox to provide editing
+ facilities, and is mainly intended for use with models that display
+ integers. Although we set up a custom integer-based table model for
+ this purpose, we could easily have used \l QStandardItemModel instead
+ since the custom delegate will control data entry. We construct a
+ table view to display the contents of the model, and this will use
+ the custom delegate for editing.
+
+ \img spinboxdelegate-example.png
+
+ We subclass the delegate from \l QItemDelegate because we do not want
+ to write custom display functions. However, we must still provide
+ functions to manage the editor widget:
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.h 0
+
+ Note that no editor widgets are set up when the delegate is
+ constructed. We only construct an editor widget when it is needed.
+
+ \section2 Providing an Editor
+
+ In this example, when the table view needs to provide an editor, it
+ asks the delegate to provide an editor widget that is appropriate
+ for the item being modified. The
+ \l{QAbstractItemDelegate::createEditor()}{createEditor()} function is
+ supplied with everything that the delegate needs to be able to set up
+ a suitable widget:
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 1
+
+ Note that we do not need to keep a pointer to the editor widget because
+ the view takes responsibility for destroying it when it is no longer
+ needed.
+
+ We install the delegate's default event filter on the editor to ensure
+ that it provides the standard editing shortcuts that users expect.
+ Additional shortcuts can be added to the editor to allow more
+ sophisticated behavior; these are discussed in the section on
+ \l{#EditingHints}{Editing Hints}.
+
+ The view ensures that the editor's data and geometry are set
+ correctly by calling functions that we define later for these purposes.
+ We can create different editors depending on the model index supplied
+ by the view. For example, if we have a column of integers and a column
+ of strings we could return either a \c QSpinBox or a \c QLineEdit,
+ depending on which column is being edited.
+
+ The delegate must provide a function to copy model data into the
+ editor. In this example, we read the data stored in the
+ \l{Qt::ItemDataRole}{display role}, and set the value in the
+ spin box accordingly.
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 2
+
+ In this example, we know that the editor widget is a spin box, but we
+ could have provided different editors for different types of data in
+ the model, in which case we would need to cast the widget to the
+ appropriate type before accessing its member functions.
+
+ \section2 Submitting Data to the Model
+
+ When the user has finished editing the value in the spin box, the view
+ asks the delegate to store the edited value in the model by calling the
+ \l{QAbstractItemDelegate::setModelData()}{setModelData()} function.
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 3
+
+ Since the view manages the editor widgets for the delegate, we only
+ need to update the model with the contents of the editor supplied.
+ In this case, we ensure that the spin box is up-to-date, and update
+ the model with the value it contains using the index specified.
+
+ The standard \l QItemDelegate class informs the view when it has
+ finished editing by emitting the
+ \l{QAbstractItemDelegate::closeEditor()}{closeEditor()} signal.
+ The view ensures that the editor widget is closed and destroyed. In
+ this example, we only provide simple editing facilities, so we need
+ never emit this signal.
+
+ All the operations on data are performed through the interface
+ provided by \l QAbstractItemModel. This makes the delegate mostly
+ independent from the type of data it manipulates, but some
+ assumptions must be made in order to use certain types of
+ editor widgets. In this example, we have assumed that the model
+ always contains integer values, but we can still use this
+ delegate with different kinds of models because \l{QVariant}
+ provides sensible default values for unexpected data.
+
+ \section2 Updating the Editor's Geometry
+
+ It is the responsibility of the delegate to manage the editor's
+ geometry. The geometry must be set when the editor is created, and
+ when the item's size or position in the view is changed. Fortunately,
+ the view provides all the necessary geometry information inside a
+ \l{QStyleOptionViewItem}{view option} object.
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 4
+
+ In this case, we just use the geometry information provided by the
+ view option in the item rectangle. A delegate that renders items with
+ several elements would not use the item rectangle directly. It would
+ position the editor in relation to the other elements in the item.
+
+ \target EditingHints
+ \section2 Editing Hints
+
+ After editing, delegates should provide hints to the other components
+ about the result of the editing process, and provide hints that will
+ assist any subsequent editing operations. This is achieved by
+ emitting the \l{QAbstractItemDelegate::closeEditor()}{closeEditor()}
+ signal with a suitable hint. This is taken care of by the default
+ QItemDelegate event filter which we installed on the spin box when
+ it was constructed.
+
+ The behavior of the spin box could be adjusted to make it more user
+ friendly. In the default event filter supplied by QItemDelegate, if
+ the user hits \key Return to confirm their choice in the spin box,
+ the delegate commits the value to the model and closes the spin box.
+ We can change this behavior by installing our own event filter on the
+ spin box, and provide editing hints that suit our needs; for example,
+ we might emit \l{QAbstractItemDelegate::closeEditor()}{closeEditor()}
+ with the \l{QAbstractItemDelegate::EndEditHint}{EditNextItem} hint to
+ automatically start editing the next item in the view.
+
+ Another approach that does not require the use of an event
+ filter is to provide our own editor widget, perhaps subclassing
+ QSpinBox for convenience. This alternative approach would give us
+ more control over how the editor widget behaves at the cost of
+ writing additional code. It is usually easier to install an event
+ filter in the delegate if you need to customize the behavior of
+ a standard Qt editor widget.
+
+ Delegates do not have to emit these hints, but those that do not will
+ be less integrated into applications, and will be less usable than
+ those that emit hints to support common editing actions.
+*/
+
+/*!
+ \page model-view-selection.html
+ \contentspage model-view-programming.html Contents
+ \previouspage View Classes
+ \nextpage Delegate Classes
+
+ \title Handling Selections in Item Views
+
+ \tableofcontents
+
+ \section1 Concepts
+
+ The selection model used in the item view classes offers many improvements
+ over the selection model used in Qt 3. It provides a more general
+ description of selections based on the facilities of the model/view
+ architecture. Although the standard classes for manipulating selections are
+ sufficient for the item views provided, the selection model allows you to
+ create specialized selection models to suit the requirements for your own
+ item models and views.
+
+ Information about the items selected in a view is stored in an instance of
+ the \l QItemSelectionModel class. This maintains model indexes for items in
+ a single model, and is independent of any views. Since there can be many
+ views onto a model, it is possible to share selections between views,
+ allowing applications to show multiple views in a consistent way.
+
+ Selections are made up of \e{selection ranges}. These efficiently maintain
+ information about large selections of items by recording only the starting
+ and ending model indexes for each range of selected items. Non-contiguous
+ selections of items are constructed by using more than one selection range
+ to describe the selection.
+
+ Selections are applied to a collection of model indexes held by a selection
+ model. The most recent selection of items applied is known as the
+ \e{current selection}. The effects of this selection can be modified even
+ after its application through the use of certain types of selection
+ commands. These are discussed later in this section.
+
+
+ \section2 Current Item and Selected Items
+
+ In a view, there is always a current item and a selected item - two
+ independent states. An item can be the current item and selected at the
+ same time. The view is responsible for ensuring that there is always a
+ current item as keyboard navigation, for example, requires a current item.
+
+ The table below highlights the differences between current item and
+ selected items.
+
+ \table
+ \header
+ \o Current Item
+ \o Selected Items
+
+ \row
+ \o There can only be one current item.
+ \o There can be multiple selected items.
+ \row
+ \o The current item will be changed with key navigation or mouse
+ button clicks.
+ \o The selected state of items is set or unset, depending on several
+ pre-defined modes - e.g., single selection, multiple selection,
+ etc. - when the user interacts with the items.
+ \row
+ \o The current item will be edited if the edit key, \gui F2, is
+ pressed or the item is double-clicked (provided that editing is
+ enabled).
+ \o The current item can be used together with an anchor to specify a
+ range that should be selected or deselected (or a combination of
+ the two).
+ \row
+ \o The current item is indicated by the focus rectangle.
+ \o The selected items are indicated with the selection rectangle.
+ \endtable
+
+ When manipulating selections, it is often helpful to think of
+ \l QItemSelectionModel as a record of the selection state of all the items
+ in an item model. Once a selection model is set up, collections of items
+ can be selected, deselected, or their selection states can be toggled
+ without the need to know which items are already selected. The indexes of
+ all selected items can be retrieved at any time, and other components can
+ be informed of changes to the selection model via the signals and slots
+ mechanism.
+
+
+ \section1 Using a Selection Model
+
+ The standard view classes provide default selection models that can
+ be used in most applications. A selection model belonging to one view
+ can be obtained using the view's
+ \l{QAbstractItemView::selectionModel()}{selectionModel()} function,
+ and shared between many views with
+ \l{QAbstractItemView::setSelectionModel()}{setSelectionModel()},
+ so the construction of new selection models is generally not required.
+
+ A selection is created by specifying a model, and a pair of model
+ indexes to a \l QItemSelection. This uses the indexes to refer to items
+ in the given model, and interprets them as the top-left and bottom-right
+ items in a block of selected items.
+ To apply the selection to items in a model requires the selection to be
+ submitted to a selection model; this can be achieved in a number of ways,
+ each having a different effect on the selections already present in the
+ selection model.
+
+
+ \section2 Selecting Items
+
+ To demonstrate some of the principal features of selections, we construct
+ an instance of a custom table model with 32 items in total, and open a
+ table view onto its data:
+
+ \snippet doc/src/snippets/itemselection/main.cpp 0
+
+ The table view's default selection model is retrieved for later use.
+ We do not modify any items in the model, but instead select a few
+ items that the view will display at the top-left of the table. To do
+ this, we need to retrieve the model indexes corresponding to the
+ top-left and bottom-right items in the region to be selected:
+
+ \snippet doc/src/snippets/itemselection/main.cpp 1
+
+ To select these items in the model, and see the corresponding change
+ in the table view, we need to construct a selection object then apply
+ it to the selection model:
+
+ \snippet doc/src/snippets/itemselection/main.cpp 2
+
+ The selection is applied to the selection model using a command
+ defined by a combination of
+ \l{QItemSelectionModel::SelectionFlag}{selection flags}.
+ In this case, the flags used cause the items recorded in the
+ selection object to be included in the selection model, regardless
+ of their previous state. The resulting selection is shown by the view.
+
+ \img selected-items1.png
+
+ The selection of items can be modified using various operations that
+ are defined by the selection flags. The selection that results from
+ these operations may have a complex structure, but will be represented
+ efficiently by the selection model. The use of different selection
+ flags to manipulate the selected items is described when we examine
+ how to update a selection.
+
+ \section2 Reading the Selection State
+
+ The model indexes stored in the selection model can be read using
+ the \l{QItemSelectionModel::selectedIndexes()}{selectedIndexes()}
+ function. This returns an unsorted list of model indexes that we can
+ iterate over as long as we know which model they are for:
+
+ \snippet doc/src/snippets/reading-selections/window.cpp 0
+
+ The above code uses Qt's convenient \l{Generic Containers}{foreach
+ keyword} to iterate over, and modify, the items corresponding to the
+ indexes returned by the selection model.
+
+ The selection model emits signals to indicate changes in the
+ selection. These notify other components about changes to both the
+ selection as a whole and the currently focused item in the item
+ model. We can connect the
+ \l{QItemSelectionModel::selectionChanged()}{selectionChanged()}
+ signal to a slot, and examine the items in the model that are selected or
+ deselected when the selection changes. The slot is called with two
+ \l{QItemSelection} objects: one contains a list of indexes that
+ correspond to newly selected items; the other contains indexes that
+ correspond to newly deselected items.
+
+ In the following code, we provide a slot that receives the
+ \l{QItemSelectionModel::selectionChanged()}{selectionChanged()}
+ signal, fills in the selected items with
+ a string, and clears the contents of the deselected items.
+
+ \snippet doc/src/snippets/updating-selections/window.cpp 0
+ \snippet doc/src/snippets/updating-selections/window.cpp 1
+ \codeline
+ \snippet doc/src/snippets/updating-selections/window.cpp 2
+
+ We can keep track of the currently focused item by connecting the
+ \l{QItemSelectionModel::currentChanged()}{currentChanged()} signal
+ to a slot that is called with two model indexes. These correspond to
+ the previously focused item, and the currently focused item.
+
+ In the following code, we provide a slot that receives the
+ \l{QItemSelectionModel::currentChanged()}{currentChanged()} signal,
+ and uses the information provided to update the status bar of a
+ \l QMainWindow:
+
+ \snippet doc/src/snippets/updating-selections/window.cpp 3
+
+ Monitoring selections made by the user is straightforward with these
+ signals, but we can also update the selection model directly.
+
+ \section2 Updating a Selection
+
+ Selection commands are provided by a combination of selection flags,
+ defined by \l{QItemSelectionModel::SelectionFlag}.
+ Each selection flag tells the selection model how to update its
+ internal record of selected items when either of the
+ \l{QItemSelection::select()}{select()} functions are called.
+ The most commonly used flag is the
+ \l{QItemSelectionModel::SelectionFlag}{Select} flag
+ which instructs the selection model to record the specified items as
+ being selected. The
+ \l{QItemSelectionModel::SelectionFlag}{Toggle} flag causes the
+ selection model to invert the state of the specified items,
+ selecting any deselected items given, and deselecting any currently
+ selected items. The \l{QItemSelectionModel::SelectionFlag}{Deselect}
+ flag deselects all the specified items.
+
+ Individual items in the selection model are updated by creating a
+ selection of items, and applying them to the selection model. In the
+ following code, we apply a second selection of items to the table
+ model shown above, using the
+ \l{QItemSelectionModel::SelectionFlag}{Toggle} command to invert the
+ selection state of the items given.
+
+ \snippet doc/src/snippets/itemselection/main.cpp 3
+
+ The results of this operation are displayed in the table view,
+ providing a convenient way of visualizing what we have achieved:
+
+ \img selected-items2.png
+
+ By default, the selection commands only operate on the individual
+ items specified by the model indexes. However, the flag used to
+ describe the selection command can be combined with additional flags
+ to change entire rows and columns. For example if you call
+ \l{QItemSelectionModel::select()}{select()} with only one index, but
+ with a command that is a combination of
+ \l{QItemSelectionModel::SelectionFlag}{Select} and
+ \l{QItemSelectionModel::SelectionFlag}{Rows}, the
+ entire row containing the item referred to will be selected.
+ The following code demonstrates the use of the
+ \l{QItemSelectionModel::SelectionFlag}{Rows} and
+ \l{QItemSelectionModel::SelectionFlag}{Columns} flags:
+
+ \snippet doc/src/snippets/itemselection/main.cpp 4
+
+ Although only four indexes are supplied to the selection model, the
+ use of the
+ \l{QItemSelectionModel::SelectionFlag}{Columns} and
+ \l{QItemSelectionModel::SelectionFlag}{Rows} selection flags means
+ that two columns and two rows are selected. The following image shows
+ the result of these two selections:
+
+ \img selected-items3.png
+
+ The commands performed on the example model have all involved
+ accumulating a selection of items in the model. It is also possible
+ to clear the selection, or to replace the current selection with
+ a new one.
+
+ To replace the current selection with a new selection, combine
+ the other selection flags with the
+ \l{QItemSelectionModel::SelectionFlag}{Current} flag. A command using
+ this flag instructs the selection model to replace its current collection
+ of model indexes with those specified in a call to
+ \l{QItemSelectionModel::select()}{select()}.
+ To clear all selections before you start adding new ones,
+ combine the other selection flags with the
+ \l{QItemSelectionModel::SelectionFlag}{Clear} flag. This
+ has the effect of resetting the selection model's collection of model
+ indexes.
+
+ \section2 Selecting All Items in a Model
+
+ To select all items in a model, it is necessary to create a
+ selection for each level of the model that covers all items in that
+ level. We do this by retrieving the indexes corresponding to the
+ top-left and bottom-right items with a given parent index:
+
+ \snippet doc/src/snippets/reading-selections/window.cpp 2
+
+ A selection is constructed with these indexes and the model. The
+ corresponding items are then selected in the selection model:
+
+ \snippet doc/src/snippets/reading-selections/window.cpp 3
+
+ This needs to be performed for all levels in the model.
+ For top-level items, we would define the parent index in the usual way:
+
+ \snippet doc/src/snippets/reading-selections/window.cpp 1
+
+ For hierarchical models, the
+ \l{QAbstractItemModel::hasChildren()}{hasChildren()} function is used to
+ determine whether any given item is the parent of another level of
+ items.
+*/
+
+/*!
+ \page model-view-creating-models.html
+ \contentspage model-view-programming.html Contents
+ \previouspage Model Classes
+ \nextpage View Classes
+
+ \title Creating New Models
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ The separation of functionality between the model/view components allows
+ models to be created that can take advantage of existing views. This
+ approach lets us present data from a variety of sources using standard
+ graphical user interface components, such as QListView, QTableView, and
+ QTreeView.
+
+ The QAbstractItemModel class provides an interface that is flexible
+ enough to support data sources that arrange information in hierarchical
+ structures, allowing for the possibility that data will be inserted,
+ removed, modified, or sorted in some way. It also provides support for
+ drag and drop operations.
+
+ The QAbstractListModel and QAbstractTableModel classes provide support
+ for interfaces to simpler non-hierarchical data structures, and are
+ easier to use as a starting point for simple list and table models.
+
+ In this chapter, we create a simple read-only model to explore
+ the basic principles of the model/view architecture. Later in this
+ chapter, we will adapt this simple model so that items can be modified
+ by the user.
+
+ For an example of a more complex model, see the
+ \l{itemviews/simpletreemodel}{Simple Tree Model} example.
+
+ The requirements of QAbstractItemModel subclasses is described in more
+ detail in the \l{Model Subclassing Reference} document.
+
+ \section1 Designing a Model
+
+ When creating a new model for an existing data structure, it is important
+ to consider which type of model should be used to provide an interface
+ onto the data. If the data structure can be represented as a
+ list or table of items, you can subclass QAbstractListModel or
+ QAbstractTableModel since these classes provide suitable default
+ implementations for many functions.
+
+ However, if the underlying data structure can only be represented by a
+ hierarchical tree structure, it is necessary to subclass
+ QAbstractItemModel. This approach is taken in the
+ \l{itemviews/simpletreemodel}{Simple Tree Model} example.
+
+ In this chapter, we will implement a simple model based on a list of
+ strings, so the QAbstractListModel provides an ideal base class on
+ which to build.
+
+ Whatever form the underlying data structure takes, it is
+ usually a good idea to supplement the standard QAbstractItemModel API
+ in specialized models with one that allows more natural access to the
+ underlying data structure. This makes it easier to populate the model
+ with data, yet still enables other general model/view components to
+ interact with it using the standard API. The model described below
+ provides a custom constructor for just this purpose.
+
+ \section1 A Read-Only Example Model
+
+ The model implemented here is a simple, non-hierarchical, read-only data
+ model based on the standard QStringListModel class. It has a \l QStringList
+ as its internal data source, and implements only what is needed to make a
+ functioning model. To make the implementation easier, we subclass
+ \l QAbstractListModel because it defines sensible default behavior for list
+ models, and it exposes a simpler interface than the \l QAbstractItemModel
+ class.
+
+ When implementing a model it is important to remember that
+ \l QAbstractItemModel does not store any data itself, it merely
+ presents an interface that the views use to access the data.
+ For a minimal read-only model it is only necessary to implement a few
+ functions as there are default implementations for most of the
+ interface. The class declaration is as follows:
+
+
+ \snippet doc/src/snippets/stringlistmodel/model.h 0
+ \snippet doc/src/snippets/stringlistmodel/model.h 1
+ \codeline
+ \snippet doc/src/snippets/stringlistmodel/model.h 5
+
+ Apart from the model's constructor, we only need to implement two
+ functions: \l{QAbstractItemModel::rowCount()}{rowCount()} returns the
+ number of rows in the model and \l{QAbstractItemModel::data()}{data()}
+ returns an item of data corresponding to a specified model index.
+
+ Well behaved models also implement
+ \l{QAbstractItemModel::headerData()}{headerData()} to give tree and
+ table views something to display in their headers.
+
+ Note that this is a non-hierarchical model, so we don't have to worry
+ about the parent-child relationships. If our model was hierarchical, we
+ would also have to implement the
+ \l{QAbstractItemModel::index()}{index()} and
+ \l{QAbstractItemModel::parent()}{parent()} functions.
+
+ The list of strings is stored internally in the \c stringList private
+ member variable.
+
+ \section2 Dimensions of The Model
+
+ We want the number of rows in the model to be the same as the number of
+ strings in the string list. We implement the
+ \l{QAbstractItemModel::rowCount()}{rowCount()} function with this in
+ mind:
+
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 0
+
+ Since the model is non-hierarchical, we can safely ignore the model index
+ corresponding to the parent item. By default, models derived from
+ QAbstractListModel only contain one column, so we do not need to
+ reimplement the \l{QAbstractItemModel::columnCount()}{columnCount()}
+ function.
+
+ \section2 Model Headers and Data
+
+ For items in the view, we want to return the strings in the string list.
+ The \l{QAbstractItemModel::data()}{data()} function is responsible for
+ returning the item of data that corresponds to the index argument:
+
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 1-data-read-only
+
+ We only return a valid QVariant if the model index supplied is valid,
+ the row number is within the range of items in the string list, and the
+ requested role is one that we support.
+
+ Some views, such as QTreeView and QTableView, are able to display headers
+ along with the item data. If our model is displayed in a view with headers,
+ we want the headers to show the row and column numbers. We can provide
+ information about the headers by subclassing the
+ \l{QAbstractItemModel::headerData()}{headerData()} function:
+
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 2
+
+ Again, we return a valid QVariant only if the role is one that we support.
+ The orientation of the header is also taken into account when deciding the
+ exact data to return.
+
+ Not all views display headers with the item data, and those that do may
+ be configured to hide them. Nonetheless, it is recommended that you
+ implement the \l{QAbstractItemModel::headerData()}{headerData()} function
+ to provide relevant information about the data provided by the model.
+
+ An item can have several roles, giving out different data depending on the
+ role specified. The items in our model only have one role,
+ \l{Qt::ItemDataRole}{DisplayRole}, so we return the data
+ for items irrespective of the role specified.
+ However, we could reuse the data we provide for the
+ \l{Qt::ItemDataRole}{DisplayRole} in
+ other roles, such as the
+ \l{Qt::ItemDataRole}{ToolTipRole} that views can use to
+ display information about items in a tooltip.
+
+ \section1 An Editable Model
+
+ The read-only model shows how simple choices could be presented to the
+ user but, for many applications, an editable list model is much more
+ useful. We can modify the read-only model to make the items editable
+ by changing the data() function we implemented for read-only, and
+ by implementing two extra functions:
+ \l{QAbstractItemModel::flags()}{flags()} and
+ \l{QAbstractItemModel::setData()}{setData()}.
+ The following function declarations are added to the class definition:
+
+ \snippet doc/src/snippets/stringlistmodel/model.h 2
+ \snippet doc/src/snippets/stringlistmodel/model.h 3
+
+ \section2 Making the Model Editable
+
+ A delegate checks whether an item is editable before creating an
+ editor. The model must let the delegate know that its items are
+ editable. We do this by returning the correct flags for each item in
+ the model; in this case, we enable all items and make them both
+ selectable and editable:
+
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 3
+
+ Note that we do not have to know how the delegate performs the actual
+ editing process. We only have to provide a way for the delegate to set the
+ data in the model. This is achieved through the
+ \l{QAbstractItemModel::setData()}{setData()} function:
+
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 4
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 5
+
+ In this model, the item in the string list that corresponds to the
+ model index is replaced by the value provided. However, before we
+ can modify the string list, we must make sure that the index is
+ valid, the item is of the correct type, and that the role is
+ supported. By convention, we insist that the role is the
+ \l{Qt::ItemDataRole}{EditRole} since this is the role used by the
+ standard item delegate. For boolean values, however, you can use
+ Qt::CheckStateRole and set the Qt::ItemIsUserCheckable flag; a
+ checkbox will then be used for editing the value. The underlying
+ data in this model is the same for all roles, so this detail just
+ makes it easier to integrate the model with standard components.
+
+ When the data has been set, the model must let the views know that some
+ data has changed. This is done by emitting the
+ \l{QAbstractItemModel::dataChanged()}{dataChanged()} signal. Since only
+ one item of data has changed, the range of items specified in the signal
+ is limited to just one model index.
+
+ Also the data() function needs to be changed to add the Qt::EditRole test:
+
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 1
+
+ \section2 Inserting and Removing Rows
+
+ It is possible to change the number of rows and columns in a model. In the
+ string list model it only makes sense to change the number of rows, so we
+ only reimplement the functions for inserting and removing rows. These are
+ declared in the class definition:
+
+ \snippet doc/src/snippets/stringlistmodel/model.h 4
+
+ Since rows in this model correspond to strings in a list, the
+ \c insertRows() function inserts a number of empty strings into the string
+ list before the specified position. The number of strings inserted is
+ equivalent to the number of rows specified.
+
+ The parent index is normally used to determine where in the model the
+ rows should be added. In this case, we only have a single top-level list
+ of strings, so we just insert empty strings into that list.
+
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 6
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 7
+
+ The model first calls the
+ \l{QAbstractItemModel::beginInsertRows()}{beginInsertRows()} function to
+ inform other components that the number of rows is about to change. The
+ function specifies the row numbers of the first and last new rows to be
+ inserted, and the model index for their parent item. After changing the
+ string list, it calls
+ \l{QAbstractItemModel::endInsertRows()}{endInsertRows()} to complete the
+ operation and inform other components that the dimensions of the model
+ have changed, returning true to indicate success.
+
+ The function to remove rows from the model is also simple to write.
+ The rows to be removed from the model are specified by the position and
+ the number of rows given.
+ We ignore the parent index to simplify our implementation, and just
+ remove the corresponding items from the string list.
+
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 8
+ \snippet doc/src/snippets/stringlistmodel/model.cpp 9
+
+ The \l{QAbstractItemModel::beginRemoveRows()}{beginRemoveRows()} function
+ is always called before any underlying data is removed, and specifies the
+ first and last rows to be removed. This allows other components to access
+ the data before it becomes unavailable.
+ After the rows have been removed, the model emits
+ \l{QAbstractItemModel::endRemoveRows()}{endRemoveRows()} to finish the
+ operation and let other components know that the dimensions of the model
+ have changed.
+
+ \section1 Next Steps
+
+ We can display the data provided by this model, or any other model, using
+ the \l QListView class to present the model's items in the form of a vertical
+ list.
+ For the string list model, this view also provides a default editor so that
+ the items can be manipulated. We examine the possibilities made available by
+ the standard view classes in the chapter on \l{View Classes}.
+
+ The \l{Model Subclassing Reference} document discusses the requirements of
+ QAbstractItemModel subclasses in more detail, and provides a guide to the
+ virtual functions that must be implemented to enable various features in
+ different types of models.
+*/
+
+/*!
+ \page model-view-convenience.html
+ \contentspage model-view-programming.html Contents
+ \previouspage Delegate Classes
+ \nextpage Using Drag and Drop with Item Views
+
+ \title Item View Convenience Classes
+
+ \tableofcontents
+
+ \section1 Overview
+
+ Alongside the model/view classes, Qt 4 also includes standard widgets to
+ provide classic item-based container widgets. These behave in a similar
+ way to the item view classes in Qt 3, but have been rewritten to use the
+ underlying model/view framework for performance and maintainability. The
+ old item view classes are still available in the compatibility library
+ (see the \l{porting4.html}{Porting Guide} for more information).
+
+ The item-based widgets have been given names which reflect their uses:
+ \c QListWidget provides a list of items, \c QTreeWidget displays a
+ multi-level tree structure, and \c QTableWidget provides a table of cell
+ items. Each class inherits the behavior of the \c QAbstractItemView
+ class which implements common behavior for item selection and header
+ management.
+
+ \section1 List Widgets
+
+ Single level lists of items are typically displayed using a \c QListWidget
+ and a number of \c{QListWidgetItem}s. A list widget is constructed in the
+ same way as any other widget:
+
+ \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 0
+
+ List items can be added directly to the list widget when they are
+ constructed:
+
+ \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 3
+
+ They can also be constructed without a parent list widget and added to
+ a list at some later time:
+
+ \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 6
+ \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 7
+
+ Each item in a list can display a text label and an icon. The colors
+ and font used to render the text can be changed to provide a customized
+ appearance for items. Tooltips, status tips, and "What's
+ This?" help are all easily configured to ensure that the list is properly
+ integrated into the application.
+
+ \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 8
+
+ By default, items in a list are presented in the order of their creation.
+ Lists of items can be sorted according to the criteria given in
+ \l{Qt::SortOrder} to produce a list of items that is sorted in forward or
+ reverse alphabetical order:
+
+ \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 4
+ \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 5
+
+
+ \section1 Tree Widgets
+
+ Trees or hierarchical lists of items are provided by the \c QTreeWidget
+ and \c QTreeWidgetItem classes. Each item in the tree widget can have
+ child items of its own, and can display a number of columns of
+ information. Tree widgets are created just like any other widget:
+
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 0
+
+ Before items can be added to the tree widget, the number of columns must
+ be set. For example, we could define two columns, and create a header
+ to provide labels at the top of each column:
+
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 1
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 2
+
+ The easiest way to set up the labels for each section is to supply a string
+ list. For more sophisticated headers, you can construct a tree item,
+ decorate it as you wish, and use that as the tree widget's header.
+
+ Top-level items in the tree widget are constructed with the tree widget as
+ their parent widget. They can be inserted in an arbitrary order, or you
+ can ensure that they are listed in a particular order by specifying the
+ previous item when constructing each item:
+
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 3
+ \codeline
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 4
+
+ Tree widgets deal with top-level items slightly differently to other
+ items from deeper within the tree. Items can be removed from the top
+ level of the tree by calling the tree widget's
+ \l{QTreeWidget::takeTopLevelItem()}{takeTopLevelItem()} function, but
+ items from lower levels are removed by calling their parent item's
+ \l{QTreeWidgetItem::takeChild()}{takeChild()} function.
+ Items are inserted in the top level of the tree with the
+ \l{QTreeWidget::insertTopLevelItem()}{insertTopLevelItem()} function.
+ At lower levels in the tree, the parent item's
+ \l{QTreeWidgetItem::insertChild()}{insertChild()} function is used.
+
+ It is easy to move items around between the top level and lower levels
+ in the tree. We just need to check whether the items are top-level items
+ or not, and this information is supplied by each item's \c parent()
+ function. For example, we can remove the current item in the tree widget
+ regardless of its location:
+
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 10
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 11
+
+ Inserting the item somewhere else in the tree widget follows the same
+ pattern:
+
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 8
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 9
+
+
+ \section1 Table Widgets
+
+ Tables of items similar to those found in spreadsheet applications
+ are constructed with the \c QTableWidget and \c QTableWidgetItem. These
+ provide a scrolling table widget with headers and items to use within it.
+
+ Tables can be created with a set number of rows and columns, or these
+ can be added to an unsized table as they are needed.
+
+ \snippet doc/src/snippets/qtablewidget-using/mainwindow.h 0
+ \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 0
+
+ Items are constructed outside the table before being added to the table
+ at the required location:
+
+ \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 3
+
+ Horizontal and vertical headers can be added to the table by constructing
+ items outside the table and using them as headers:
+
+ \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 1
+
+ Note that the rows and columns in the table begin at zero.
+
+ \section1 Common Features
+
+ There are a number of item-based features common to each of the
+ convenience classes that are available through the same interfaces
+ in each class. We present these in the following sections with some
+ examples for different widgets.
+ Look at the list of \l{Model/View Classes} for each of the widgets
+ for more details about the use of each function used.
+
+ \section2 Hidden Items
+
+ It is sometimes useful to be able to hide items in an item view widget
+ rather than remove them. Items for all of the above widgets can be
+ hidden and later shown again. You can determine whether an item is hidden
+ by calling the isItemHidden() function, and items can be hidden with
+ \c setItemHidden().
+
+ Since this operation is item-based, the same function is available for
+ all three convenience classes.
+
+ \section2 Selections
+
+ The way items are selected is controlled by the widget's selection mode
+ (\l{QAbstractItemView::SelectionMode}).
+ This property controls whether the user can select one or many items and,
+ in many-item selections, whether the selection must be a continuous range
+ of items. The selection mode works in the same way for all of the
+ above widgets.
+
+ \table
+ \row
+ \i \img selection-single.png
+ \i \bold{Single item selections:}
+ Where the user needs to choose a single item from a widget, the
+ default \c SingleSelection mode is most suitable. In this mode, the
+ current item and the selected item are the same.
+
+ \row
+ \i \img selection-multi.png
+ \i \bold{Multi-item selections:}
+ In this mode, the user can toggle the selection state of any item in the
+ widget without changing the existing selection, much like the way
+ non-exclusive checkboxes can be toggled independently.
+
+ \row
+ \i \img selection-extended.png
+ \i \bold{Extended selections:}
+ Widgets that often require many adjacent items to be selected, such
+ as those found in spreadsheets, require the \c ExtendedSelection mode.
+ In this mode, continuous ranges of items in the widget can be selected
+ with both the mouse and the keyboard.
+ Complex selections, involving many items that are not adjacent to other
+ selected items in the widget, can also be created if modifier keys are
+ used.
+
+ If the user selects an item without using a modifier key, the existing
+ selection is cleared.
+ \endtable
+
+ The selected items in a widget are read using the \c selectedItems()
+ function, providing a list of relevant items that can be iterated over.
+ For example, we can find the sum of all the numeric values within a
+ list of selected items with the following code:
+
+ \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 4
+
+ Note that for the single selection mode, the current item will be in
+ the selection. In the multi-selection and extended selection modes, the
+ current item may not lie within the selection, depending on the way the
+ user formed the selection.
+
+ \section2 Searching
+
+ It is often useful to be able to find items within an item view widget,
+ either as a developer or as a service to present to users. All three
+ item view convenience classes provide a common \c findItems() function
+ to make this as consistent and simple as possible.
+
+ Items are searched for by the text that they contain according to
+ criteria specified by a selection of values from Qt::MatchFlags.
+ We can obtain a list of matching items with the \c findItems()
+ function:
+
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 6
+ \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 7
+
+ The above code causes items in a tree widget to be selected if they
+ contain the text given in the search string. This pattern can also be
+ used in the list and table widgets.
+*/
+
+/*!
+ \page model-view-dnd.html
+ \contentspage model-view-programming.html Contents
+ \previouspage Item View Convenience Classes
+ \nextpage Proxy Models
+
+ \title Using Drag and Drop with Item Views
+
+ \tableofcontents
+
+ \section1 Overview
+
+ Qt's drag and drop infrastructure is fully supported by the model/view framework.
+ Items in lists, tables, and trees can be dragged within the views, and data can be
+ imported and exported as MIME-encoded data.
+
+ The standard views automatically support internal drag and drop, where items are
+ moved around to change the order in which they are displayed. By default, drag and
+ drop is not enabled for these views because they are configured for the simplest,
+ most common uses. To allow items to be dragged around, certain properties of the
+ view need to be enabled, and the items themselves must also allow dragging to occur.
+
+ The requirements for a model that only allows items to be exported from a
+ view, and which does not allow data to be dropped into it, are fewer than
+ those for a fully-enabled drag and drop model.
+
+ See also the \l{Model Subclassing Reference} for more information about
+ enabling drag and drop support in new models.
+
+ \section1 Using Convenience Views
+
+ Each of the types of item used with QListWidget, QTableWidget, and QTreeWidget
+ is configured to use a different set of flags by default. For example, each
+ QListWidgetItem or QTreeWidgetItem is initially enabled, checkable, selectable,
+ and can be used as the source of a drag and drop operation; each QTableWidgetItem
+ can also be edited and used as the target of a drag and drop operation.
+
+ Although all of the standard items have one or both flags set for drag and drop,
+ you generally need to set various properties in the view itself to take advantage
+ of the built-in support for drag and drop:
+
+ \list
+ \o To enable item dragging, set the view's
+ \l{QAbstractItemView::dragEnabled}{dragEnabled} property to \c true.
+ \o To allow the user to drop either internal or external items within the view,
+ set the view's \l{QAbstractScrollArea::}{viewport()}'s
+ \l{QWidget::acceptDrops}{acceptDrops} property to \c true.
+ \o To show the user where the item currently being dragged will be placed if
+ dropped, set the view's \l{QAbstractItemView::showDropIndicator}{showDropIndicator}
+ property. This provides the user with continuously updating information about
+ item placement within the view.
+ \endlist
+
+ For example, we can enable drag and drop in a list widget with the following lines
+ of code:
+
+ \snippet doc/src/snippets/qlistwidget-dnd/mainwindow.cpp 0
+
+ The result is a list widget which allows the items to be copied
+ around within the view, and even lets the user drag items between
+ views containing the same type of data. In both situations, the
+ items are copied rather than moved.
+
+ To enable the user to move the items around within the view, we
+ must set the list widget's \l {QAbstractItemView::}{dragDropMode}:
+
+ \snippet doc/src/snippets/qlistwidget-dnd/mainwindow.cpp 1
+
+ \section1 Using Model/View Classes
+
+ Setting up a view for drag and drop follows the same pattern used with the
+ convenience views. For example, a QListView can be set up in the same way as a
+ QListWidget:
+
+ \snippet doc/src/snippets/qlistview-dnd/mainwindow.cpp 0
+
+ Since access to the data displayed by the view is controlled by a model, the
+ model used also has to provide support for drag and drop operations. The
+ actions supported by a model can be specified by reimplementing the
+ QAbstractItemModel::supportedDropActions() function. For example, copy and
+ move operations are enabled with the following code:
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 10
+
+ Although any combination of values from Qt::DropActions can be given, the
+ model needs to be written to support them. For example, to allow Qt::MoveAction
+ to be used properly with a list model, the model must provide an implementation
+ of QAbstractItemModel::removeRows(), either directly or by inheriting the
+ implementation from its base class.
+
+ \section2 Enabling Drag and Drop for Items
+
+ Models indicate to views which items can be dragged, and which will accept drops,
+ by reimplementing the QAbstractItemModel::flags() function to provide suitable
+ flags.
+
+ For example, a model which provides a simple list based on QAbstractListModel
+ can enable drag and drop for each of the items by ensuring that the flags
+ returned contain the \l Qt::ItemIsDragEnabled and \l Qt::ItemIsDropEnabled
+ values:
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 7
+
+ Note that items can be dropped into the top level of the model, but dragging is
+ only enabled for valid items.
+
+ In the above code, since the model is derived from QStringListModel, we
+ obtain a default set of flags by calling its implementation of the flags()
+ function.
+
+ \section2 Encoding Exported Data
+
+ When items of data are exported from a model in a drag and drop operation, they
+ are encoded into an appropriate format corresponding to one or more MIME types.
+ Models declare the MIME types that they can use to supply items by reimplementing
+ the QAbstractItemModel::mimeTypes() function, returning a list of standard MIME
+ types.
+
+ For example, a model that only provides plain text would provide the following
+ implementation:
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 9
+
+ The model must also provide code to encode data in the advertised format. This
+ is achieved by reimplementing the QAbstractItemModel::mimeData() function to
+ provide a QMimeData object, just as in any other drag and drop operation.
+
+ The following code shows how each item of data, corresponding to a given list of
+ indexes, is encoded as plain text and stored in a QMimeData object.
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 8
+
+ Since a list of model indexes is supplied to the function, this approach is general
+ enough to be used in both hierarchical and non-heirarchical models.
+
+ Note that custom datatypes must be declared as \l{QMetaObject}{meta objects}
+ and that stream operators must be implemented for them. See the QMetaObject
+ class description for details.
+
+ \section2 Inserting Dropped Data into a Model
+
+ The way that any given model handles dropped data depends on both its type
+ (list, table, or tree) and the way its contents is likely to be presented to
+ the user. Generally, the approach taken to accommodate dropped data should
+ be the one that most suits the model's underlying data store.
+
+ Different types of model tend to handle dropped data in different ways. List
+ and table models only provide a flat structure in which items of data are
+ stored. As a result, they may insert new rows (and columns) when data is
+ dropped on an existing item in a view, or they may overwrite the item's
+ contents in the model using some of the data supplied. Tree models are
+ often able to add child items containing new data to their underlying data
+ stores, and will therefore behave more predictably as far as the user
+ is concerned.
+
+ Dropped data is handled by a model's reimplementation of
+ QAbstractItemModel::dropMimeData(). For example, a model that handles a
+ simple list of strings can provide an implementation that handles data
+ dropped onto existing items separately to data dropped into the top level
+ of the model (i.e., onto an invalid item).
+
+ The model first has to make sure that the operation should be acted on,
+ the data supplied is in a format that can be used, and that its destination
+ within the model is valid:
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 0
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 1
+
+ A simple one column string list model can indicate failure if the data
+ supplied is not plain text, or if the column number given for the drop
+ is invalid.
+
+ The data to be inserted into the model is treated differently depending on
+ whether it is dropped onto an existing item or not. In this simple example,
+ we want to allow drops between existing items, before the first item in the
+ list, and after the last item.
+
+ When a drop occurs, the model index corresponding to the parent item will
+ either be valid, indicating that the drop occurred on an item, or it will
+ be invalid, indicating that the drop occurred somewhere in the view that
+ corresponds to top level of the model.
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 2
+
+ We initially examine the row number supplied to see if we can use it
+ to insert items into the model, regardless of whether the parent index is
+ valid or not.
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 3
+
+ If the parent model index is valid, the drop occurred on an item. In this
+ simple list model, we find out the row number of the item and use that
+ value to insert dropped items into the top level of the model.
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 4
+
+ When a drop occurs elsewhere in the view, and the row number is unusable,
+ we append items to the top level of the model.
+
+ In hierarchical models, when a drop occurs on an item, it would be better to
+ insert new items into the model as children of that item. In the simple
+ example shown here, the model only has one level, so this approach is not
+ appropriate.
+
+ \section2 Decoding Imported Data
+
+ Each implementation of \l{QAbstractItemModel::dropMimeData()}{dropMimeData()} must
+ also decode the data and insert it into the model's underlying data structure.
+
+ For a simple string list model, the encoded items can be decoded and streamed
+ into a QStringList:
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 5
+
+ The strings can then be inserted into the underlying data store. For consistency,
+ this can be done through the model's own interface:
+
+ \snippet doc/src/snippets/qlistview-dnd/model.cpp 6
+
+ Note that the model will typically need to provide implementations of the
+ QAbstractItemModel::insertRows() and QAbstractItemModel::setData() functions.
+
+ \sa {Item Views Puzzle Example}
+*/
+
+/*!
+ \page model-view-proxy-models.html
+ \contentspage model-view-programming.html Contents
+ \previouspage Using Drag and Drop with Item Views
+ \nextpage Model Subclassing Reference
+
+ \title Proxy Models
+
+ \tableofcontents
+
+ \section1 Overview
+
+ In the model/view framework, items of data supplied by a single model can be shared
+ by any number of views, and each of these can possibly represent the same information
+ in completely different ways.
+ Custom views and delegates are effective ways to provide radically different
+ representations of the same data. However, applications often need to provide
+ conventional views onto processed versions of the same data, such as differently-sorted
+ views onto a list of items.
+
+ Although it seems appropriate to perform sorting and filtering operations as internal
+ functions of views, this approach does not allow multiple views to share the results
+ of such potentially costly operations. The alternative approach, involving sorting
+ within the model itself, leads to the similar problem where each view has to display
+ items of data that are organized according to the most recent processing operation.
+
+ To solve this problem, the model/view framework uses proxy models to manage the
+ information supplied between individual models and views. Proxy models are components
+ that behave like ordinary models from the perspective of a view, and access data from
+ source models on behalf of that view. The signals and slots used by the model/view
+ framework ensure that each view is updated appropriately no matter how many proxy models
+ are placed between itself and the source model.
+
+ \section1 Using Proxy Models
+
+ Proxy models can be inserted between an existing model and any number of views.
+ Qt is supplied with a standard proxy model, QSortFilterProxyModel, that is usually
+ instantiated and used directly, but can also be subclassed to provide custom filtering
+ and sorting behavior. The QSortFilterProxyModel class can be used in the following way:
+
+ \snippet doc/src/snippets/qsortfilterproxymodel/main.cpp 0
+ \codeline
+ \snippet doc/src/snippets/qsortfilterproxymodel/main.cpp 1
+
+ Since proxy models are inherit from QAbstractItemModel, they can be connected to
+ any kind of view, and can be shared between views. They can also be used to
+ process the information obtained from other proxy models in a pipeline arrangement.
+
+ The QSortFilterProxyModel class is designed to be instantiated and used directly
+ in applications. More specialized proxy models can be created by subclassing this
+ classes and implementing the required comparison operations.
+
+ \section1 Customizing Proxy Models
+
+ Generally, the type of processing used in a proxy model involves mapping each item of
+ data from its original location in the source model to either a different location in
+ the proxy model. In some models, some items may have no corresponding location in the
+ proxy model; these models are \e filtering proxy models. Views access items using
+ model indexes provided by the proxy model, and these contain no information about the
+ source model or the locations of the original items in that model.
+
+ QSortFilterProxyModel enables data from a source model to be filtered before
+ being supplied to views, and also allows the contents of a source model to
+ be supplied to views as pre-sorted data.
+
+ \section2 Custom Filtering Models
+
+ The QSortFilterProxyModel class provides a filtering model that is fairly versatile,
+ and which can be used in a variety of common situations. For advanced users,
+ QSortFilterProxyModel can be subclassed, providing a mechanism that enables custom
+ filters to be implemented.
+
+ Subclasses of QSortFilterProxyModel can reimplement two virtual functions that are
+ called whenever a model index from the proxy model is requested or used:
+
+ \list
+ \o \l{QSortFilterProxyModel::filterAcceptsColumn()}{filterAcceptsColumn()} is used to
+ filter specific columns from part of the source model.
+ \o \l{QSortFilterProxyModel::filterAcceptsRow()}{filterAcceptsRow()} is used to filter
+ specific rows from part of the source model.
+ \endlist
+
+ The default implementations of the above functions in QSortFilterProxyModel
+ return true to ensure that all items are passed through to views; reimplementations
+ of these functions should return false to filter out individual rows and columns.
+
+ \section2 Custom Sorting Models
+
+ QSortFilterProxyModel instances use Qt's built-in qStableSort() function to set up
+ mappings between items in the source model and those in the proxy model, allowing a
+ sorted hierarchy of items to be exposed to views without modifying the structure of the
+ source model. To provide custom sorting behavior, reimplement the
+ \l{QSortFilterProxyModel::lessThan()}{lessThan()} function to perform custom
+ comparisons.
+*/
+
+/*!
+ \page model-view-model-subclassing.html
+ \contentspage model-view-programming.html Contents
+ \previouspage Proxy Models
+
+ \title Model Subclassing Reference
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ Model subclasses need to provide implementations of many of the virtual functions
+ defined in the QAbstractItemModel base class. The number of these functions that need
+ to be implemented depends on the type of model - whether it supplies views with
+ a simple list, a table, or a complex hierarchy of items. Models that inherit from
+ QAbstractListModel and QAbstractTableModel can take advantage of the default
+ implementations of functions provided by those classes. Models that expose items
+ of data in tree-like structures must provide implementations for many of the
+ virtual functions in QAbstractItemModel.
+
+ The functions that need to be implemented in a model subclass can be divided into three
+ groups:
+
+ \list
+ \o \bold{Item data handling:} All models need to implement functions to enable views and
+ delegates to query the dimensions of the model, examine items, and retrieve data.
+ \o \bold{Navigation and index creation:} Hierarchical models need to provide functions
+ that views can call to navigate the tree-like structures they expose, and obtain
+ model indexes for items.
+ \o \bold{Drag and drop support and MIME type handling:} Models inherit functions that
+ control the way that internal and external drag and drop operations are performed.
+ These functions allow items of data to be described in terms of MIME types that
+ other components and applications can understand.
+ \endlist
+
+ For more information, see the \l
+ {"Item View Classes" Chapter of C++ GUI Programming with Qt 4}.
+
+ \section1 Item Data Handling
+
+ Models can provide varying levels of access to the data they provide: They can be
+ simple read-only components, some models may support resizing operations, and
+ others may allow items to be edited.
+
+ \section2 Read-Only Access
+
+ To provide read-only access to data provided by a model, the following functions
+ \e{must} be implemented in the model's subclass:
+
+ \table 90%
+ \row \o \l{QAbstractItemModel::flags()}{flags()}
+ \o Used by other components to obtain information about each item provided by
+ the model. In many models, the combination of flags should include
+ Qt::ItemIsEnabled and Qt::ItemIsSelectable.
+ \row \o \l{QAbstractItemModel::data()}{data()}
+ \o Used to supply item data to views and delegates. Generally, models only
+ need to supply data for Qt::DisplayRole and any application-specific user
+ roles, but it is also good practice to provide data for Qt::ToolTipRole,
+ Qt::AccessibleTextRole, and Qt::AccessibleDescriptionRole.
+ See the Qt::ItemDataRole enum documentation for information about the types
+ associated with each role.
+ \row \o \l{QAbstractItemModel::headerData()}{headerData()}
+ \o Provides views with information to show in their headers. The information is
+ only retrieved by views that can display header information.
+ \row \o \l{QAbstractItemModel::rowCount()}{rowCount()}
+ \o Provides the number of rows of data exposed by the model.
+ \endtable
+
+ These four functions must be implemented in all types of model, including list models
+ (QAbstractListModel subclasses) and table models (QAbstractTableModel subclasses).
+
+ Additionally, the following functions \e{must} be implemented in direct subclasses
+ of QAbstractTableModel and QAbstractItemModel:
+
+ \table 90%
+ \row \o \l{QAbstractItemModel::columnCount()}{columnCount()}
+ \o Provides the number of columns of data exposed by the model. List models do not
+ provide this function because it is already implemented in QAbstractListModel.
+ \endtable
+
+ \section2 Editable Items
+
+ Editable models allow items of data to be modified, and may also provide
+ functions to allow rows and columns to be inserted and removed. To enable
+ editing, the following functions must be implemented correctly:
+
+ \table 90%
+ \row \o \l{QAbstractItemModel::flags()}{flags()}
+ \o Must return an appropriate combination of flags for each item. In particular,
+ the value returned by this function must include \l{Qt::ItemIsEditable} in
+ addition to the values applied to items in a read-only model.
+ \row \o \l{QAbstractItemModel::setData()}{setData()}
+ \o Used to modify the item of data associated with a specified model index.
+ To be able to accept user input, provided by user interface elements, this
+ function must handle data associated with Qt::EditRole.
+ The implementation may also accept data associated with many different kinds
+ of roles specified by Qt::ItemDataRole. After changing the item of data,
+ models must emit the \l{QAbstractItemModel::dataChanged()}{dataChanged()}
+ signal to inform other components of the change.
+ \row \o \l{QAbstractItemModel::setHeaderData()}{setHeaderData()}
+ \o Used to modify horizontal and vertical header information. After changing
+ the item of data, models must emit the
+ \l{QAbstractItemModel::headerDataChanged()}{headerDataChanged()}
+ signal to inform other components of the change.
+ \endtable
+
+ \section2 Resizable Models
+
+ All types of model can support the insertion and removal of rows. Table models
+ and hierarchical models can also support the insertion and removal of columns.
+ It is important to notify other components about changes to the model's dimensions
+ both \e before and \e after they occur. As a result, the following functions
+ can be implemented to allow the model to be resized, but implementations must
+ ensure that the appropriate functions are called to notify attached views and
+ delegates:
+
+ \table 90%
+ \row \o \l{QAbstractItemModel::insertRows()}{insertRows()}
+ \o Used to add new rows and items of data to all types of model.
+ Implementations must call
+ \l{QAbstractItemModel::beginInsertRows()}{beginInsertRows()} \e before
+ inserting new rows into any underlying data structures, and call
+ \l{QAbstractItemModel::endInsertRows()}{endInsertRows()}
+ \e{immediately afterwards}.
+ \row \o \l{QAbstractItemModel::removeRows()}{removeRows()}
+ \o Used to remove rows and the items of data they contain from all types of model.
+ Implementations must call
+ \l{QAbstractItemModel::beginRemoveRows()}{beginRemoveRows()}
+ \e before inserting new columns into any underlying data structures, and call
+ \l{QAbstractItemModel::endRemoveRows()}{endRemoveRows()}
+ \e{immediately afterwards}.
+ \row \o \l{QAbstractItemModel::insertColumns()}{insertColumns()}
+ \o Used to add new columns and items of data to table models and hierarchical models.
+ Implementations must call
+ \l{QAbstractItemModel::beginInsertColumns()}{beginInsertColumns()} \e before
+ rows are removed from any underlying data structures, and call
+ \l{QAbstractItemModel::endInsertColumns()}{endInsertColumns()}
+ \e{immediately afterwards}.
+ \row \o \l{QAbstractItemModel::removeColumns()}{removeColumns()}
+ \o Used to remove columns and the items of data they contain from table models and
+ hierarchical models.
+ Implementations must call
+ \l{QAbstractItemModel::beginRemoveColumns()}{beginRemoveColumns()}
+ \e before columns are removed from any underlying data structures, and call
+ \l{QAbstractItemModel::endRemoveColumns()}{endRemoveColumns()}
+ \e{immediately afterwards}.
+ \endtable
+
+ Generally, these functions should return true if the operation was successful.
+ However, there may be cases where the operation only partly succeeded; for example,
+ if less than the specified number of rows could be inserted. In such cases, the
+ model should return false to indicate failure to enable any attached components to
+ handle the situation.
+
+ The signals emitted by the functions called in implementations of the resizing
+ API give attached components the chance to take action before any data becomes
+ unavailable. The encapsulation of insert and remove operations with begin and end
+ functions also enable the model to manage
+ \l{QPersistentModelIndex}{persistent model indexes} correctly.
+
+ Normally, the begin and end functions are capable of informing other components
+ about changes to the model's underlying structure. For more complex changes to the
+ model's structure, perhaps involving internal reorganization or sorting of data,
+ it is necessary to emit the \l{QAbstractItemModel::layoutChanged()}{layoutChanged()}
+ signal to cause any attached views to be updated.
+
+ \section2 Lazy Population of Model Data
+
+ Lazy population of model data effectively allows requests for information
+ about the model to be deferred until it is actually needed by views.
+
+ Some models need to obtain data from remote sources, or must perform
+ time-consuming operations to obtain information about the way the
+ data is organized. Since views generally request as much information
+ as possible in order to accurately display model data, it can be useful
+ to restrict the amount of information returned to them to reduce
+ unnecessary follow-up requests for data.
+
+ In hierarchical models where finding the number of children of a given
+ item is an expensive operation, it is useful to ensure that the model's
+ \l{QAbstractItemModel::}{rowCount()} implementation is only called when
+ necessary. In such cases, the \l{QAbstractItemModel::}{hasChildren()}
+ function can be reimplemented to provide an inexpensive way for views to
+ check for the presence of children and, in the case of QTreeView, draw
+ the appropriate decoration for their parent item.
+
+ Whether the reimplementation of \l{QAbstractItemModel::}{hasChildren()}
+ returns \c true or \c false, it may not be necessary for the view to call
+ \l{QAbstractItemModel::}{rowCount()} to find out how many children are
+ present. For example, QTreeView does not need to know how many children
+ there are if the parent item has not been expanded to show them.
+
+ If it is known that many items will have children, reimplementing
+ \l{QAbstractItemModel::}{hasChildren()} to unconditionally return \c true
+ is sometimes a useful approach to take. This ensures that each item can
+ be later examined for children while making initial population of model
+ data as fast as possible. The only disadvantage is that items without
+ children may be displayed incorrectly in some views until the user
+ attempts to view the non-existent child items.
+
+
+ \section1 Navigation and Model Index Creation
+
+ Hierarchical models need to provide functions that views can call to navigate the
+ tree-like structures they expose, and obtain model indexes for items.
+
+ \section2 Parents and Children
+
+ Since the structure exposed to views is determined by the underlying data
+ structure, it is up to each model subclass to create its own model indexes
+ by providing implementations of the following functions:
+
+ \table 90%
+ \row \o \l{QAbstractItemModel::index()}{index()}
+ \o Given a model index for a parent item, this function allows views and delegates
+ to access children of that item. If no valid child item - corresponding to the
+ specified row, column, and parent model index, can be found, the function
+ must return QModelIndex(), which is an invalid model index.
+ \row \o \l{QAbstractItemModel::parent()}{parent()}
+ \o Provides a model index corresponding to the parent of any given child item.
+ If the model index specified corresponds to a top-level item in the model, or if
+ there is no valid parent item in the model, the function must return
+ an invalid model index, created with the empty QModelIndex() constructor.
+ \endtable
+
+ Both functions above use the \l{QAbstractItemModel::createIndex()}{createIndex()}
+ factory function to generate indexes for other components to use. It is normal for
+ models to supply some unique identifier to this function to ensure that
+ the model index can be re-associated with its corresponding item later on.
+
+ \section1 Drag and Drop Support and MIME Type Handling
+
+ The model/view classes support drag and drop operations, providing default behavior
+ that is sufficient for many applications. However, it is also possible to customize
+ the way items are encoded during drag and drop operations, whether they are copied
+ or moved by default, and how they are inserted into existing models.
+
+ Additionally, the convenience view classes implement specialized behavior that
+ should closely follow that expected by existing developers.
+ The \l{#Convenience Views}{Convenience Views} section provides an overview of this
+ behavior.
+
+ \section2 MIME Data
+
+ By default, the built-in models and views use an internal MIME type
+ (\c{application/x-qabstractitemmodeldatalist}) to pass around information about
+ model indexes. This specifies data for a list of items, containing the row and
+ column numbers of each item, and information about the roles that each item
+ supports.
+
+ Data encoded using this MIME type can be obtained by calling
+ QAbstractItemModel::mimeData() with a QModelIndexList containing the items to
+ be serialized.
+ \omit
+ The following types are used to store information about
+ each item as it is streamed into a QByteArray and stored in a QMimeData object:
+
+ \table 90%
+ \header \o Description \o Type
+ \row \o Row \o int
+ \row \o Column \o int
+ \row \o Data for each role \o QMap<int, QVariant>
+ \endtable
+
+ This information can be retrieved for use in non-model classes by calling
+ QMimeData::data() with the \c{application/x-qabstractitemmodeldatalist} MIME
+ type and streaming out the items one by one.
+ \endomit
+
+ When implementing drag and drop support in a custom model, it is possible to
+ export items of data in specialized formats by reimplementing the following
+ function:
+
+ \table 90%
+ \row \o \l{QAbstractItemModel::mimeData()}{mimeData()}
+ \o This function can be reimplemented to return data in formats other
+ than the default \c{application/x-qabstractitemmodeldatalist} internal
+ MIME type.
+
+ Subclasses can obtain the default QMimeData object from the base class
+ and add data to it in additional formats.
+ \endtable
+
+ For many models, it is useful to provide the contents of items in common format
+ represented by MIME types such as \c{text/plain} and \c{image/png}. Note that
+ images, colors and HTML documents can easily be added to a QMimeData object with
+ the QMimeData::setImageData(), QMimeData::setColorData(), and
+ QMimeData::setHtml() functions.
+
+ \section2 Accepting Dropped Data
+
+ When a drag and drop operation is performed over a view, the underlying model is
+ queried to determine which types of operation it supports and the MIME types
+ it can accept. This information is provided by the
+ QAbstractItemModel::supportedDropActions() and QAbstractItemModel::mimeTypes()
+ functions. Models that do not override the implementations provided by
+ QAbstractItemModel support copy operations and the default internal MIME type
+ for items.
+
+ When serialized item data is dropped onto a view, the data is inserted into
+ the current model using its implementation of QAbstractItemModel::dropMimeData().
+ The default implementation of this function will never overwrite any data in the
+ model; instead, it tries to insert the items of data either as siblings of an
+ item, or as children of that item.
+
+ To take advantage of QAbstractItemModel's default implementation for the built-in
+ MIME type, new models must provide reimplementations of the following functions:
+
+ \table 90%
+ \row \o \l{QAbstractItemModel::insertRows()}{insertRows()}
+ \o {1, 2} These functions enable the model to automatically insert new data using
+ the existing implementation provided by QAbstractItemModel::dropMimeData().
+ \row \o \l{QAbstractItemModel::insertColumns()}{insertColumns()}
+ \row \o \l{QAbstractItemModel::setData()}{setData()}
+ \o Allows the new rows and columns to be populated with items.
+ \row \o \l{QAbstractItemModel::setItemData()}{setItemData()}
+ \o This function provides more efficient support for populating new items.
+ \endtable
+
+ To accept other forms of data, these functions must be reimplemented:
+
+ \table 90%
+ \row \o \l{QAbstractItemModel::supportedDropActions()}{supportedDropActions()}
+ \o Used to return a combination of \l{Qt::DropActions}{drop actions},
+ indicating the types of drag and drop operations that the model accepts.
+ \row \o \l{QAbstractItemModel::mimeTypes()}{mimeTypes()}
+ \o Used to return a list of MIME types that can be decoded and handled by
+ the model. Generally, the MIME types that are supported for input into
+ the model are the same as those that it can use when encoding data for
+ use by external components.
+ \row \o \l{QAbstractItemModel::dropMimeData()}{dropMimeData()}
+ \o Performs the actual decoding of the data transferred by drag and drop
+ operations, determines where in the model it will be set, and inserts
+ new rows and columns where necessary. How this function is implemented
+ in subclasses depends on the requirements of the data exposed by each
+ model.
+ \endtable
+
+ If the implementation of the \l{QAbstractItemModel::dropMimeData()}{dropMimeData()}
+ function changes the dimensions of a model by inserting or removing rows or
+ columns, or if items of data are modified, care must be taken to ensure that
+ all relevant signals are emitted. It can be useful to simply call
+ reimplementations of other functions in the subclass, such as
+ \l{QAbstractItemModel::setData()}{setData()},
+ \l{QAbstractItemModel::insertRows()}{insertRows()}, and
+ \l{QAbstractItemModel::insertColumns()}{insertColumns()}, to ensure that the
+ model behaves consistently.
+
+ In order to ensure drag operations work properly, it is important to
+ reimplement the following functions that remove data from the model:
+
+ \list
+ \o \l{QAbstractItemModel::}{removeRows()}
+ \o \l{QAbstractItemModel::}{removeRow()}
+ \o \l{QAbstractItemModel::}{removeColumns()}
+ \o \l{QAbstractItemModel::}{removeColumn()}
+ \endlist
+
+ For more information about drag and drop with item views, refer to
+ \l{Using Drag and Drop with Item Views}.
+
+ \section2 Convenience Views
+
+ The convenience views (QListWidget, QTableWidget, and QTreeWidget) override
+ the default drag and drop functionality to provide less flexible, but more
+ natural behavior that is appropriate for many applications. For example,
+ since it is more common to drop data into cells in a QTableWidget, replacing
+ the existing contents with the data being transferred, the underlying model
+ will set the data of the target items rather than insert new rows and columns
+ into the model. For more information on drag and drop in convenience views,
+ you can see \l{Using Drag and Drop with Item Views}.
+
+ \section1 Performance Optimization for Large Amounts of Data
+
+ The \l{QAbstractItemModel::}{canFetchMore()} function checks if the parent
+ has more data available and returns true or false accordingly. The
+ \l{QAbstractItemModel::}{fetchMore()} function fetches data based on the
+ parent specified. Both these functions can be combined, for example, in a
+ database query involving incremental data to populate a QAbstractItemModel.
+ We reimplement \l{QAbstractItemModel::}{canFetchMore()} to indicate if there
+ is more data to be fetched and \l{QAbstractItemModel::}{fetchMore()} to
+ populate the model as required.
+
+ Another example would be dynamically populated tree models, where we
+ reimplement \l{QAbstractItemModel::}{fetchMore()} when a branch in the tree
+ model is expanded.
+
+ If your reimplementation of \l{QAbstractItemModel::}{fetchMore()} adds rows
+ to the model, you need to call \l{QAbstractItemModel::}{beginInsertRows()}
+ and \l{QAbstractItemModel::}{endInsertRows()}. Also, both
+ \l{QAbstractItemModel::}{canFetchMore()} and \l{QAbstractItemModel::}
+ {fetchMore()} must be reimplemented as their default implementation returns
+ false and does nothing.
+*/
diff --git a/doc/src/frameworks-technologies/phonon.qdoc b/doc/src/frameworks-technologies/phonon.qdoc
new file mode 100644
index 0000000..a385fb3
--- /dev/null
+++ b/doc/src/frameworks-technologies/phonon.qdoc
@@ -0,0 +1,558 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page phonon-overview.html
+ \title Phonon Overview
+ \ingroup frameworks-technologies
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ Qt uses the Phonon multimedia framework to provide functionality
+ for playback of the most common multimedia formats. The media can
+ be read from files or streamed over a network, using a QURL to a
+ file.
+
+ In this overview, we take a look at the main concepts of Phonon.
+ We also explain the architecture, examine the
+ core API classes, and show examples on how to use the classes
+ provided.
+
+ \section1 Architecture
+
+ Phonon has three basic concepts: media objects, sinks, and paths.
+ A media object manages a media source, for instance, a music file;
+ it provides simple playback control, such as starting, stopping,
+ and pausing the playback. A sink outputs the media from Phonon,
+ e.g., by rendering video on a widget, or by sending audio to a
+ sound card. Paths are used to connect Phonon objects, i.e., a
+ media object and a sink, in a graph - called a media graph in
+ Phonon.
+
+ As an example, we show a media graph for an audio stream:
+
+ \image conceptaudio.png
+
+ The playback is started and managed by the media object, which
+ send the media stream to any sinks connected to it by a path. The
+ sink then plays the stream back, usually though a sound card.
+
+ \omit Not sure if this goes here, or anywhere...
+ All nodes in the graph are synchronized by the framework,
+ meaning that if more than one sink is connected to the same
+ media object, the framework will handle the synchronization
+ between the sinks; this happens for instance when a media
+ source containing video with sound is played back. More on
+ this later.
+ \endomit
+
+ \section2 Media Objects
+
+ The media object, an instance of the \l{Phonon::}{MediaObject}
+ class, lets you start, pause, and stop the playback of a media
+ stream, i.e., it provided basic control over the playback. You may
+ think of the object as a simple media player.
+
+ The media data is provided by a media source, which is
+ kept by the media object. The media source is a separate
+ object - an instance of \l{Phonon::}{MediaSource} - in Phonon, and
+ not part of the graph itself. The source will supply the media
+ object with raw data. The data can be read from files and streamed
+ over a network. The contents of the source will be interpreted by
+ the media object.
+
+ A media object is always instantiated with the default constructor
+ and then supplied with a media source. Concrete code examples are
+ given later in this overview.
+
+ As a complement to the media object, Phonon also provides
+ \l{Phonon::}{MediaController}, which provides control over
+ features that are optional for a given media. For instance, for
+ chapters, menus, and titles of a VOB (DVD) file will be features
+ managed by a \l{Phonon::}{MediaController}.
+
+ \section2 Sinks
+
+ A sink is a node that can output media from the graph, i.e., it
+ does not send its output to other nodes. A sink is usually a
+ rendering device.
+
+ The input of sinks in a Phonon media graph comes from a
+ \l{Phonon::}{MediaObject}, though it might have been processed
+ through other nodes on the way.
+
+ While the \l{Phonon::}{MediaObject} controls the playback, the
+ sink has basic controls for manipulation of the media. With an
+ audio sink, for instance, you can control the volume and mute the
+ sound, i.e., it represents a virtual audio device. Another example
+ is the \l{Phonon::}{VideoWidget}, which can render video on a
+ QWidget and alter the brightness, hue, and scaling of the video.
+
+ As an example we give an image of a graph used for playing back a
+ video file with sound.
+
+ \image conceptvideo.png
+
+ \section2 Processors
+
+ Phonon does not allow manipulation of media streams directly,
+ i.e., one cannot alter a media stream's bytes programmatically
+ after they have been given to a media object. We have other nodes
+ to help with this: processors, which are placed in the graph on
+ the path somewhere between the media object and its sinks. In
+ Phonon, processors are of the \l{Phonon::}{Effect} class.
+
+ When inserted into the rendering process, the processor will
+ alter the media stream, and will be active as long as it is part
+ of the graph. To stop, it needs to be removed.
+
+ \omit \image conceptprocessor.png \endomit
+
+ The \c {Effect}s may also have controls that affect how the media
+ stream is manipulated. A processor applying a depth effect to
+ audio, for instance, can have a value controlling the amount of
+ depth. An \c Effect can be configured at any point in time.
+
+ \section1 Playback
+
+ In some common cases, it is not necessary to build a graph
+ yourself.
+
+ Phonon has convenience functions for building common graphs. For
+ playing an audio file, you can use the
+ \l{Phonon::}{createPlayer()} function. This will set up the
+ necessary graph and return the media object node; the sound can
+ then be started by calling its \l{Phonon::MediaObject::}{play()}
+ function.
+
+ \snippet snippets/phonon.cpp 0
+
+ We have a similar solution for playing video files, the
+ \l{Phonon::}{VideoPlayer}.
+
+ \snippet snippets/phonon.cpp 1
+
+ The VideoPlayer is a widget onto which the video will be drawn.
+
+ The \c .pro file for a project needs the following line to be added:
+
+ \snippet doc/src/snippets/code/doc_src_phonon.qdoc 0
+
+ Phonon comes with several widgets that provide functionality
+ commonly associated with multimedia players - notably SeekSlider
+ for controlling the position of the stream, VolumeSlider for
+ controlling sound volume, and EffectWidget for controlling the
+ parameters of an effect. You can learn about them in the API
+ documentation.
+
+ \section1 Building Graphs
+
+ If you need more freedom than the convenience functions described
+ in the previous section offers you, you can build the graphs
+ yourself. We will now take a look at how some common graphs are
+ built. Starting a graph up is a matter of calling the
+ \l{Phonon::MediaObject::}{play()} function of the media object.
+
+ If the media source contains several types of media, for instance, a
+ stream with both video and audio, the graph will contain two
+ output nodes: one for the video and one for the audio.
+
+ We will now look at the code required to build the graphs discussed
+ previously in the \l{Architecture} section.
+
+ \section2 Audio
+
+ When playing back audio, you create the media object and connect
+ it to an audio output node - a node that inherits from
+ AbstractAudioOutput. Currently, AudioOutput, which outputs audio
+ to the sound card, is provided.
+
+ The code to create the graph is straight forward:
+
+ \snippet snippets/phonon.cpp 2
+
+ Notice that the type of media an input source has is resolved by
+ Phonon, so you need not be concerned with this. If a source
+ contains multiple media formats, this is also handled
+ automatically.
+
+ The media object is always created using the default constructor
+ since it handles all multimedia formats.
+
+ The setting of a Category, Phonon::MusicCategory in this case,
+ does not affect the actual playback; the category can be used by
+ KDE to control the playback through, for instance, the control
+ panel.
+
+ \omit Not sure about this
+ Users of KDE can often also choose to send sound with the
+ CommunicationCategory, e.g., given to VoIP, to their headset,
+ while sound with MusicCategory is sent to the sound card.
+ \endomit
+
+ The AudioOutput class outputs the audio media to a sound card,
+ that is, one of the audio devices of the operating system. An
+ audio device can be a sound card or a intermediate technology,
+ such as \c DirectShow on windows. A default device will be chosen
+ if one is not set with \l{Phonon::AudioOutput::}{setOutputDevice()}.
+
+ The AudioOutput node will work with all audio formats supported by
+ the back end, so you don't need to know what format a specific
+ media source has.
+
+ For a an extensive example of audio playback, see the \l{Music
+ Player Example}{Phonon Music Player}.
+
+ \section3 Audio Effects
+
+ Since a media stream cannot be manipulated directly, the backend
+ can produce nodes that can process the media streams. These nodes
+ are inserted into the graph between a media object and an output
+ node.
+
+ Nodes that process media streams inherit from the Effect class.
+ The effects available depends on the underlying system. Most of
+ these effects will be supported by Phonon. See the \l{Querying
+ Backends for Support} section for information on how to resolve
+ the available effects on a particular system.
+
+ We will now continue the example from above using the Path
+ variable \c path to add an effect. The code is again trivial:
+
+ \snippet snippets/phonon.cpp 3
+
+ Here we simply take the first available effect on the system.
+
+ The effect will start immediately after being inserted into the
+ graph if the media object is playing. To stop it, you have to
+ detach it again using \l{Phonon::Path::}{removeEffect()} of the Path.
+
+ \section2 Video
+
+ For playing video, VideoWidget is provided. This class functions
+ both as a node in the graph and as a widget upon which it draws
+ the video stream. The widget will automatically choose an available
+ device for playing the video, which is usually a technology
+ between the Qt application and the graphics card, such as \c
+ DirectShow on Windows.
+
+ The video widget does not play the audio (if any) in the media
+ stream. If you want to play the audio as well, you will need
+ an AudioOutput node. You create and connect it to the graph as
+ shown in the previous section.
+
+ The code for creating this graph is given below, after which
+ one can play the video with \l{Phonon::MediaObject::}{play()}.
+
+ \snippet snippets/phonon.cpp 4
+
+ The VideoWidget does not need to be set to a Category, it is
+ automatically classified to \l{Phonon::}{VideoCategory}, we only
+ need to assure that the audio is also classified in the same
+ category.
+
+ The media object will split files with different media content
+ into separate streams before sending them off to other nodes in
+ the graph. It is the media object that determines the type of
+ content appropriate for nodes that connect to it.
+
+ \omit This section is from the future
+
+ \section2 Multiple Audio Sources and Graph Outputs
+
+ In this section, we take a look at a graph that contains multiple
+ audio sources in addition to video. We have a video camera with
+ some embarrassing home footage from last weekend's party, a
+ microphone with which we intend to add commentary, and an audio
+ music file to set the correct mood. It would be an advantage to
+ write the graph output to a file for later viewing, but since this
+ is not yet supported by Qt backends, we will play it back
+ directly.
+
+ <image of party graph>
+
+ <code>
+
+ <code walkthrough>
+
+ \endomit
+
+ \section1 Backends
+
+ The multimedia functionality is not implemented by Phonon itself,
+ but by a back end - often also referred to as an engine. This
+ includes connecting to, managing, and driving the underlying
+ hardware or intermediate technology. For the programmer, this
+ implies that the media nodes, e.g., media objects, processors, and
+ sinks, are produced by the back end. Also, it is responsible for
+ building the graph, i.e., connecting the nodes.
+
+ The backends of Qt use the media systems DirectShow (which
+ requires DirectX) on Windows, QuickTime on Mac, and GStreamer on
+ Linux. The functionality provided on the different platforms are
+ dependent on these underlying systems and may vary somewhat, e.g.,
+ in the media formats supported.
+
+ Backends expose information about the underlying system. It can
+ tell which media formats are supported, e.g., \c AVI, \c mp3, or
+ \c OGG.
+
+ A user can often add support for new formats and filters to the
+ underlying system, by, for instance, installing the DivX codex. We
+ can therefore not give an exact overview of which formats are
+ available with the Qt backends.
+
+ \omit Not sure I want a separate section for this
+ \section2 Communication with the Backends
+
+ We cooperate with backends through static functions in the
+ Phonon namespace. We have already seen some of these functions
+ in code examples. Their two main responsibilities are creating
+ graph nodes and supplying information about the capabilities
+ of the various nodes. The nodes uses the backend internally
+ when created, so it is only connecting them in the graph that
+ you need to use the backend directly.
+
+ The main functions for graph building are:
+
+ \list
+ \o createPath(): This function creates a path between to
+ nodes, which it takes as arguments.
+ \o
+ \endlist
+
+ For more detailed information, please consult the API
+ documentation.
+
+ \endomit
+
+ \section2 Querying Backends for Support
+
+ As mentioned, Phonon depends on the backend to provide its
+ functionality. Depending on the individual backend, full support
+ of the API may not be in place. Applications therefore need to
+ check with the backend if functionality they require is
+ implemented. In this section, we take look at how this is done.
+
+ The backend provides the
+ \l{Phonon::BackendCapabilities::}{availableMimeTypes()} and
+ \l{Phonon::BackendCapabilities::}{isMimeTypeAvailable()} functions
+ to query which MIME types the backend can produce nodes for. The
+ types are listed as strings, which for any type is equal for any
+ backend or platform.
+
+ The backend will emit a signal -
+ \l{Phonon::BackendCapabilities::}{Notifier::capabilitiesChanged()}
+ - if its abilities have changed. If the available audio devices
+ have changed, the
+ \l{Phonon::BackendCapabilities::}{Notifier::availableAudioOutputDevicesChanged()}
+ signal is emitted instead.
+
+ To query the actual audio devices possible, we have the
+ \l{Phonon::BackendCapabilities::}{availableAudioOutputDevices()} as
+ mentioned in the \l{#Sinks}{Sinks} section. To query information
+ about the individual devices, you can examine its \c name(); this
+ string is dependent on the operating system, and the Qt backends
+ does not analyze the devices further.
+
+ The sink for playback of video does not have a selection of
+ devices. For convenience, the \l{Phonon::}{VideoWidget} is both a
+ node in the graph and a widget on which the video output is
+ rendered. To query the various video formats available, use
+ \l{Phonon::BackendCapabilities::}{isMimeTypeAvailable()}. To add
+ it to a path, you can use the Phonon::createPath() as usual. After
+ creating a media object, it is also possible to call its
+ \l{Phonon::MediaObject::}{hasVideo()} function.
+
+ See also the \l{Capabilities Example}.
+
+ \section1 Installing Phonon
+
+ When running the Qt configure script, you will be notified whether
+ Phonon support is available on your system. As mentioned
+ previously, to use develop and run Phonon applications, you also
+ need to link to a backend, which provides the multimedia
+ functionality.
+
+ Note that Phonon applications will compile and run without a
+ working backend, but will, of course, not work as expected.
+
+ The following sections explains requirements for each backend.
+
+ \section2 Windows
+
+ On Windows, building Phonon requires DirectX and DirectShow
+ version 9 or higher. You'll need additional SDKs you can download
+ from Microsoft.
+
+ \section3 Windows XP and later Windows versions
+
+ If you develop for Windows XP and up, you should download the Windows SDK
+ \l{http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&amp;DisplayLang=en}{here}.
+ Before building Qt, just call the script: \c {C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\setenv.cmd}
+
+ \note Visual C++ 2008 already contains the Windows SDK and doesn't
+ need that package and has already the environment set up for a
+ smooth compilation of phonon.
+
+ \section3 Earlier Windows versions than Windows XP
+
+ If you want to support previous Windows versions, you should download and install the Platform SDK. You find it
+ \l{http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB&amp;displaylang=en}{here}.
+
+ \note The platform SDK provided with Visual C++ is not
+ complete and
+ you'll need this one to have DirectShow 9.0 support. You can download the DirectX SDK
+ \l{http://www.microsoft.com/downloads/details.aspx?familyid=09F7578C-24AA-4E0A-BF91-5FEC24C8C7BF&amp;displaylang=en}{here}.
+
+ \section3 Setting up the environment
+
+ Once the SDKs are installed, please make sure to set your
+ environment variables LIB and INCLUDE correctly. The paths to the
+ include and lib directory of the SDKs should appear first.
+ Typically, to setup your environment, you would execute the
+ following script:
+
+ \code
+ Set DXSDK_DIR=C:\Program Files\Microsoft DirectX SDK (February 2007)
+ %DXSDK_DIR%\utilities\bin\dx_setenv.cmd
+ C:\program files\Microsoft Platform SDK\setenv.cmd
+ \endcode
+
+ If your environment is setup correctly, executing configure.exe on
+ your Qt installation should automatically activate Phonon.
+
+ \warning The MinGW version of Qt does not support building the
+ Qt backend.
+
+ \section2 Linux
+
+ The Qt backend on Linux uses GStreamer (minimum version is 0.10),
+ which must be installed on the system. At a minimum, you need the
+ GStreamer library and base plugins, which provides support for \c
+ .ogg files. The package names may vary between Linux
+ distributions; on Mandriva, they have the following names:
+
+ \table
+ \header
+ \o Package
+ \o Description
+ \row
+ \o libgstreamer0.10_0.10
+ \o The GStreamer base library.
+ \row
+ \o libgstreamer0.10_0.10-devel
+ \o Contains files for developing applications with
+ GStreamer.
+ \row
+ \o libgstreamer-plugins-base0.10
+ \o Contains the basic plugins for audio and video
+ playback, and will enable support for \c ogg files.
+ \row
+ \o libgstreamer-plugins-base0.10-devel
+ \o Makes it possible to develop applications using the
+ base plugins.
+ \endtable
+
+ \omit Should go in troubleshooting (in for example README)
+ alsasink backend for GStreamer
+ \table
+ \header
+ \o Variable
+ \o Description
+ \row
+ \o PHONON_GST_AUDIOSINK
+ \o Sets the audio sink to be used. Possible values are
+ ... alsasink.
+ \row
+ \o PHONON_GSTREAMER_DRIVER
+ \o Sets the driver for GStreamer. This driver will
+ usually be configured automatically when
+ installing.
+ \row
+ \o PHONON_GST_VIDEOWIDGET
+ \o This variable can be set to the name of a widget to
+ use as the video widget??
+ \row
+ \o PHONON_GST_DEBUG
+ \o Phonon will give debug information while running if
+ this variable is set to a number between 1 and 3.
+ \row
+ \o PHONON_TESTURL
+ \o ...
+ \endtable
+ \endomit
+
+ \section2 Mac OS X
+
+ On Mac OS X, Qt uses QuickTime for its backend. The minimum
+ supported version is 7.0.
+
+ \section1 Deploying Phonon Applications on Windows and Mac OS X
+
+ On Windows and Mac OS X, the Qt backend makes use of the
+ \l{QtOpenGL Module}{QtOpenGL} module. You therefore need to deploy
+ the QtOpenGL shared library. If this is not what you want, it is
+ possible to configure Qt without OpenGL support. In that case, you
+ need to run \c configure with the \c -no-opengl option.
+
+ \section1 Work in Progress
+
+ Phonon and its Qt backends, though fully functional for
+ multimedia playback, are still under development. Functionality to
+ come is the possibility to capture media and more processors for
+ both music and video files.
+
+ Another important consideration is to implement support for
+ storing media to files; i.e., not playing back media directly.
+
+ We also hope in the future to be able to support direct
+ manipulation of media streams. This will give the programmer more
+ freedom to manipulate streams than just through processors.
+
+ Currently, the multimedia framework supports one input source. It will be
+ possible to include several sources. This is useful in, for example, audio
+ mixer applications where several audio sources can be sent, processed and
+ output as a single audio stream.
+*/
+
diff --git a/doc/src/frameworks-technologies/plugins-howto.qdoc b/doc/src/frameworks-technologies/plugins-howto.qdoc
new file mode 100644
index 0000000..78e5c20
--- /dev/null
+++ b/doc/src/frameworks-technologies/plugins-howto.qdoc
@@ -0,0 +1,311 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group plugins
+ \title Plugin Classes
+ \ingroup groups
+
+ \brief Plugin related classes.
+
+ These classes deal with shared libraries, (e.g. .so and DLL files),
+ and with Qt plugins.
+
+ See the \link plugins-howto.html plugins documentation\endlink.
+
+ See also the \l{ActiveQt framework} for Windows.
+*/
+
+/*!
+ \page plugins-howto.html
+ \title How to Create Qt Plugins
+ \brief A guide to creating plugins to extend Qt applications and
+ functionality provided by Qt.
+
+ \ingroup frameworks-technologies
+
+ \keyword QT_DEBUG_PLUGINS
+ \keyword QT_NO_PLUGIN_CHECK
+
+ Qt provides two APIs for creating plugins:
+
+ \list
+ \o A higher-level API for writing extensions to Qt itself: custom database
+ drivers, image formats, text codecs, custom styles, etc.
+ \o A lower-level API for extending Qt applications.
+ \endlist
+
+ For example, if you want to write a custom QStyle subclass and
+ have Qt applications load it dynamically, you would use the
+ higher-level API.
+
+ Since the higher-level API is built on top of the lower-level API,
+ some issues are common to both.
+
+ If you want to provide plugins for use with \QD, see the QtDesigner
+ module documentation.
+
+ Topics:
+
+ \tableofcontents
+
+ \section1 The Higher-Level API: Writing Qt Extensions
+
+ Writing a plugin that extends Qt itself is achieved by
+ subclassing the appropriate plugin base class, implementing a few
+ functions, and adding a macro.
+
+ There are several plugin base classes. Derived plugins are stored
+ by default in sub-directories of the standard plugin directory. Qt
+ will not find plugins if they are not stored in the right
+ directory.
+
+ \table
+ \header \o Base Class \o Directory Name \o Key Case Sensitivity
+ \row \o QAccessibleBridgePlugin \o \c accessiblebridge \o Case Sensitive
+ \row \o QAccessiblePlugin \o \c accessible \o Case Sensitive
+ \row \o QDecorationPlugin \o \c decorations \o Case Insensitive
+ \row \o QFontEnginePlugin \o \c fontengines \o Case Insensitive
+ \row \o QIconEnginePlugin \o \c iconengines \o Case Insensitive
+ \row \o QImageIOPlugin \o \c imageformats \o Case Sensitive
+ \row \o QInputContextPlugin \o \c inputmethods \o Case Sensitive
+ \row \o QKbdDriverPlugin \o \c kbddrivers \o Case Insensitive
+ \row \o QMouseDriverPlugin \o \c mousedrivers \o Case Insensitive
+ \row \o QScreenDriverPlugin \o \c gfxdrivers \o Case Insensitive
+ \row \o QScriptExtensionPlugin \o \c script \o Case Sensitive
+ \row \o QSqlDriverPlugin \o \c sqldrivers \o Case Sensitive
+ \row \o QStylePlugin \o \c styles \o Case Insensitive
+ \row \o QTextCodecPlugin \o \c codecs \o Case Sensitive
+ \endtable
+
+ Suppose that you have a new style class called \c MyStyle that you
+ want to make available as a plugin. The required code is
+ straightforward, here is the class definition (\c
+ mystyleplugin.h):
+
+ \snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 0
+
+ Ensure that the class implementation is located in a \c .cpp file
+ (including the class definition):
+
+ \snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 1
+
+ (Note that QStylePlugin is case insensitive, and the lower-case
+ version of the key is used in our
+ \l{QStylePlugin::create()}{create()} implementation; most other
+ plugins are case sensitive.)
+
+ For database drivers, image formats, text codecs, and most other
+ plugin types, no explicit object creation is required. Qt will
+ find and create them as required. Styles are an exception, since
+ you might want to set a style explicitly in code. To apply a
+ style, use code like this:
+
+ \snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 2
+
+ Some plugin classes require additional functions to be
+ implemented. See the class documentation for details of the
+ virtual functions that must be reimplemented for each type of
+ plugin.
+
+ The \l{Style Plugin Example} shows how to implement a plugin
+ that extends the QStylePlugin base class.
+
+ \section1 The Lower-Level API: Extending Qt Applications
+
+ Not only Qt itself but also Qt application can be extended
+ through plugins. This requires the application to detect and load
+ plugins using QPluginLoader. In that context, plugins may provide
+ arbitrary functionality and are not limited to database drivers,
+ image formats, text codecs, styles, and the other types of plugin
+ that extend Qt's functionality.
+
+ Making an application extensible through plugins involves the
+ following steps:
+
+ \list 1
+ \o Define a set of interfaces (classes with only pure virtual
+ functions) used to talk to the plugins.
+ \o Use the Q_DECLARE_INTERFACE() macro to tell Qt's
+ \l{meta-object system} about the interface.
+ \o Use QPluginLoader in the application to load the plugins.
+ \o Use qobject_cast() to test whether a plugin implements a given
+ interface.
+ \endlist
+
+ Writing a plugin involves these steps:
+
+ \list 1
+ \o Declare a plugin class that inherits from QObject and from the
+ interfaces that the plugin wants to provide.
+ \o Use the Q_INTERFACES() macro to tell Qt's \l{meta-object
+ system} about the interfaces.
+ \o Export the plugin using the Q_EXPORT_PLUGIN2() macro.
+ \o Build the plugin using a suitable \c .pro file.
+ \endlist
+
+ For example, here's the definition of an interface class:
+
+ \snippet examples/tools/plugandpaint/interfaces.h 2
+
+ Here's the definition of a plugin class that implements that
+ interface:
+
+ \snippet examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h 0
+
+ The \l{tools/plugandpaint}{Plug & Paint} example documentation
+ explains this process in detail. See also \l{Creating Custom
+ Widgets for Qt Designer} for information about issues that are
+ specific to \QD. You can also take a look at the \l{Echo Plugin
+ Example} is a more trivial example on how to implement a plugin
+ that extends Qt applications. Please note that a QCoreApplication
+ must have been initialized before plugins can be loaded.
+
+ \section1 Locating Plugins
+
+ Qt applications automatically know which plugins are available,
+ because plugins are stored in the standard plugin subdirectories.
+ Because of this applications don't require any code to find and load
+ plugins, since Qt handles them automatically.
+
+ During development, the directory for plugins is \c{QTDIR/plugins}
+ (where \c QTDIR is the directory where Qt is installed), with each
+ type of plugin in a subdirectory for that type, e.g. \c styles. If
+ you want your applications to use plugins and you don't want to use
+ the standard plugins path, have your installation process
+ determine the path you want to use for the plugins, and save the
+ path, e.g. using QSettings, for the application to read when it
+ runs. The application can then call
+ QCoreApplication::addLibraryPath() with this path and your
+ plugins will be available to the application. Note that the final
+ part of the path (e.g., \c styles) cannot be changed.
+
+ If you want the plugin to be loadable then one approach is to
+ create a subdirectory under the application and place the plugin
+ in that directory. If you distribute any of the plugins that come
+ with Qt (the ones located in the \c plugins directory), you must
+ copy the sub-directory under \c plugins where the plugin is
+ located to your applications root folder (i.e., do not include the
+ \c plugins directory).
+
+ For more information about deployment,
+ see the \l {Deploying Qt Applications} and \l {Deploying Plugins}
+ documentation.
+
+ \section1 Static Plugins
+
+ The normal and most flexible way to include a plugin with an
+ application is to compile it into a dynamic library that is shipped
+ separately, and detected and loaded at runtime.
+
+ Plugins can be linked statically against your application. If you
+ build the static version of Qt, this is the only option for
+ including Qt's predefined plugins. Using static plugins makes the
+ deployment less error-prone, but has the disadvantage that no
+ functionality from plugins can be added without a complete rebuild
+ and redistribution of the application.
+
+ When compiled as a static library, Qt provides the following
+ static plugins:
+
+ \table
+ \header \o Plugin name \o Type \o Description
+ \row \o \c qtaccessiblecompatwidgets \o Accessibility \o Accessibility for Qt 3 support widgets
+ \row \o \c qtaccessiblewidgets \o Accessibility \o Accessibility for Qt widgets
+ \row \o \c qdecorationdefault \o Decorations (Qt Extended) \o Default style
+ \row \o \c qdecorationwindows \o Decorations (Qt Extended) \o Windows style
+ \row \o \c qgif \o Image formats \o GIF
+ \row \o \c qjpeg \o Image formats \o JPEG
+ \row \o \c qmng \o Image formats \o MNG
+ \row \o \c qico \o Image formats \o ICO
+ \row \o \c qsvg \o Image formats \o SVG
+ \row \o \c qtiff \o Image formats \o TIFF
+ \row \o \c qimsw_multi \o Input methods (Qt Extended) \o Input Method Switcher
+ \row \o \c qwstslibmousehandler \o Mouse drivers (Qt Extended) \o \c tslib mouse
+ \row \o \c qgfxtransformed \o Graphic drivers (Qt Extended) \o Transformed screen
+ \row \o \c qgfxvnc \o Graphic drivers (Qt Extended) \o VNC
+ \row \o \c qscreenvfb \o Graphic drivers (Qt Extended) \o Virtual frame buffer
+ \row \o \c qsqldb2 \o SQL driver \o IBM DB2 \row \o \c qsqlibase \o SQL driver \o Borland InterBase
+ \row \o \c qsqlite \o SQL driver \o SQLite version 3
+ \row \o \c qsqlite2 \o SQL driver \o SQLite version 2
+ \row \o \c qsqlmysql \o SQL driver \o MySQL
+ \row \o \c qsqloci \o SQL driver \o Oracle (OCI)
+ \row \o \c qsqlodbc \o SQL driver \o Open Database Connectivity (ODBC)
+ \row \o \c qsqlpsql \o SQL driver \o PostgreSQL
+ \row \o \c qsqltds \o SQL driver \o Sybase Adaptive Server (TDS)
+ \row \o \c qcncodecs \o Text codecs \o Simplified Chinese (People's Republic of China)
+ \row \o \c qjpcodecs \o Text codecs \o Japanese
+ \row \o \c qkrcodecs \o Text codecs \o Korean
+ \row \o \c qtwcodecs \o Text codecs \o Traditional Chinese (Taiwan)
+ \endtable
+
+ To link statically against those plugins, you need to use the
+ Q_IMPORT_PLUGIN() macro in your application and you need to add
+ the required plugins to your build using \c QTPLUGIN.
+ For example, in your \c main.cpp:
+
+ \snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 4
+
+ In the \c .pro file for your application, you need the following
+ entry:
+
+ \snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 5
+
+ It is also possible to create your own static plugins, by
+ following these steps:
+
+ \list 1
+ \o Add \c{CONFIG += static} to your plugin's \c .pro file.
+ \o Use the Q_IMPORT_PLUGIN() macro in your application.
+ \o Link your application with your plugin library using \c LIBS
+ in the \c .pro file.
+ \endlist
+
+ See the \l{tools/plugandpaint}{Plug & Paint} example and the
+ associated \l{tools/plugandpaintplugins/basictools}{Basic Tools}
+ plugin for details on how to do this.
+
+ \note If you are not using qmake to build your application you need
+ to make sure that the \c{QT_STATICPLUGIN} preprocessor macro is
+ defined.
+
+ \sa QPluginLoader, QLibrary, {Plug & Paint Example}
+*/
diff --git a/doc/src/frameworks-technologies/qthelp.qdoc b/doc/src/frameworks-technologies/qthelp.qdoc
new file mode 100644
index 0000000..949f74a
--- /dev/null
+++ b/doc/src/frameworks-technologies/qthelp.qdoc
@@ -0,0 +1,382 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group helpsystem
+ \title Help System
+ \ingroup groups
+
+ \brief Classes used to provide online-help for applications.
+
+ \keyword help system
+
+ These classes provide for all forms of online-help in your application,
+ with three levels of detail:
+
+ \list 1
+ \o Tool Tips and Status Bar message - flyweight help, extremely brief,
+ entirely integrated in the user interface, requiring little
+ or no user interaction to invoke.
+ \o What's This? - lightweight, but can be
+ a three-paragraph explanation.
+ \o Online Help - can encompass any amount of information,
+ but is typically slower to call up, somewhat separated
+ from the user's work, and often users feel that using online
+ help is a digression from their real task.
+ \endlist
+
+*/
+
+/*!
+ \page qthelp-framework.html
+ \title The Qt Help Framework
+ \brief Integrating Documentation in Applications
+ \ingroup frameworks-technologies
+
+ \section1 Topics
+
+ \tableofcontents
+
+ \section1 Overview
+ The Qt help system includes tools for generating and viewing
+ Qt help files. In addition it provides classes for accessing
+ help contents programatically to be able to integrate online
+ help into Qt applications.
+
+ The actual help data, meaning the table of contents, index
+ keywords or html documents, is contained in Qt compressed help
+ files. So, one such a help file represents usually one manual
+ or documentation set. Since most products are more comprehensive
+ and consist of a number of tools, one manual is rarely enough.
+ Instead, more manuals which should be accessible at the same
+ time, exist. Ideally, it should also be possible to reference
+ certain points of interest of one manual to another.
+ Therefore, the Qt help system operates on help collection files
+ which include any number of compressed help files.
+
+ However, having collection files to merge many documentation
+ sets may lead to some problems. For example, one index keyword
+ may be defined in different documentations. So, when only seeing
+ it in the index and activating it, you cannot be sure that
+ the expected documentation will be shown. Therefore, the Qt
+ help system offers the possibiltiy to filter the help contents
+ after certain attributes. This requires however, that the
+ attributes have been assigned to the help contents before the
+ generation of the compressed help file.
+
+ As already mentioned, the Qt compressed help file contains all
+ data, so there is no need any longer to ship all single html
+ files. Instead, only the compressed help file and optionally the
+ collection file has to be distributed. The collection file is
+ optional since any existing collection file, e.g. from an older
+ release could be used.
+
+ So, in general, there are four files interacting with the help
+ system, two used for generating Qt help and two meant for
+ distribution:
+
+ \table
+ \header
+ \o Name
+ \o Extension
+ \o Brief Description
+ \row
+ \o \l {Qt Help Project}
+ \o .qhp
+ \o The input file for the help generator consisting of the table
+ of contents, indices and references to the actual documentation
+ files (*.html); it also defines a unique namespace for the
+ documentation.
+
+ \row
+ \o Qt Compressed Help
+ \o .qch
+ \o The output file of the help generator. This binary file contains
+ all information specified in the help project file along with all
+ compressed documentation files.
+
+ \row
+ \o \l {Qt Help Collection Project}
+ \o .qhcp
+ \o The input file for the help collection generator. It contains
+ references to compressed help files which should be included in
+ the collection; it also may contain other information for
+ customizing Qt Assistant.
+
+ \row
+ \o Qt Help Collection
+ \o .qhc
+ \o The output of the help collection generator. This is the file
+ QHelpEngine operates on. It contains references to any number of
+ compressed help files as well as additional information, such as
+ custom filters.
+ \endtable
+
+ \section1 Generating Qt Help
+
+ Building help files for the Qt help system assumes that the html
+ documentation files already exist, i.e. the Qt help system does
+ not offer the possibility to create html files like e.g. Doxygen.
+
+ Once the html documentents are in place, a \l {Qt Help Project} file
+ has to be created. After specifying all relevant information in
+ this file, it needs to be compiled by calling:
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 2
+
+ The file 'doc.qch' contains then all html files in compressed
+ form along with the table of contents and index keywords. To
+ test if the generated file is correct, open Qt Assistant and
+ install the file via the Settings|Documentation page.
+
+ \target Qt Help Collection Project
+ \section2 Creating a Qt Help Collection
+
+ The first step is to create a Qt Help Collection Project file.
+ Since a Qt help collection stores primarily references to
+ compressed help files, the project 'mycollection.qhcp' file
+ looks unsurprisingly simple:
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 3
+
+ For actually creating the collection file call:
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 4
+
+ Instead of running two tools, one for generating the compressed
+ help and one for generating the collection file, it is also
+ possible to just run the qcollectiongenerator tool with a
+ slightly modified project file instructing the generator to
+ create the compressed help first.
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 5
+
+ Of course, it is possible to specify more than one file in the
+ 'generate' or 'register' section, so any number of compressed
+ help files can be generated and registered in one go.
+
+ \section1 Using Qt Help
+
+ Accessing the help contents can be done in two ways: Using Qt
+ Assistant as documentation browser or using the QHelpEngine
+ API for embedding the help contents directly in an application.
+
+ \section2 Using Qt Assistant
+
+ \QA operates on a collection file which can be specified
+ before start up. If no collection file is given, a default one
+ will be created and used. In either case, it is possible to
+ register any Qt compressed help file and access the help contents.
+
+ When using Assistant as the help browser for an application, it
+ would be desirable that it can be customized to fit better to the
+ application and doesn't look like an independent, standalone
+ help browser. To achieve this, several additional properties can
+ be set in an Qt help collection file, to change e.g. the title
+ or application icon of Qt Assistant. For more information on
+ this topic have a look at the \l{assistant-manual.html}
+ {Qt Assistant manual}.
+
+ \section2 Using QHelpEngine API
+
+ Instead of showing the help in an external application like the
+ Qt Assistant, it is also possible to embed the online help in
+ the application. The contents can then be retrieved via the
+ QHelpEngine class and can be displayed in nearly any form.
+ Showing it in a QTextBrowser is probably the most common way, but
+ embedding it in What's This help is also perfectly possible.
+
+ Retrieving help data from the file engine does not involve a
+ lot of code. The first step is to create an instance of the
+ help engine. Then we ask the engine for the links assigned to
+ the identifier, in this case "MyDialog::ChangeButton". If a link
+ was found, meaning at least one help document exists to this topic,
+ we get the actual help contents by calling fileData() and display
+ the document to the user.
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 6
+
+ For further information on how to use the API, have a look at
+ the QHelpEngine class reference.
+*/
+
+/*!
+ \page qthelpproject.html
+ \title Qt Help Project
+
+ A Qt help project collects all data necessary to generate a
+ compressed help file. Along with the actual help data, like
+ the table of contents, index keywords and help documents, it
+ contains some extra information like a namespace to identify
+ the help file. One help project stands for one documentation,
+ e.g. the Qt Assistant manual.
+
+ \section1 Qt Help Project File Format
+
+ The file format is XML-based. For a better understanding of
+ the format we'll discuss the following example:
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 7
+
+ \section2 Namespace
+
+ To enable the QHelpEngine to retrieve the proper documentation to
+ a given link, every documentation set has to have a unique
+ identifier. A unique identifier makes is also possible for the
+ help collection to keep track of a documentation set without relying
+ on its file name. The Qt help system uses a namespace as identifier
+ which is defined by the mandatory namespace tags. In the example
+ above, the namespace is "mycompany.com.myapplication.1_0".
+
+ \target Virtual Folders
+ \section2 Virtual Folders
+
+ Having a namespace for every documentation naturally means that
+ the documentation sets are quite separated. From the help engines
+ point of view this is beneficial, but from the documentors view
+ it is often desirable to cross reference certain topic from one
+ manual to another without having to specify absolute links. To
+ solve this problem, the help system introduced the concept of
+ virtual folders.
+
+ A virtual folder will become the root directory of all files
+ referenced in a compressed help file. When two documentations
+ share the same virtual folder, they can use relative paths when
+ defining hyperlinks pointing to the other documentation. If a
+ file is contained in both documentations or manuals, the one
+ from the current manual has precedence over the other.
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 8
+
+ The above example specifies 'doc' as virtual folder. If another
+ manual, e.g. for a small helper tool for 'My Application'
+ specifies the same folder, it is sufficient to write
+ 'doc.html#section1' to reference the first section in the
+ 'My Application' manual.
+
+ The virtual folder tag is mandatory and the folder must not
+ contain any '/'.
+
+ \target Custom Filters
+ \section2 Custom Filters
+
+ Next in the Qt help project file are the optional definitions of
+ custom filters. A custom filter contains a list of filter
+ attributes which will be used later to display only the documentation
+ which has all those attributes assigned to. So, when setting the
+ current filter in the QHelpEngine to "My Application 1.0" only
+ the documentation which has "myapp" and "1.0" set as filter
+ attributes will be shown.
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 9
+
+ It is possible to define any number of custom filters in a help
+ project file. Important to know is, that the filter attributes have
+ not to be specified in the same project file; they can be defined
+ in any other help file. The definition of a filter attributes
+ takes place by specifying them in a filter section.
+
+ \target Filter Section
+ \section2 Filter Section
+
+ A filter section contains the actual documentation. One Qt help project
+ file may contain more than one filter sections. Every filter section
+ consists of four parts, the filter attributes section, the table of
+ contents, the keywords and the files list. In theory all parts are
+ optional but not specifying anything there will result in an empty
+ documentation.
+
+ \section3 Filter Attributes
+
+ Every filter section should have filter attributes assigned to it, to
+ enable documentation filtering. If no filter attribute is defined, the
+ documentation will only be shown if no filtering occurs, meaning the
+ current custom filter in the QHelpEngine does not contain any filter
+ attributes.
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 10
+
+ In this case, the filter attributes 'myapp' and '1.0' are assigned
+ to the filter section, i.e. all contents specified in this section
+ will only be shown if the current custom filter has 'myapp' or '1.0'
+ or both as filter attributes.
+
+ \section3 Table of contents
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 11
+
+ One section tag represents one item in the table of contents. The
+ sections can be nested to any degree, but from a users perspective
+ it should not be more than four or five levels. A section is defined
+ by its title and reference. The reference, like all file references in a Qt
+ help project, are relative to the help project file itself.
+ \note The referenced files must be inside the same directory (or within a
+ subdirectory) as the help project file. An absolute file path is not supported
+ either.
+
+ \section3 Keywords
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 12
+
+ The keyword section lists all keywords of this filter section. A
+ keyword consists basically of a name and a file reference. If the
+ attribute 'name' is used then the keyword specified there will appear in
+ the visible index, i.e. it will be accessible through the QHelpIndexModel.
+ If 'id' is used, the keyword does not appear in the index and is
+ only accessible via the linksForIdentifier() function of the
+ QHelpEngineCore. 'name' and 'id' can be specified at the same time.
+
+ \section3 Files
+
+ \snippet doc/src/snippets/code/doc_src_qthelp.qdoc 13
+
+ Finally, the actual documentation files have to be listed. Make sure
+ that all files neccessary to display the help are mentioned, i.e.
+ stylesheets or similar files need to be there as well. The files, like all
+ file references in a Qt help project, are relative to the help project file
+ itself. As the example shows, files (but not directories) can also be
+ specified as patterns using wildcards. All listed files will be compressed
+ and written to the Qt compressed help file. So, in the end, one single Qt
+ help file contains all documentation files along with the contents and
+ indices. \note The referenced files must be inside the same directory
+ (or within a subdirectory) as the help project file. An absolute file path
+ is not supported either.
+*/
diff --git a/doc/src/frameworks-technologies/qundo.qdoc b/doc/src/frameworks-technologies/qundo.qdoc
new file mode 100644
index 0000000..ab9f220
--- /dev/null
+++ b/doc/src/frameworks-technologies/qundo.qdoc
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qundo.html
+ \title Overview of Qt's Undo Framework
+ \keyword Undo framework
+ \ingroup frameworks-technologies
+
+ \section1 Introduction
+
+ Qt's Undo Framework is an implementation of the Command pattern, for
+ implementing undo/redo functionality in applications.
+
+ The Command pattern is based on the idea that all editing in
+ an application is done by creating instances of command objects.
+ Command objects apply changes to the document and are stored
+ on a command stack. Furthermore, each command knows how to undo its
+ changes to bring the document back to its previous state. As long
+ as the application only uses command objects to change the state of
+ the document, it is possible to undo a sequence of commands by
+ traversing the stack downwards and calling undo
+ on each command in turn. It is also possible to redo a sequence of
+ commands by traversing the stack upwards and calling
+ redo on each command.
+
+ \section1 Classes
+
+ The framework consists of four classes:
+
+ \list
+ \i \l QUndoCommand is the base class of all commands stored on an
+ undo stack. It can apply (redo) or undo a single change in the document.
+ \i \l QUndoStack is a list of QUndoCommand objects. It contains all the
+ commands executed on the document and can roll the document's state
+ backwards or forwards by undoing or redoing them.
+ \i \l QUndoGroup is a group of undo stacks. It is useful when an application
+ contains more than one undo stack, typically one for each opened
+ document. QUndoGroup provides a single pair of undo/redo slots for all
+ the stacks in the group. It forwards undo and redo requests to
+ the active stack, which is the stack associated with the document that
+ is currently being edited by the user.
+ \i \l QUndoView is a widget which shows the contents of an undo stack. Clicking
+ on a command in the view rolls the document's state backwards or
+ forwards to that command.
+ \endlist
+
+ \section1 Concepts
+
+ The following concepts are supported by the framework:
+
+ \list
+ \i \bold{Clean state:} Used to signal when the document enters and leaves a
+ state that has been saved to disk. This is typically used to disable or
+ enable the save actions, and to update the document's title bar.
+ \i \bold{Command compression:} Used to compress sequences of commands into a
+ single command.
+ For example: In a text editor, the commands that insert individual
+ characters into the document can be compressed into a single command that
+ inserts whole sections of text. These bigger changes are more convenient
+ for the user to undo and redo.
+ \i \bold{Command macros:} A sequence of commands, all of which are undone or
+ redone in one step.
+ These simplify the task of writing an application, since a set of simpler
+ commands can be composed into more complex commands. For example, a command
+ that moves a set of selected objects in a document can be created by
+ combining a set of commands, each of which moves a single object.
+ \endlist
+
+ QUndoStack provides convenient undo and redo QAction objects that
+ can be inserted into a menu or a toolbar. The text properties of these
+ actions always reflect what command will be undone or redone when
+ they are triggered. Similarly, QUndoGroup provides undo and redo actions
+ that always behave like the undo and redo actions of the active stack.
+*/
diff --git a/doc/src/frameworks-technologies/richtext.qdoc b/doc/src/frameworks-technologies/richtext.qdoc
new file mode 100644
index 0000000..0b06d02
--- /dev/null
+++ b/doc/src/frameworks-technologies/richtext.qdoc
@@ -0,0 +1,1226 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group richtext-processing
+ \title Rich Text Processing APIs
+*/
+
+/*!
+ \page richtext.html
+ \title Rich Text Processing
+ \brief An overview of Qt's rich text processing, editing and display features.
+
+ \ingroup frameworks-technologies
+
+ \nextpage Rich Text Document Structure
+
+ The Scribe framework provides a set of classes for reading and manipulating
+ structured rich text documents. Unlike previous rich text support in Qt, the
+ new classes are centered around the QTextDocument class rather than raw
+ textual information. This enables the developer to create and modify
+ structured rich text documents without having to prepare content in an
+ intermediate markup format.
+
+ The information within a document can be accessed via two complementary
+ interfaces: A cursor-based interface is used for editing, and a read-only
+ hierarchical interface provides a high level overview of the document
+ structure. The main advantage of the cursor-based interface is that the
+ text can be edited using operations that mimic a user's interaction with
+ an editor, without losing the underlying structure of the document. The
+ read-only hierarchical interface is most useful when performing operations
+ such as searching and document export.
+
+ This document is divided up into chapters for convenient reference:
+
+ \list
+ \i \l{Rich Text Document Structure} outlines
+ the different kinds of elements in a QTextDocument, and describes how
+ they are arranged in a document structure.
+ \i \l{The QTextCursor Interface} explains how rich
+ text documents can be edited using the cursor-based interface.
+ \i \l{Document Layouts} briefly explains the role of document layouts.
+ \i \l{Common Rich Text Editing Tasks} examines some
+ common tasks that involve reading or manipulating rich text documents.
+ \i \l{Advanced Rich Text Processing} examines advanced rich text editing tasks.
+ \i \l{Supported HTML Subset} lists the HTML tags supported by QTextDocument.
+ \endlist
+
+ \section1 Rich Text Processing APIs
+
+ Qt provides an extensive collection of classes for parsing, rendering
+ manipulating and editing rich text.
+
+ \annotatedlist richtext-processing
+*/
+
+/*!
+ \page richtext-structure.html
+ \contentspage richtext.html Contents
+ \previouspage Rich Text Processing
+ \nextpage The QTextCursor Interface
+
+ \title Rich Text Document Structure
+
+ \tableofcontents
+
+ Text documents are represented by the QTextDocument class, which
+ contains information about the document's internal representation, its
+ structure, and keeps track of modifications to provide undo/redo
+ facilities.
+
+ The structured representation of a text document presents its contents as
+ a hierarchy of text blocks, frames, tables, and other objects. These provide
+ a logical structure to the document and describe how their contents will be
+ displayed. Generally, frames and tables are used to group other
+ structures while text blocks contain the actual textual information.
+
+ New elements are created and inserted into the document programmatically
+ \l{richtext-cursor.html}{with a QTextCursor} or by using an editor
+ widget, such as QTextEdit. Elements can be given a particular format when
+ they are created; otherwise they take the cursor's current format for the
+ element.
+
+ \table
+ \row
+ \i \inlineimage richtext-document.png
+ \i \bold{Basic structure}
+
+ The "top level" of a document might be populated in the way shown.
+ Each document always contains a root frame, and this always contains
+ at least one text block.
+
+ For documents with some textual content, the root
+ frame usually contains a sequence of blocks and other elements.
+
+ Sequences of frames and tables are always separated by text blocks in a
+ document, even if the text blocks contain no information. This ensures that
+ new elements can always be inserted between existing structures.
+ \endtable
+
+ In this chapter, we look at each of the structural elements
+ used in a rich text document, outline their features and uses, and show
+ how to examine their contents. Document editing is described in
+ \l{richtext-cursor.html}{The QTextCursor Interface}.
+
+ \section1 Rich Text Documents
+
+ QTextDocument objects contain all the information required to construct
+ rich text documents.
+ Text documents can be accessed in two complementary ways: as a linear
+ buffer for editors to use, and as an object hierarchy that is useful to
+ layout engines.
+ In the hierarchical document model, objects generally correspond to
+ visual elements such as frames, tables, and lists. At a lower level,
+ these elements describe properties such as the text style and alignment.
+ The linear representation of the document is used for editing and
+ manipulation of the document's contents.
+
+ Although QTextEdit makes it easy to display and edit rich text, documents
+ can also be used independently of any editor widget, for example:
+
+ \snippet doc/src/snippets/code/doc_src_richtext.qdoc 0
+
+ Alternatively, they can be extracted from an existing editor:
+
+ \snippet doc/src/snippets/code/doc_src_richtext.qdoc 1
+
+ This flexibility enables applications to handle multiple rich text
+ documents without the overhead of multiple editor widgets, or requiring
+ documents to be stored in some intermediate format.
+
+ An empty document contains a root frame which itself contains a single
+ empty text block. Frames provide logical separation between parts of the document, but
+ also have properties that determine how they will appear when rendered.
+ A table is a specialized type of frame that consists of a number of
+ cells, arranged into rows and columns, each of which can contain
+ further structure and text. Tables provide management and layout
+ features that allow flexible configurations of cells to be created.
+
+ Text blocks contain text fragments, each of which specifies text and
+ character format information. Textual properties are defined both at
+ the character level and at the block level. At the character level,
+ properties such as font family, text color, and font weight can be
+ specified. The block level properties control the higher level
+ appearance and behavior of the text, such as the direction of text
+ flow, alignment, and background color.
+
+ The document structure is not manipulated directly. Editing is
+ performed through a cursor-based interface.
+ The \l{richtext-cursor.html}{text cursor interface}
+ automatically inserts new document elements into the root frame, and
+ ensures that it is padded with empty blocks where necessary.
+
+ We obtain the root frame in the following manner:
+
+ \snippet doc/src/snippets/textdocument-frames/xmlwriter.h 0
+ \snippet doc/src/snippets/textdocument-frames/xmlwriter.cpp 0
+
+ When navigating the document structure, it is useful to begin at the
+ root frame because it provides access to the entire document structure.
+
+
+ \section1 Document Elements
+
+ Rich text documents usually consist of common elements such as paragraphs,
+ frames, tables, and lists. These are represented in a QTextDocument
+ by the QTextBlock, QTextFrame, QTextTable, and QTextList classes.
+ Unlike the other elements in a document, images are represented by
+ specially formatted text fragments. This enables them to be placed
+ formatted inline with the surrounding text.
+
+ The basic structural building blocks in documents are QTextBlock and
+ QTextFrame. Blocks themselves contain fragments of rich text
+ (QTextFragment), but these do not directly influence the high level
+ structure of a document.
+
+ Elements which can group together other document elements are typically
+ subclasses of QTextObject, and fall into two categories: Elements that
+ group together text blocks are subclasses of QTextBlockGroup, and those
+ that group together frames and other elements are subclasses of QTextFrame.
+
+ \section2 Text Blocks
+
+ Text blocks are provided by the QTextBlock class.
+
+ Text blocks group together fragments of text with different character formats,
+ and are used to represent paragraphs in the document. Each block
+ typically contains a number of text fragments with different styles.
+ Fragments are created when text is inserted into the document, and more
+ of them are added when the document is edited. The document splits, merges,
+ and removes fragments to efficiently represent the different styles
+ of text in the block.
+
+ The fragments within a given block can be examined by using a
+ QTextBlock::iterator to traverse the block's internal structure:
+
+ \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 3
+ \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 5
+ \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 6
+
+ Blocks are also used to represent list items. As a result, blocks can
+ define their own character formats which contain information about
+ block-level decoration, such as the type of bullet points used for
+ list items. The formatting for the block itself is described by the
+ QTextBlockFormat class, and describes properties such as text alignment,
+ indentation, and background color.
+
+ Although a given document may contain complex structures, once we have a
+ reference to a valid block in the document, we can navigate between each
+ of the text blocks in the order in which they were written:
+
+ \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 0
+ \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 1
+ \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 2
+
+ This method is useful for when you want to extract just the rich text from a
+ document because it ignores frames, tables, and other types of structure.
+
+ QTextBlock provides comparison operators that make it easier to manipulate
+ blocks: \l{QTextBlock::operator==()}{operator==()} and
+ \l{QTextBlock::operator!=()}{operator!=()} are used to test whether two
+ blocks are the same, and \l{QTextBlock::operator<()}{operator<()} is used
+ to determine which one occurs first in a document.
+
+ \section2 Frames
+
+ Frames are provided by the QTextFrame class.
+
+ Text frames group together blocks of text and child frames, creating
+ document structures that are larger than paragraphs. The format of a frame
+ specifies how it is rendered and positioned on the page. Frames are
+ either inserted into the text flow, or they float on the left or right
+ hand side of the page.
+ Each document contains a root frame that contains all the other document
+ elements. As a result, all frames except the root frame have a parent
+ frame.
+
+ Since text blocks are used to separate other document elements, each
+ frame will always contain at least one text block, and zero or more
+ child frames. We can inspect the contents of a frame by using a
+ QTextFrame::iterator to traverse the frame's child elements:
+
+ \snippet doc/src/snippets/textdocument-frames/xmlwriter.cpp 1
+ \snippet doc/src/snippets/textdocument-frames/xmlwriter.cpp 2
+
+ Note that the iterator selects both frames and blocks, so it is necessary
+ to check which it is referring to. This allows us to navigate the document
+ structure on a frame-by-frame basis yet still access text blocks if
+ required. Both the QTextBlock::iterator and QTextFrame::iterator classes
+ can be used in complementary ways to extract the required structure from
+ a document.
+
+ \section2 Tables
+
+ Tables are provided by the QTextTable class.
+
+ Tables are collections of cells that are arranged in rows and columns.
+ Each table cell is a document element with its own character format, but it
+ can also contain other elements, such as frames and text blocks. Table cells
+ are automatically created when the table is constructed, or when extra rows
+ or columns are added. They can also be moved between tables.
+
+ QTextTable is a subclass of QTextFrame, so tables are treated like frames
+ in the document structure. For each frame that we encounter in the
+ document, we can test whether it represents a table, and deal with it in a
+ different way:
+
+ \snippet doc/src/snippets/textdocument-tables/xmlwriter.cpp 0
+ \snippet doc/src/snippets/textdocument-tables/xmlwriter.cpp 1
+
+ The cells within an existing table can be examined by iterating through
+ the rows and columns.
+
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 9
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 10
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 11
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 12
+
+
+ \section2 Lists
+
+ Lists are provided by the QTextList class.
+
+ Lists are sequences of text blocks that are formatted in the usual way, but
+ which also provide the standard list decorations such as bullet points and
+ enumerated items. Lists can be nested, and will be indented if the list's
+ format specifies a non-zero indentation.
+
+ We can refer to each list item by its index in the list:
+
+ \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 0
+ \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 1
+ \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 2
+
+ Since QTextList is a subclass of QTextBlockGroup, it does not group the
+ list items as child elements, but instead provides various functions for
+ managing them. This means that any text block we find when traversing a
+ document may actually be a list item. We can ensure that list items are
+ correctly identified by using the following code:
+
+ \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 3
+ \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 4
+ \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 5
+ \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 6
+ \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 7
+
+
+ \section2 Images
+
+ Images in QTextDocument are represented by text fragments that reference
+ external images via the resource mechanism. Images are created using the
+ cursor interface, and can be modified later by changing the character
+ format of the image's text fragment:
+
+ \snippet doc/src/snippets/textdocument-imageformat/main.cpp 0
+ \snippet doc/src/snippets/textdocument-imageformat/main.cpp 1
+ \snippet doc/src/snippets/textdocument-imageformat/main.cpp 2
+
+ The fragment that represents the image can be found by iterating over
+ the fragments in the text block that contains the image.
+*/
+
+/*!
+ \page richtext-cursor.html
+ \contentspage richtext.html Contents
+ \previouspage Rich Text Document Structure
+ \nextpage Document Layouts
+
+ \title The QTextCursor Interface
+
+ \tableofcontents
+
+ Documents can be edited via the interface provided by the QTextCursor
+ class; cursors are either created using a constructor or obtained from
+ an editor widget. The cursor is used to perform editing operations that
+ correspond exactly to those the user is able to make themselves in an
+ editor. As a result, information about the document structure is also
+ available through the cursor, and this allows the structure to be
+ modified. The use of a cursor-oriented interface for editing makes the
+ process of writing a custom editor simpler for developers, since the
+ editing operations can be easily visualized.
+
+ The QTextCursor class also maintains information about any text it
+ has selected in the document, again following a model that is
+ conceptually similar to the actions made by the user to select text
+ in an editor.
+
+ Rich text documents can have multiple cursors
+ associated with them, and each of these contains information about their
+ position in the document and any selections that they may hold. This
+ cursor-based paradigm makes common operations, such as cutting and pasting
+ text, simple to implement programmatically, yet it also allows more complex
+ editing operations to be performed on the document.
+
+ This chapter describes most of the common editing operations that you
+ will need to perform using a cursor, from basic insertion of text and
+ document elements to more complex manipulation of document structures.
+
+ \section1 Cursor-Based Editing
+
+ At the simplest level, text documents are made up of a string of characters,
+ marked up in some way to represent the block structure of the text within the
+ document. QTextCursor provides a cursor-based interface that allows the
+ contents of a QTextDocument to be manipulated at the character level. Since
+ the elements (blocks, frames, tables, etc.) are also encoded in the character
+ stream, the document structure can itself be changed by the cursor.
+
+ The cursor keeps track of its location within its parent document, and can
+ report information about the surrounding structure, such as the enclosing
+ text block, frame, table, or list. The formats of the enclosing structures
+ can also be directly obtained through the cursor.
+
+ \section2 Using a Cursor
+
+ The main use of a cursor is to insert or modify text within a block.
+ We can use a text editor's cursor to do this:
+
+ \snippet doc/src/snippets/textblock-formats/main.cpp 0
+
+ Alternatively, we can obtain a cursor directly from a document:
+
+ \snippet doc/src/snippets/textdocument-images/main.cpp 0
+
+ The cursor is positioned at the start of the document so that we can write
+ into the first (empty) block in the document.
+
+ \section2 Grouping Cursor Operations
+
+ A series of editing operations can be packaged together so that they can
+ be replayed, or undone together in a single action. This is achieved by
+ using the \c beginEditBlock() and \c endEditBlock() functions in the
+ following way, as in the following example where we select the word that
+ contains the cursor:
+
+ \snippet doc/src/snippets/textdocument-selections/mainwindow.cpp 0
+
+ If editing operations are not grouped, the document automatically records
+ the individual operations so that they can be undone later. Grouping
+ operations into larger packages can make editing more efficient both for
+ the user and for the application, but care has to be taken not to group too
+ many operations together as the user may want find-grained control over the
+ undo process.
+
+ \section2 Multiple Cursors
+
+ Multiple cursors can be used to simultaneously edit the same document,
+ although only one will be visible to the user in a QTextEdit widget.
+ The QTextDocument ensures that each cursor writes text correctly and
+ does not interfere with any of the others.
+
+ \omit
+ \snippet doc/src/snippets/textdocument-cursors/main.cpp 0
+ \snippet doc/src/snippets/textdocument-cursors/main.cpp 1
+ \endomit
+
+ \section1 Inserting Document Elements
+
+ QTextCursor provides several functions that can be used to change the
+ structure of a rich text document. Generally, these functions allow
+ document elements to be created with relevant formatting information,
+ and they are inserted into the document at the cursor's position.
+
+ The first group of functions insert block-level elements, and update the
+ cursor position, but they do not return the element that was inserted:
+
+ \list
+ \i \l{QTextCursor::insertBlock()}{insertBlock()} inserts a new text block
+ (paragraph) into a document at the cursor's position, and moves the
+ cursor to the start of the new block.
+ \i \l{QTextCursor::insertFragment()}{insertFragment()} inserts an existing
+ text fragment into a document at the cursor's position.
+ \i \l{QTextCursor::insertImage()}{insertImage()} inserts an image into a
+ document at the cursor's position.
+ \i \l{QTextCursor::insertText()}{insertText()} inserts text into the
+ document at the cursor's position.
+ \endlist
+
+ You can examine the contents of the element that was inserted through the
+ cursor interface.
+
+ The second group of functions insert elements that provide structure to
+ the document, and return the structure that was inserted:
+
+ \list
+ \i \l{QTextCursor::insertFrame()}{insertFrame()} inserts a frame into the
+ document \e after the cursor's current block, and moves the cursor to
+ the start of the empty block in the new frame.
+ \i \l{QTextCursor::insertList()}{insertList()} inserts a list into the
+ document at the cursor's position, and moves the cursor to the start
+ of the first item in the list.
+ \i \l{QTextCursor::insertTable()}{insertTable()} inserts a table into
+ the document \e after the cursor's current block, and moves the cursor
+ to the start of the block following the table.
+ \endlist
+
+ These elements either contain or group together other elements in the
+ document.
+
+ \section2 Text and Text Fragments
+
+ Text can be inserted into the current block in the current character
+ format, or in a custom format that is specified with the text:
+
+ \snippet doc/src/snippets/textdocument-charformats/main.cpp 0
+
+ Once the character format has been used with a cursor, that format becomes
+ the default format for any text inserted with that cursor until another
+ character format is specified.
+
+ If a cursor is used to insert text without specifying a character format,
+ the text will be given the character format used at that position in the
+ document.
+
+ \section2 Blocks
+
+ Text blocks are inserted into the document with the
+ \l{QTextCursor::insertBlock()}{insertBlock()} function.
+
+ \snippet doc/src/snippets/textblock-formats/main.cpp 1
+
+ The cursor is positioned at the start of the new block.
+
+ \section2 Frames
+
+ Frames are inserted into a document using the cursor, and will be placed
+ within the cursor's current frame \e after the current block.
+ The following code shows how a frame can be inserted between two text
+ blocks in a document's root frame. We begin by finding the cursor's
+ current frame:
+
+ \snippet doc/src/snippets/textdocument-frames/mainwindow.cpp 0
+
+ We insert some text in this frame then set up a frame format for the
+ child frame:
+
+ \snippet doc/src/snippets/textdocument-frames/mainwindow.cpp 1
+
+ The frame format will give the frame an external margin of 32 pixels,
+ internal padding of 8 pixels, and a border that is 4 pixels wide.
+ See the QTextFrameFormat documentation for more information about
+ frame formats.
+
+ The frame is inserted into the document after the preceding text:
+
+ \snippet doc/src/snippets/textdocument-frames/mainwindow.cpp 2
+
+ We add some text to the document immediately after we insert the frame.
+ Since the text cursor is positioned \e{inside the frame} when it is inserted
+ into the document, this text will also be inserted inside the frame.
+
+ Finally, we position the cursor outside the frame by taking the last
+ available cursor position inside the frame we recorded earlier:
+
+ \snippet doc/src/snippets/textdocument-frames/mainwindow.cpp 3
+
+ The text that we add last is inserted after the child frame in the
+ document. Since each frame is padded with text blocks, this ensures that
+ more elements can always be inserted with a cursor.
+
+ \section2 Tables
+
+ Tables are inserted into the document using the cursor, and will be
+ placed within the cursor's current frame \e after the current block:
+
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 0
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 3
+
+ Tables can be created with a specific format that defines the overall
+ properties of the table, such as its alignment, background color, and
+ the cell spacing used. It can also determine the constraints on each
+ column, allowing each of them to have a fixed width, or resize according
+ to the available space.
+
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 2
+
+ The columns in the table created above will each take up a certain
+ percentage of the available width. Note that the table format is
+ optional; if you insert a table without a format, some sensible
+ default values will be used for the table's properties.
+
+ Since cells can contain other document elements, they too can be
+ formatted and styled as necessary.
+
+ Text can be added to the table by navigating to each cell with the cursor
+ and inserting text.
+
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 4
+
+ We can create a simple timetable by following this approach:
+
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 5
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 6
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 7
+ \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 8
+
+ \section2 Lists
+
+ Lists of block elements can be automatically created and inserted into the
+ document at the current cursor position. Each list that is created in this
+ way requires a list format to be specified:
+
+ \snippet doc/src/snippets/textdocument-lists/mainwindow.cpp 0
+
+ The above code first checks whether the cursor is within an existing list
+ and, if so, gives the list format for the new list a suitable level of
+ indentation. This allows nested lists to be created with increasing
+ levels of indentation. A more sophisticated implementation would also use
+ different kinds of symbol for the bullet points in each level of the list.
+
+ \section2 Images
+
+ Inline images are added to documents through the cursor in the usual manner.
+ Unlike many other elements, all of the image properties are specified by the
+ image's format. This means that a QTextImageFormat object has to be
+ created before an image can be inserted:
+
+ \snippet doc/src/snippets/textdocument-images/main.cpp 1
+
+ The image name refers to an entry in the application's resource file.
+ The method used to derive this name is described in
+ \l{resources.html}{The Qt Resource System}.
+
+ \section1 Examples
+
+ Rich text is stored in text documents that can either be created by
+ importing HTML from an external source, or generated using a QTextCursor.
+
+ \section2 Manipulating Rich Text
+
+ The easiest way to use a rich text document is through
+ the QTextEdit class, providing an editable view onto a document. The code
+ below imports HTML into a document, and displays the document using a
+ text edit widget.
+
+ \snippet doc/src/snippets/scribe-overview/main.cpp 1
+
+ You can retrieve the document from the text edit using the
+ document() function. The document can then be edited programmatically
+ using the QTextCursor class. This class is modeled after a screen
+ cursor, and editing operations follow the same semantics. The following
+ code changes the first line of the document to a bold font, leaving all
+ other font properties untouched. The editor will be automatically
+ updated to reflect the changes made to the underlying document data.
+
+ \snippet doc/src/snippets/scribe-overview/main.cpp 0
+
+ Note that the cursor was moved from the start of the first line to the
+ end, but that it retained an anchor at the start of the line. This
+ demonstrates the cursor-based selection facilities of the
+ QTextCursor class.
+
+ \section2 Generating a Calendar
+
+ Rich text can be generated very quickly using the cursor-based
+ approach. The following example shows a simple calendar in a
+ QTextEdit widget with bold headers for the days of the week:
+
+ \snippet doc/src/snippets/textdocument-blocks/mainwindow.cpp 0
+ \codeline
+ \snippet doc/src/snippets/textdocument-blocks/mainwindow.cpp 1
+ \snippet doc/src/snippets/textdocument-blocks/mainwindow.cpp 2
+ \snippet doc/src/snippets/textdocument-blocks/mainwindow.cpp 3
+
+ The above example demonstrates how simple it is to quickly generate new
+ rich text documents using a minimum amount of code. Although we have
+ generated a crude fixed-pitch calendar to avoid quoting too much code,
+ Scribe provides much more sophisticated layout and formatting features.
+*/
+
+/*!
+ \page richtext-layouts.html
+ \contentspage richtext.html Contents
+ \previouspage The QTextCursor Interface
+ \nextpage Common Rich Text Editing Tasks
+
+ \title Document Layouts
+
+ \tableofcontents
+
+ The layout of a document is only relevant when it is to be displayed on
+ a device, or when some information is requested that requires a visual
+ representation of the document. Until this occurs, the document does
+ not need to be formatted and prepared for a device.
+
+ \section1 Overview
+
+ Each document's layout is managed by a subclass of the
+ QAbstractTextDocumentLayout class. This class provides a common
+ interface for layout and rendering engines. The default rendering
+ behavior is currently implemented in a private class. This approach
+ makes it possible to create custom layouts, and provides the
+ mechanism used when preparing pages for printing or exporting to
+ Portable Document Format (PDF) files.
+
+ \section1 Example - Shaped Text Layout
+
+ Sometimes it is important to be able to format plain text within an
+ irregularly-shaped region, perhaps when rendering a custom widget, for
+ example. Scribe provides generic features, such as those provided by
+ the QTextLayout class, to help developers perform word-wrapping and
+ layout tasks without the need to create a document first.
+
+ \img plaintext-layout.png
+
+ Formatting and drawing a paragraph of plain text is straightforward.
+ The example below will lay out a paragraph of text, using a single
+ font, around the right hand edge of a circle.
+
+ \snippet doc/src/snippets/plaintextlayout/window.cpp 0
+
+ We create a text layout, specifying the text string we want to display
+ and the font to use. We ensure that the text we supplied is formatted
+ correctly by obtaining text lines from the text format, and wrapping
+ the remaining text using the available space. The lines are positioned
+ as we move down the page.
+
+ The formatted text can be drawn onto a paint device; in the above code,
+ the text is drawn directly onto a widget.
+ */
+
+ /*!
+ \page richtext-common-tasks.html
+ \contentspage richtext.html Contents
+ \previouspage Document Layouts
+ \nextpage Advanced Rich Text Processing
+
+ \title Common Rich Text Editing Tasks
+
+ \tableofcontents
+
+ There are a number of tasks that are often performed by developers
+ when editing and processing text documents using Qt. These include the use
+ of display widgets such as QTextBrowser and QTextEdit, creation of
+ documents with QTextDocument, editing using a QTextCursor, and
+ exporting the document structure.
+ This document outlines some of the more common ways of using the rich
+ text classes to perform these tasks, showing convenient patterns that can
+ be reused in your own applications.
+
+ \section1 Using QTextEdit
+
+ A text editor widget can be constructed and used to display HTML in the
+ following way:
+
+ \snippet doc/src/snippets/code/doc_src_richtext.qdoc 2
+
+ By default, the text editor contains a document with a root frame, inside
+ which is an empty text block. This document can be obtained so that it can
+ be modified directly by the application:
+
+ \snippet doc/src/snippets/code/doc_src_richtext.qdoc 3
+
+ The text editor's cursor may also be used to edit a document:
+
+ \snippet doc/src/snippets/code/doc_src_richtext.qdoc 4
+
+ Although a document can be edited using many cursors at once, a QTextEdit
+ only displays a single cursor at a time. Therefore, if we want to update the
+ editor to display a particular cursor or its selection, we need to set the
+ editor's cursor after we have modified the document:
+
+ \snippet doc/src/snippets/code/doc_src_richtext.qdoc 5
+
+ \section1 Selecting Text
+
+ Text is selected by moving the cursor using operations that are similar to
+ those performed by a user in a text editor. To select text between two
+ points in the document, we need to position the cursor at the first point
+ then move it using a special mode (\l{QTextCursor::MoveMode}) with a
+ move operation (\l{QTextCursor::MoveOperation}).
+ When we select the text, we leave the selection anchor at the old cursor
+ position just as the user might do by holding down the Shift key when
+ selecting text:
+
+ \snippet doc/src/snippets/textdocument-selections/mainwindow.cpp 1
+
+ In the above code, a whole word is selected using this method. QTextCursor
+ provides a number of common move operations for selecting individual
+ characters, words, lines, and whole blocks.
+
+ \section1 Finding Text
+
+ QTextDocument provides a cursor-based interface for searching, making
+ it easy to find and modify text in the style of a text editor. The following
+ code finds all the instances of a particular word in a document, and changes
+ the color of each:
+
+ \snippet doc/src/snippets/textdocument-find/main.cpp 0
+ \snippet doc/src/snippets/textdocument-find/main.cpp 1
+
+ Note that the cursor does not have to be moved after each search and replace
+ operation; it is always positioned at the end of the word that was just
+ replaced.
+
+ \section1 Printing Documents
+
+ QTextEdit is designed for the display of large rich text documents that are
+ read on screen, rendering them in the same way as a web browser. As a result,
+ it does not automatically break the contents of the document into page-sized
+ pieces that are suitable for printing.
+
+ QTextDocument provides a \l{QTextDocument::print()}{print()} function to
+ allow documents to be printed using the QPrinter class. The following code
+ shows how to prepare a document in a QTextEdit for printing with a QPrinter:
+
+ \snippet doc/src/snippets/textdocument-printing/mainwindow.cpp 0
+
+ The document is obtained from the text editor, and a QPrinter is constructed
+ then configured using a QPrintDialog. If the user accepts the printer's
+ configuration then the document is formatted and printed using the
+ \l{QTextDocument::print()}{print()} function.
+*/
+
+/*!
+ \page richtext-advanced-processing.html
+ \contentspage richtext.html Contents
+ \previouspage Common Rich Text Editing Tasks
+ \nextpage Supported HTML Subset
+
+ \title Advanced Rich Text Processing
+
+ \section1 Handling Large Files
+
+ Qt does not limit the size of files that are used for text
+ processing. In most cases, this will not present a problem. For
+ especially large files, however, you might experience that your
+ application will become unresponsive or that you will run out of
+ memory. The size of the files you can load depends on your
+ hardware and on Qt's and your own application's implementation.
+
+ If you are faced with this problem, we recommend that you address the
+ following issues:
+
+ \list
+ \o You should consider breaking up large paragraphs into smaller
+ ones as Qt handles small paragraphs better. You could also
+ insert line breaks at regular intervals, which will look the
+ same as one large paragraph in a QTextEdit.
+ \o You can reduce the amount of blocks in a QTextDocument with
+ \l{QTextDocument::}{maximumBlockCount()}. The document is only
+ as large as the number of blocks as far as QTextEdit is concerned.
+ \o When adding text to a text edit, it is an advantage to add it
+ in an edit block (see example below). The result is that the
+ text edit does not need to build the entire document structure at once.
+ \endlist
+
+ We give an example of the latter technique from the list. We assume that
+ the text edit is visible.
+
+ \snippet doc/src/snippets/code/doc_src_richtext.qdoc 6
+
+ \omit
+ Ideas for other sections:
+
+ * Hiding QTextBlock elements.
+ * Changing the word wrapping mode in QTextEdit. Custom word wrapping?
+ \endomit
+*/
+
+/*!
+ \page richtext-html-subset.html
+ \title Supported HTML Subset
+ \brief Describes the support for HTML markup in text widgets.
+
+ \contentspage richtext.html Contents
+ \previouspage Common Rich Text Editing Tasks
+
+ Qt's text widgets are able to display rich text, specified using a subset of \l{HTML 4}
+ markup. Widgets that use QTextDocument, such as QLabel and QTextEdit, are able to display
+ rich text specified in this way.
+
+ \tableofcontents
+
+ \section1 Using HTML Markup in Text Widgets
+
+ Widgets automatically detect HTML markup and display rich text accordingly. For example,
+ setting a label's \l{QLabel::}{text} property with the string \c{"<b>Hello</b> <i>Qt!</i>"}
+ will result in the label displaying text like this: \bold{Hello} \e{Qt!}
+
+ When HTML markup is used for text, Qt follows the rules defined by the \l{HTML 4}
+ specification. This includes default properties for text layout, such as the
+ direction of the text flow (left-to-right) which can be changed by applying the
+ \l{#Block Attributes}{\c dir} attribute to blocks of text.
+
+ \section1 Supported Tags
+
+ The following table lists the HTML tags supported by Qt's
+ \l{Rich Text Processing}{rich text} engine:
+
+ \table
+ \header \o Tag
+ \o Description
+ \o Comment
+ \row \o \c a
+ \o Anchor or link
+ \o Supports the \c href and \c name attributes.
+ \row \o \c address
+ \o Address
+ \o
+ \row \o \c b
+ \o Bold
+ \o
+ \row \o \c big
+ \o Larger font
+ \o
+ \row \o \c blockquote
+ \o Indented paragraph
+ \o
+ \row \o \c body
+ \o Document body
+ \o Supports the \c bgcolor attribute, which
+ can be a Qt \l{QColor::setNamedColor()}{color name}
+ or a \c #RRGGBB color specification.
+ \row \o \c br
+ \o Line break
+ \o
+ \row \o \c center
+ \o Centered paragraph
+ \o
+ \row \o \c cite
+ \o Inline citation
+ \o Same as \c i.
+ \row \o \c code
+ \o Code
+ \o Same as \c tt.
+ \row \o \c dd
+ \o Definition data
+ \o
+ \row \o \c dfn
+ \o Definition
+ \o Same as \c i.
+ \row \o \c div
+ \o Document division
+ \o Supports the standard \l{block attributes}.
+ \row \o \c dl
+ \o Definition list
+ \o Supports the standard \l{block attributes}.
+ \row \o \c dt
+ \o Definition term
+ \o Supports the standard \l{block attributes}.
+ \row \o \c em
+ \o Emphasized
+ \o Same as \c i.
+ \row \o \c font
+ \o Font size, family, and/or color
+ \o Supports the following attributes:
+ \c size, \c face, and \c color (Qt
+ \l{QColor::setNamedColor()}{color names} or
+ \c #RRGGBB).
+ \row \o \c h1
+ \o Level 1 heading
+ \o Supports the standard \l{block attributes}.
+ \row \o \c h2
+ \o Level 2 heading
+ \o Supports the standard \l{block attributes}.
+ \row \o \c h3
+ \o Level 3 heading
+ \o Supports the standard \l{block attributes}.
+ \row \o \c h4
+ \o Level 4 heading
+ \o Supports the standard \l{block attributes}.
+ \row \o \c h5
+ \o Level 5 heading
+ \o Supports the standard \l{block attributes}.
+ \row \o \c h6
+ \o Level 6 heading
+ \o Supports the standard \l{block attributes}.
+ \row \o \c head
+ \o Document header
+ \o
+ \row \o \c hr
+ \o Horizontal line
+ \o Supports the \c width attribute, which can
+ be specified as an absolute or relative (\c %) value.
+ \row \o \c html
+ \o HTML document
+ \o
+ \row \o \c i
+ \o Italic
+ \o
+ \row \o \c img
+ \o Image
+ \o Supports the \c src, \c source
+ (for Qt 3 compatibility), \c width, and \c height
+ attributes.
+ \row \o \c kbd
+ \o User-entered text
+ \o
+ \row \o \c meta
+ \o Meta-information
+ \o If a text encoding is specified using the \c{meta} tag,
+ it is picked up by Qt::codecForHtml().
+ Likewise, if an encoding is specified to
+ QTextDocument::toHtml(), the encoding is stored using
+ a \c meta tag, for example:
+
+ \snippet doc/src/snippets/code/doc_src_richtext.qdoc 7
+
+ \row \o \c li
+ \o List item
+ \o
+ \row \o \c nobr
+ \o Non-breakable text
+ \o
+ \row \o \c ol
+ \o Ordered list
+ \o Supports the standard \l{list attributes}.
+ \row \o \c p
+ \o Paragraph
+ \o Left-aligned by default. Supports the standard
+ \l{block attributes}.
+ \row \o \c pre
+ \o Preformated text
+ \o
+ \row \o \c qt
+ \o Qt rich-text document
+ \o Synonym for \c html. Provided for compatibility with
+ earlier versions of Qt.
+ \row \o \c s
+ \o Strikethrough
+ \o
+ \row \o \c samp
+ \o Sample code
+ \o Same as \c tt.
+ \row \o \c small
+ \o Small font
+ \o
+ \row \o \c span
+ \o Grouped elements
+ \o
+ \row \o \c strong
+ \o Strong
+ \o Same as \c b.
+ \row \o \c sub
+ \o Subscript
+ \o
+ \row \o \c sup
+ \o Superscript
+ \o
+ \row \o \c table
+ \o Table
+ \o Supports the following attributes: \c border,
+ \c bgcolor (Qt \l{QColor::setNamedColor()}{color names}
+ or \c #RRGGBB), \c cellspacing, \c cellpadding,
+ \c width (absolute or relative), and \c height.
+ \row \o \c tbody
+ \o Table body
+ \o Does nothing.
+ \row \o \c td
+ \o Table data cell
+ \o Supports the standard \l{table cell attributes}.
+ \row \o \c tfoot
+ \o Table footer
+ \o Does nothing.
+ \row \o \c th
+ \o Table header cell
+ \o Supports the standard \l{table cell attributes}.
+ \row \o \c thead
+ \o Table header
+ \o If the \c thead tag is specified, it is used when printing tables
+ that span multiple pages.
+ \row \o \c title
+ \o Document title
+ \o The value specified using the \c
+ title tag is available through
+ QTextDocument::metaInformation().
+ \row \o \c tr
+ \o Table row
+ \o Supports the \c bgcolor attribute, which
+ can be a Qt \l{QColor::setNamedColor()}{color name}
+ or a \c #RRGGBB color specification.
+ \row \o \c tt
+ \o Typewrite font
+ \o
+ \row \o \c u
+ \o Underlined
+ \o
+ \row \o \c ul
+ \o Unordered list
+ \o Supports the standard \l{list attributes}.
+ \row \o \c var
+ \o Variable
+ \o Same as \c i.
+ \endtable
+
+ \section1 Block Attributes
+
+ The following attributes are supported by the \c div, \c dl, \c
+ dt, \c h1, \c h2, \c h3, \c h4, \c h5, \c h6, \c p tags:
+
+ \list
+ \o \c align (\c left, \c right, \c center, \c justify)
+ \o \c dir (\c ltr, \c rtl)
+ \endlist
+
+ \section1 List Attributes
+
+ The following attribute is supported by the \c ol and \c ul tags:
+
+ \list
+ \o \c type (\c 1, \c a, \c A, \c square, \c disc, \c circle)
+ \endlist
+
+ \section1 Table Cell Attributes
+
+ The following attributes are supported by the \c td and \c th
+ tags:
+
+ \list
+ \o \c width (absolute, relative, or no-value)
+ \o \c bgcolor (Qt \l{QColor::setNamedColor()}{color names} or \c #RRGGBB)
+ \o \c colspan
+ \o \c rowspan
+ \o \c align (\c left, \c right, \c center, \c justify)
+ \o \c valign (\c top, \c middle, \c bottom)
+ \endlist
+
+ \section1 CSS Properties
+ The following table lists the CSS properties supported by Qt's
+ \l{Rich Text Processing}{rich text} engine:
+
+ \table
+ \header \o Property
+ \o Values
+ \o Description
+ \row
+ \o \c background-color
+ \o <color>
+ \o Background color for elements
+ \row
+ \o \c background-image
+ \o <uri>
+ \o Background image for elements
+ \row \o \c color
+ \o <color>
+ \o Text foreground color
+ \row \o \c font-family
+ \o <family name>
+ \o Font family name
+ \row \o \c font-size
+ \o [ small | medium | large | x-large | xx-large ] | <size>pt | <size>px
+ \o Font size relative to the document font, or specified in points or pixels
+ \row \o \c font-style
+ \o [ normal | italic | oblique ]
+ \o
+ \row \o \c font-weight
+ \o [ normal | bold | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 ]
+ \o Specifies the font weight used for text, where \c normal and \c bold
+ are mapped to the corresponding QFont weights. Numeric values are
+ 8 times the equivalent QFont weight values.
+ \row \o \c text-decoration
+ \o none | [ underline || overline || line-through ]
+ \o Additional text effects
+ \row \o \c font
+ \o [ [ <'font-style'> || <'font-weight'> ]? <'font-size'> <'font-family'> ]
+ \o Font shorthand property
+ \row \o \c text-indent
+ \o <length>px
+ \o First line text indentation in pixels
+ \row \o \c white-space
+ \o normal | pre | nowrap | pre-wrap
+ \o Declares how whitespace in HTML is handled.
+ \row \o \c margin-top
+ \o <length>px
+ \o Top paragraph margin in pixels
+ \row \o \c margin-bottom
+ \o <length>px
+ \o Bottom paragraph margin in pixels
+ \row \o \c margin-left
+ \o <length>px
+ \o Left paragraph margin in pixels
+ \row \o \c margin-right
+ \o <length>px
+ \o Right paragraph margin in pixels
+ \row \o \c padding-top
+ \o <length>px
+ \o Top table cell padding in pixels
+ \row \o \c padding-bottom
+ \o <length>px
+ \o Bottom table cell padding in pixels
+ \row \o \c padding-left
+ \o <length>px
+ \o Left table cell padding in pixels
+ \row \o \c padding-right
+ \o <length>px
+ \o Right table cell padding in pixels
+ \row \o \c padding
+ \o <length>px
+ \o Shorthand for setting all the padding properties at once.
+ \row \o \c vertical-align
+ \o baseline | sub | super | middle | top | bottom
+ \o Vertical text alignment. For vertical alignment in text table cells only middle, top, and bottom apply.
+ \row \o \c border-color
+ \o <color>
+ \o Border color for text tables.
+ \row \o \c border-style
+ \o none | dotted | dashed | dot-dash | dot-dot-dash | solid | double | groove | ridge | inset | outset
+ \o Border style for text tables.
+ \row \o \c background
+ \o [ <'background-color'> || <'background-image'> ]
+ \o Background shorthand property
+ \row \o \c page-break-before
+ \o [ auto | always ]
+ \o Make it possible to enforce a page break before the paragraph/table
+ \row \o \c page-break-after
+ \o [ auto | always ]
+ \o Make it possible to enforce a page break after the paragraph/table
+ \row \o float
+ \o [ left | right | none ]
+ \o Specifies where an image or a text will be placed in another element. Note that the \c float property is
+ only supported for tables and images.
+ \row \o \c text-transform
+ \o [ uppercase | lowercase ]
+ \o Select the transformation that will be performed on the text prior to displaying it.
+ \row \o \c font-variant
+ \o small-caps
+ \o Perform the smallcaps transformation on the text prior to displaying it.
+ \row \o \c word-spacing
+ \o <width>px
+ \o Specifies an alternate spacing between each word.
+ \endtable
+
+ \section1 Supported CSS Selectors
+
+ All CSS 2.1 selector classes are supported except pseudo-class selectors such
+ as \c{:first-child}, \c{:visited} and \c{:hover}.
+
+*/
diff --git a/doc/src/frameworks-technologies/statemachine.qdoc b/doc/src/frameworks-technologies/statemachine.qdoc
new file mode 100644
index 0000000..7b8e91d
--- /dev/null
+++ b/doc/src/frameworks-technologies/statemachine.qdoc
@@ -0,0 +1,548 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group statemachine
+ \title State Machine Classes
+*/
+
+/*!
+ \page statemachine-api.html
+ \title The State Machine Framework
+ \brief An overview of the State Machine framework for constructing and executing state graphs.
+
+ \ingroup frameworks-technologies
+
+ \tableofcontents
+
+ The State Machine framework provides classes for creating and executing
+ state graphs. The concepts and notation are based on those from Harel's
+ \l{Statecharts: A visual formalism for complex systems}{Statecharts}, which
+ is also the basis of UML state diagrams. The semantics of state machine
+ execution are based on \l{State Chart XML: State Machine Notation for
+ Control Abstraction}{State Chart XML (SCXML)}.
+
+ Statecharts provide a graphical way of modeling how a system reacts to
+ stimuli. This is done by defining the possible \e states that the system can
+ be in, and how the system can move from one state to another (\e transitions
+ between states). A key characteristic of event-driven systems (such as Qt
+ applications) is that behavior often depends not only on the last or current
+ event, but also the events that preceded it. With statecharts, this
+ information is easy to express.
+
+ The State Machine framework provides an API and execution model that can be
+ used to effectively embed the elements and semantics of statecharts in Qt
+ applications. The framework integrates tightly with Qt's meta-object system;
+ for example, transitions between states can be triggered by signals, and
+ states can be configured to set properties and invoke methods on QObjects.
+ Qt's event system is used to drive the state machines.
+
+ \section1 Classes in the State Machine Framework
+
+ These classes are provided by qt for creating event-driven state machines.
+
+ \annotatedlist statemachine
+
+ \section1 A Simple State Machine
+
+ To demonstrate the core functionality of the State Machine API, let's look
+ at a small example: A state machine with three states, \c s1, \c s2 and \c
+ s3. The state machine is controlled by a single QPushButton; when the button
+ is clicked, the machine transitions to another state. Initially, the state
+ machine is in state \c s1. The statechart for this machine is as follows:
+
+ \img statemachine-button.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ The following snippet shows the code needed to create such a state machine.
+ First, we create the state machine and states:
+
+ \snippet doc/src/snippets/statemachine/main.cpp 0
+
+ Then, we create the transitions by using the QState::addTransition()
+ function:
+
+ \snippet doc/src/snippets/statemachine/main.cpp 1
+
+ Next, we add the states to the machine and set the machine's initial state:
+
+ \snippet doc/src/snippets/statemachine/main.cpp 2
+
+ Finally, we start the state machine:
+
+ \snippet doc/src/snippets/statemachine/main.cpp 3
+
+ The state machine executes asynchronously, i.e. it becomes part of your
+ application's event loop.
+
+ \section1 Doing Useful Work on State Entry and Exit
+
+ The above state machine merely transitions from one state to another, it
+ doesn't perform any operations. The QState::assignProperty() function can be
+ used to have a state set a property of a QObject when the state is
+ entered. In the following snippet, the value that should be assigned to a
+ QLabel's text property is specified for each state:
+
+ \snippet doc/src/snippets/statemachine/main.cpp 4
+
+ When any of the states is entered, the label's text will be changed
+ accordingly.
+
+ The QState::entered() signal is emitted when the state is entered, and the
+ QState::exited() signal is emitted when the state is exited. In the
+ following snippet, the button's showMaximized() slot will be called when
+ state \c s3 is entered, and the button's showMinimized() slot will be called
+ when \c s3 is exited:
+
+ \snippet doc/src/snippets/statemachine/main.cpp 5
+
+ Custom states can reimplement QAbstractState::onEntry() and
+ QAbstractState::onExit().
+
+ \section1 State Machines That Finish
+
+ The state machine defined in the previous section never finishes. In order
+ for a state machine to be able to finish, it needs to have a top-level \e
+ final state (QFinalState object). When the state machine enters a top-level
+ final state, the machine will emit the QStateMachine::finished() signal and
+ halt.
+
+ All you need to do to introduce a final state in the graph is create a
+ QFinalState object and use it as the target of one or more transitions.
+
+ \section1 Sharing Transitions By Grouping States
+
+ Assume we wanted the user to be able to quit the application at any time by
+ clicking a Quit button. In order to achieve this, we need to create a final
+ state and make it the target of a transition associated with the Quit
+ button's clicked() signal. We could add a transition from each of \c s1, \c
+ s2 and \c s3; however, this seems redundant, and one would also have to
+ remember to add such a transition from every new state that is added in the
+ future.
+
+ We can achieve the same behavior (namely that clicking the Quit button quits
+ the state machine, regardless of which state the state machine is in) by
+ grouping states \c s1, \c s2 and \c s3. This is done by creating a new
+ top-level state and making the three original states children of the new
+ state. The following diagram shows the new state machine.
+
+ \img statemachine-button-nested.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ The three original states have been renamed \c s11, \c s12 and \c s13 to
+ reflect that they are now children of the new top-level state, \c s1. Child
+ states implicitly inherit the transitions of their parent state. This means
+ it is now sufficient to add a single transition from \c s1 to the final
+ state \c s2. New states added to \c s1 will also automatically inherit this
+ transition.
+
+ All that's needed to group states is to specify the proper parent when the
+ state is created. You also need to specify which of the child states is the
+ initial one (i.e. which child state the state machine should enter when the
+ parent state is the target of a transition).
+
+ \snippet doc/src/snippets/statemachine/main2.cpp 0
+
+ \snippet doc/src/snippets/statemachine/main2.cpp 1
+
+ In this case we want the application to quit when the state machine is
+ finished, so the machine's finished() signal is connected to the
+ application's quit() slot.
+
+ A child state can override an inherited transition. For example, the
+ following code adds a transition that effectively causes the Quit button to
+ be ignored when the state machine is in state \c s12.
+
+ \snippet doc/src/snippets/statemachine/main2.cpp 2
+
+ A transition can have any state as its target, i.e. the target state does
+ not have to be on the same level in the state hierarchy as the source state.
+
+ \section1 Using History States to Save and Restore the Current State
+
+ Imagine that we wanted to add an "interrupt" mechanism to the example
+ discussed in the previous section; the user should be able to click a button
+ to have the state machine perform some non-related task, after which the
+ state machine should resume whatever it was doing before (i.e. return to the
+ old state, which is one of \c s11, \c s12 and \c s13 in this case).
+
+ Such behavior can easily be modeled using \e{history states}. A history
+ state (QHistoryState object) is a pseudo-state that represents the child
+ state that the parent state was in the last time the parent state was
+ exited.
+
+ A history state is created as a child of the state for which we wish to
+ record the current child state; when the state machine detects the presence
+ of such a state at runtime, it automatically records the current (real)
+ child state when the parent state is exited. A transition to the history
+ state is in fact a transition to the child state that the state machine had
+ previously saved; the state machine automatically "forwards" the transition
+ to the real child state.
+
+ The following diagram shows the state machine after the interrupt mechanism
+ has been added.
+
+ \img statemachine-button-history.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ The following code shows how it can be implemented; in this example we
+ simply display a message box when \c s3 is entered, then immediately return
+ to the previous child state of \c s1 via the history state.
+
+ \snippet doc/src/snippets/statemachine/main2.cpp 3
+
+ \section1 Using Parallel States to Avoid a Combinatorial Explosion of States
+
+ Assume that you wanted to model a set of mutually exclusive properties of a
+ car in a single state machine. Let's say the properties we are interested in
+ are Clean vs Dirty, and Moving vs Not moving. It would take four mutually
+ exclusive states and eight transitions to be able to represent and freely
+ move between all possible combinations.
+
+ \img statemachine-nonparallel.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ If we added a third property (say, Red vs Blue), the total number of states
+ would double, to eight; and if we added a fourth property (say, Enclosed vs
+ Convertible), the total number of states would double again, to 16.
+
+ Using parallel states, the total number of states and transitions grows
+ linearly as we add more properties, instead of exponentially. Furthermore,
+ states can be added to or removed from the parallel state without affecting
+ any of their sibling states.
+
+ \img statemachine-parallel.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ To create a parallel state group, pass QState::ParallelStates to the QState
+ constructor.
+
+ \snippet doc/src/snippets/statemachine/main3.cpp 0
+
+ When a parallel state group is entered, all its child states will be
+ simultaneously entered. Transitions within the individual child states
+ operate normally. However, any of the child states may take a transition
+ outside the parent state. When this happens, the parent state and all of its
+ child states are exited.
+
+ \section1 Detecting that a Composite State has Finished
+
+ A child state can be final (a QFinalState object); when a final child state
+ is entered, the parent state emits the QState::finished() signal. The
+ following diagram shows a composite state \c s1 which does some processing
+ before entering a final state:
+
+ \img statemachine-finished.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ When \c s1 's final state is entered, \c s1 will automatically emit
+ finished(). We use a signal transition to cause this event to trigger a
+ state change:
+
+ \snippet doc/src/snippets/statemachine/main3.cpp 1
+
+ Using final states in composite states is useful when you want to hide the
+ internal details of a composite state; i.e. the only thing the outside world
+ should be able to do is enter the state, and get a notification when the
+ state has completed its work. This is a very powerful abstraction and
+ encapsulation mechanism when building complex (deeply nested) state
+ machines. (In the above example, you could of course create a transition
+ directly from \c s1 's \c done state rather than relying on \c s1 's
+ finished() signal, but with the consequence that implementation details of
+ \c s1 are exposed and depended on).
+
+ For parallel state groups, the QState::finished() signal is emitted when \e
+ all the child states have entered final states.
+
+ \section1 Events, Transitions and Guards
+
+ A QStateMachine runs its own event loop. For signal transitions
+ (QSignalTransition objects), QStateMachine automatically posts a
+ QSignalEvent to itself when it intercepts the corresponding signal;
+ similarly, for QObject event transitions (QEventTransition objects) a
+ QWrappedEvent is posted.
+
+ You can post your own events to the state machine using
+ QStateMachine::postEvent().
+
+ When posting a custom event to the state machine, you typically also have
+ one or more custom transitions that can be triggered from events of that
+ type. To create such a transition, you subclass QAbstractTransition and
+ reimplement QAbstractTransition::eventTest(), where you check if an event
+ matches your event type (and optionally other criteria, e.g. attributes of
+ the event object).
+
+ Here we define our own custom event type, \c StringEvent, for posting
+ strings to the state machine:
+
+ \snippet doc/src/snippets/statemachine/main4.cpp 0
+
+ Next, we define a transition that only triggers when the event's string
+ matches a particular string (a \e guarded transition):
+
+ \snippet doc/src/snippets/statemachine/main4.cpp 1
+
+ In the eventTest() reimplementation, we first check if the event type is the
+ desired one; if so, we cast the event to a StringEvent and perform the
+ string comparison.
+
+ The following is a statechart that uses the custom event and transition:
+
+ \img statemachine-customevents.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ Here's what the implementation of the statechart looks like:
+
+ \snippet doc/src/snippets/statemachine/main4.cpp 2
+
+ Once the machine is started, we can post events to it.
+
+ \snippet doc/src/snippets/statemachine/main4.cpp 3
+
+ An event that is not handled by any relevant transition will be silently
+ consumed by the state machine. It can be useful to group states and provide
+ a default handling of such events; for example, as illustrated in the
+ following statechart:
+
+ \img statemachine-customevents2.png
+ \omit
+ \caption This is a caption
+ \endomit
+
+ For deeply nested statecharts, you can add such "fallback" transitions at
+ the level of granularity that's most appropriate.
+
+ \section1 Using Restore Policy To Automatically Restore Properties
+
+ In some state machines it can be useful to focus the attention on assigning properties in states,
+ not on restoring them when the state is no longer active. If you know that a property should
+ always be restored to its initial value when the machine enters a state that does not explicitly
+ give the property a value, you can set the global restore policy to
+ QStateMachine::RestoreProperties.
+
+ \code
+ QStateMachine machine;
+ machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);
+ \endcode
+
+ When this restore policy is set, the machine will automatically restore all properties. If it
+ enters a state where a given property is not set, it will first search the hierarchy of ancestors
+ to see if the property is defined there. If it is, the property will be restored to the value
+ defined by the closest ancestor. If not, it will be restored to its initial value (i.e. the
+ value of the property before any property assignments in states were executed.)
+
+ Take the following code:
+ \code
+ QStateMachine machine;
+ machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);
+
+ QState *s1 = new QState();
+ s1->assignProperty(object, "fooBar", 1.0);
+ machine.addState(s1);
+ machine.setInitialState(s1);
+
+ QState *s2 = new QState();
+ machine.addState(s2);
+ \endcode
+
+ Lets say the property \c fooBar is 0.0 when the machine starts. When the machine is in state
+ \c s1, the property will be 1.0, since the state explicitly assigns this value to it. When the
+ machine is in state \c s2, no value is explicitly defined for the property, so it will implicitly
+ be restored to 0.0.
+
+ If we are using nested states, the parent defines a value for the property which is inherited by
+ all descendants that do not explicitly assign a value to the property.
+ \code
+ QStateMachine machine;
+ machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);
+
+ QState *s1 = new QState();
+ s1->assignProperty(object, "fooBar", 1.0);
+ machine.addState(s1);
+ machine.setInitialState(s1);
+
+ QState *s2 = new QState(s1);
+ s2->assignProperty(object, "fooBar", 2.0);
+ s1->setInitialState(s2);
+
+ QState *s3 = new QState(s1);
+ \endcode
+
+ Here \c s1 has two children: \c s2 and \c s3. When \c s2 is entered, the property \c fooBar
+ will have the value 2.0, since this is explicitly defined for the state. When the machine is in
+ state \c s3, no value is defined for the state, but \c s1 defines the property to be 1.0, so this
+ is the value that will be assigned to \c fooBar.
+
+ \section1 Animating Property Assignments
+
+ The State Machine API connects with the Animation API in Qt to allow automatically animating
+ properties as they are assigned in states.
+
+ Say we have the following code:
+ \code
+ QState *s1 = new QState();
+ QState *s2 = new QState();
+
+ s1->assignProperty(button, "geometry", QRectF(0, 0, 50, 50));
+ s2->assignProperty(button, "geometry", QRectF(0, 0, 100, 100));
+
+ s1->addTransition(button, SIGNAL(clicked()), s2);
+ \endcode
+
+ Here we define two states of a user interface. In \c s1 the \c button is small, and in \c s2
+ it is bigger. If we click the button to transition from \c s1 to \c s2, the geometry of the button
+ will be set immediately when a given state has been entered. If we want the transition to be
+ smooth, however, all we need to do is make a QPropertyAnimation and add this to the transition
+ object.
+
+ \code
+ QState *s1 = new QState();
+ QState *s2 = new QState();
+
+ s1->assignProperty(button, "geometry", QRectF(0, 0, 50, 50));
+ s2->assignProperty(button, "geometry", QRectF(0, 0, 100, 100));
+
+ QSignalTransition *transition = s1->addTransition(button, SIGNAL(clicked()), s2);
+ transition->addAnimation(new QPropertyAnimation(button, "geometry"));
+ \endcode
+
+ Adding an animation for the property in question means that the property assignment will no
+ longer take immediate effect when the state has been entered. Instead, the animation will start
+ playing when the state has been entered and smoothly animate the property assignment. Since we
+ do not set the start value or end value of the animation, these will be set implicitly. The
+ start value of the animation will be the property's current value when the animation starts, and
+ the end value will be set based on the property assignments defined for the state.
+
+ If the global restore policy of the state machine is set to QStateMachine::RestoreProperties,
+ it is possible to also add animations for the property restorations.
+
+ \section1 Detecting That All Properties Have Been Set In A State
+
+ When animations are used to assign properties, a state no longer defines the exact values that a
+ property will have when the machine is in the given state. While the animation is running, the
+ property can potentially have any value, depending on the animation.
+
+ In some cases, it can be useful to be able to detect when the property has actually been assigned
+ the value defined by a state. For this, we can use the state's polished() signal.
+ \code
+ QState *s1 = new QState();
+ s1->assignProperty(button, "geometry", QRectF(0, 0, 50, 50));
+
+ QState *s2 = new QState();
+
+ s1->addTransition(s1, SIGNAL(polished()), s2);
+ \endcode
+
+ The machine will be in state \c s1 until the \c geometry property has been set. Then it will
+ immediately transition into \c s2. If the transition into \c s1 has an animation for the \c
+ geometry property, then the machine will stay in \c s1 until the animation has finished. If there
+ is no animation, it will simply set the property and immediately enter state \c s2.
+
+ Either way, when the machine is in state \c s2, the property \c geometry has been assigned the
+ defined value.
+
+ If the global restore policy is set to QStateMachine::RestoreProperties, the state will not emit
+ the polished() signal until these have been executed as well.
+
+ \section1 What happens if a state is exited before the animation has finished
+
+ If a state has property assignments, and the transition into the state has animations for the
+ properties, the state can potentially be exited before the properties have been assigned to the
+ values defines by the state. This is true in particular when there are transitions out from the
+ state that do not depend on the state being polished, as described in the previous section.
+
+ The State Machine API guarantees that a property assigned by the state machine either:
+ \list
+ \o Has a value explicitly assigned to the property.
+ \o Is currently being animated into a value explicitly assigned to the property.
+ \endlist
+
+ When a state is exited prior to the animation finishing, the behavior of the state machine depends
+ on the target state of the transition. If the target state explicitly assigns a value to the
+ property, no additional action will be taken. The property will be assigned the value defined by
+ the target state.
+
+ If the target state does not assign any value to the property, there are two
+ options: By default, the property will be assigned the value defined by the state it is leaving
+ (the value it would have been assigned if the animation had been permitted to finish playing.) If
+ a global restore policy is set, however, this will take precedence, and the property will be
+ restored as usual.
+
+ \section1 Default Animations
+
+ As described earlier, you can add animations to transitions to make sure property assignments
+ in the target state are animated. If you want a specific animation to be used for a given property
+ regardless of which transition is taken, you can add it as a default animation to the state
+ machine. This is in particular useful when the properties assigned (or restored) by specific
+ states is not known when the machine is constructed.
+
+ \code
+ QState *s1 = new QState();
+ QState *s2 = new QState();
+
+ s2->assignProperty(object, "fooBar", 2.0);
+ s1->addTransition(s2);
+
+ QStateMachine machine;
+ machine.setInitialState(s1);
+ machine.addDefaultAnimation(new QPropertyAnimation(object, "fooBar"));
+ \endcode
+
+ When the machine is in state \c s2, the machine will play the default animation for the
+ property \c fooBar since this property is assigned by \c s2.
+
+ Note that animations explicitly set on transitions will take precedence over any default
+ animation for the given property.
+*/
diff --git a/doc/src/frameworks-technologies/templates.qdoc b/doc/src/frameworks-technologies/templates.qdoc
new file mode 100644
index 0000000..3073e87
--- /dev/null
+++ b/doc/src/frameworks-technologies/templates.qdoc
@@ -0,0 +1,229 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page templates.html
+ \title Why Doesn't Qt Use Templates for Signals and Slots?
+ \brief The reasoning behind Qt's implementation of signals and slots.
+
+ Templates are a builtin mechanism in C++ that allows the compiler to
+ generate code on the fly, depending on the type of the arguments
+ passed. As such, templates are highly interesting to framework
+ creators, and we do use advanced templates in many places
+ in Qt. However, there are limitations: There are things that you can
+ easily express with templates, and there are things that are
+ impossible to express with templates. A generic vector container class
+ is easily expressible, even with partial specialisation for pointer
+ types, while a function that sets up a graphical user interface based
+ on a XML description given as a string is not expressible as
+ template. And then there is gray area in between. Things that you can
+ hack with templates at the cost of code size, readability,
+ portability, usability, extensability, robustness and ultimately
+ design beauty. Both templates and the C preprocessor can be stretched
+ to do incredibility smart and mind boggling things. But just because
+ those things can be done, does not necessarily mean doing them is the
+ right design choice.
+
+ There is an important practical challenge we have to mention: due to
+ the inadequacies of various compilers it is still not possible to
+ fully exploit the template mechanism in cross-platform
+ applications. Code unfortunately is not meant to be published in
+ books, but compiled with real-world compilers on real-world operating
+ system. Even today, many widely used C++ compilers have problems with
+ advanced templates. For example, you cannot safely rely on partial
+ template specialisation, which is essential for some non-trivial
+ problem domains. Some compilers also have limitations with regards to
+ template member functions, which make it hard to combine generic
+ programming with object orientated programming. However, we do not
+ perceive these problems as a serious limitation in our work. Even if
+ all our users had access to a fully standards compliant modern C++
+ compiler with excellent template support, we would not abandon the
+ string-based approach used by our meta object compiler for a template
+ based signals and slots system. Here are five reasons why:
+
+ \section1 Syntax matters
+
+ Syntax isn't just sugar: the syntax we use to express our algorithms can
+ significantly affect the readability and maintainability of our code.
+ The syntax used for Qt's signals and slots has proved very successful in
+ practice. The syntax is intuitive, simple to use and easy to read.
+ People learning Qt find the syntax helps them understand and utilize the
+ signals and slots concept -- despite its highly abstract and generic
+ nature. Furthermore, declaring signals in class definitions ensures that
+ the signals are protected in the sense of protected C++ member
+ functions. This helps programmers get their design right from the very
+ beginning, without even having to think about design patterns.
+
+ \section1 Code Generators are Good
+
+ Qt's \c{moc} (Meta Object Compiler) provides a clean way to go
+ beyond the compiled language's facilities. It does so by generating
+ additional C++ code which can be compiled by any standard C++ compiler.
+ The \c{moc} reads C++ source files. If it finds one or more class
+ declarations that contain the Q_OBJECT macro, it produces another C++
+ source file which contains the meta object code for those classes. The
+ C++ source file generated by the \c{moc} must be compiled and
+ linked with the implementation of the class (or it can be
+ \c{#included} into the class's source file). Typically \c{moc}
+ is not called manually, but automatically by the build system, so it
+ requires no additional effort by the programmer.
+
+ The \c{moc} is not the only code generator Qt is using. Another
+ prominent example is the \c{uic} (User Interface Compiler). It
+ takes a user interface description in XML and creates C++ code that
+ sets up the form. Outside Qt, code generators are common as well. Take
+ for example \c{rpc} and \c{idl}, that enable programs or
+ objects to communicate over process or machine boundaries. Or the vast
+ variety of scanner and parser generators, with \c{lex} and
+ \c{yacc} being the most well-known ones. They take a grammar
+ specification as input and generate code that implements a state
+ machine. The alternatives to code generators are hacked compilers,
+ proprietary languages or graphical programming tools with one-way
+ dialogs or wizards that generate obscure code during design time
+ rather than compile time. Rather than locking our customers into a
+ proprietary C++ compiler or into a particular Integrated Development
+ Environment, we enable them to use whatever tools they prefer. Instead
+ of forcing programmers to add generated code into source repositories,
+ we encourage them to add our tools to their build system: cleaner,
+ safer and more in the spirit of UNIX.
+
+
+ \section1 GUIs are Dynamic
+
+ C++ is a standarized, powerful and elaborate general-purpose language.
+ It's the only language that is exploited on such a wide range of
+ software projects, spanning every kind of application from entire
+ operating systems, database servers and high end graphics
+ applications to common desktop applications. One of the keys to C++'s
+ success is its scalable language design that focuses on maximum
+ performance and minimal memory consumption whilst still maintaining
+ ANSI C compatibility.
+
+ For all these advantages, there are some downsides. For C++, the static
+ object model is a clear disadvantage over the dynamic messaging approach
+ of Objective C when it comes to component-based graphical user interface
+ programming. What's good for a high end database server or an operating
+ system isn't necessarily the right design choice for a GUI frontend.
+ With \c{moc}, we have turned this disadvantage into an advantage,
+ and added the flexibility required to meet the challenge of safe and
+ efficient graphical user interface programming.
+
+ Our approach goes far beyond anything you can do with templates. For
+ example, we can have object properties. And we can have overloaded
+ signals and slots, which feels natural when programming in a language
+ where overloads are a key concept. Our signals add zero bytes to the
+ size of a class instance, which means we can add new signals without
+ breaking binary compatibility. Because we do not rely on excessive
+ inlining as done with templates, we can keep the code size smaller.
+ Adding new connections just expands to a simple function call rather
+ than a complex template function.
+
+ Another benefit is that we can explore an object's signals and slots at
+ runtime. We can establish connections using type-safe call-by-name,
+ without having to know the exact types of the objects we are connecting.
+ This is impossible with a template based solution. This kind of runtime
+ introspection opens up new possibilities, for example GUIs that are
+ generated and connected from Qt Designer's XML UI files.
+
+ \section1 Calling Performance is Not Everything
+
+ Qt's signals and slots implementation is not as fast as a
+ template-based solution. While emitting a signal is approximately the
+ cost of four ordinary function calls with common template
+ implementations, Qt requires effort comparable to about ten function
+ calls. This is not surprising since the Qt mechanism includes a
+ generic marshaller, introspection, queued calls between different
+ threads, and ultimately scriptability. It does not rely on excessive
+ inlining and code expansion and it provides unmatched runtime
+ safety. Qt's iterators are safe while those of faster template-based
+ systems are not. Even during the process of emitting a signal to
+ several receivers, those receivers can be deleted safely without your
+ program crashing. Without this safety, your application would
+ eventually crash with a difficult to debug free'd memory read or write
+ error.
+
+ Nonetheless, couldn't a template-based solution improve the performance
+ of an application using signals and slots? While it is true that Qt adds
+ a small overhead to the cost of calling a slot through a signal, the
+ cost of the call is only a small proportion of the entire cost of a
+ slot. Benchmarking against Qt's signals and slots system is typically
+ done with empty slots. As soon as you do anything useful in your slots,
+ for example a few simple string operations, the calling overhead becomes
+ negligible. Qt's system is so optimized that anything that requires
+ operator new or delete (for example, string operations or
+ inserting/removing something from a template container) is significantly
+ more expensive than emitting a signal.
+
+ Aside: If you have a signals and slots connection in a tight inner loop
+ of a performance critical task and you identify this connection as the
+ bottleneck, think about using the standard listener-interface pattern
+ rather than signals and slots. In cases where this occurs, you probably
+ only require a 1:1 connection anyway. For example, if you have an object
+ that downloads data from the network, it's a perfectly sensible design
+ to use a signal to indicate that the requested data arrived. But if you
+ need to send out every single byte one by one to a consumer, use a
+ listener interface rather than signals and slots.
+
+ \section1 No Limits
+
+ Because we had the \c{moc} for signals and slots, we could add
+ other useful things to it that could not be done with templates.
+ Among these are scoped translations via a generated \c{tr()}
+ function, and an advanced property system with introspection and
+ extended runtime type information. The property system alone is a
+ great advantage: a powerful and generic user interface design tool
+ like Qt Designer would be a lot harder to write - if not impossible -
+ without a powerful and introspective property system. But it does not
+ end here. We also provide a dynamic qobject_cast<T>() mechanism
+ that does not rely on the system's RTTI and thus does not share its
+ limitations. We use it to safely query interfaces from dynamically
+ loaded components. Another application domain are dynamic meta
+ objects. We can e.g. take ActiveX components and at runtime create a
+ meta object around it. Or we can export Qt components as ActiveX
+ components by exporting its meta object. You cannot do either of these
+ things with templates.
+
+ C++ with the \c{moc} essentially gives us the flexibility of
+ Objective-C or of a Java Runtime Environment, while maintaining C++'s
+ unique performance and scalability advantages. It is what makes Qt the
+ flexible and comfortable tool we have today.
+
+*/
diff --git a/doc/src/frameworks-technologies/threads.qdoc b/doc/src/frameworks-technologies/threads.qdoc
new file mode 100644
index 0000000..59b57be
--- /dev/null
+++ b/doc/src/frameworks-technologies/threads.qdoc
@@ -0,0 +1,700 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group thread
+ \title Threading Classes
+*/
+
+/*!
+ \page threads.html
+ \title Thread Support in Qt
+ \brief A detailed discussion of thread handling in Qt.
+
+ \ingroup frameworks-technologies
+
+ \nextpage Starting Threads with QThread
+
+ Qt provides thread support in the form of platform-independent
+ threading classes, a thread-safe way of posting events, and
+ signal-slot connections across threads. This makes it easy to
+ develop portable multithreaded Qt applications and take advantage
+ of multiprocessor machines. Multithreaded programming is also a
+ useful paradigm for performing time-consuming operations without
+ freezing the user interface of an application.
+
+ Earlier versions of Qt offered an option to build the library
+ without thread support. Since Qt 4.0, threads are always enabled.
+
+ \section1 Topics:
+
+ \list
+ \o \l{Recommended Reading}
+ \o \l{The Threading Classes}
+ \o \l{Starting Threads with QThread}
+ \o \l{Synchronizing Threads}
+ \o \l{Reentrancy and Thread-Safety}
+ \o \l{Threads and QObjects}
+ \o \l{Concurrent Programming}
+ \o \l{Thread-Support in Qt Modules}
+ \endlist
+
+ \section1 Recommended Reading
+
+ This document is intended for an audience that has knowledge of,
+ and experience with, multithreaded applications. If you are new
+ to threading see our Recommended Reading list:
+
+ \list
+ \o \l{Threads Primer: A Guide to Multithreaded Programming}
+ \o \l{Thread Time: The Multithreaded Programming Guide}
+ \o \l{Pthreads Programming: A POSIX Standard for Better Multiprocessing}
+ \o \l{Win32 Multithreaded Programming}
+ \endlist
+
+ \section1 The Threading Classes
+
+ These classes are relevant to threaded applications.
+
+ \annotatedlist thread
+
+\omit
+ \list
+ \o QThread provides the means to start a new thread.
+ \o QThreadStorage provides per-thread data storage.
+ \o QThreadPool manages a pool of threads that run QRunnable objects.
+ \o QRunnable is an abstract class representing a runnable object.
+ \o QMutex provides a mutual exclusion lock, or mutex.
+ \o QMutexLocker is a convenience class that automatically locks
+ and unlocks a QMutex.
+ \o QReadWriteLock provides a lock that allows simultaneous read access.
+ \o QReadLocker and QWriteLocker are convenience classes that automatically
+ lock and unlock a QReadWriteLock.
+ \o QSemaphore provides an integer semaphore (a generalization of a mutex).
+ \o QWaitCondition provides a way for threads to go to sleep until
+ woken up by another thread.
+ \o QAtomicInt provides atomic operations on integers.
+ \o QAtomicPointer provides atomic operations on pointers.
+ \endlist
+\endomit
+
+ \note Qt's threading classes are implemented with native threading APIs;
+ e.g., Win32 and pthreads. Therefore, they can be used with threads of the
+ same native API.
+*/
+
+/*!
+ \page threads-starting.html
+ \title Starting Threads with QThread
+
+ \contentspage Thread Support in Qt
+ \nextpage Synchronizing Threads
+
+ A QThread instance represents a thread and provides the means to
+ \l{QThread::start()}{start()} a thread, which will then execute the
+ reimplementation of QThread::run(). The \c run() implementation is for a
+ thread what the \c main() entry point is for the application. All code
+ executed in a call stack that starts in the \c run() function is executed
+ by the new thread, and the thread finishes when the function returns.
+ QThread emits signals to indicate that the thread started or finished
+ executing.
+
+ \section1 Creating a Thread
+
+ To create a thread, subclass QThread and reimplement its
+ \l{QThread::run()}{run()} function. For example:
+
+ \snippet doc/src/snippets/threads/threads.h 0
+ \codeline
+ \snippet doc/src/snippets/threads/threads.cpp 0
+ \snippet doc/src/snippets/threads/threads.cpp 1
+ \dots
+ \snippet doc/src/snippets/threads/threads.cpp 2
+
+ \section1 Starting a Thread
+
+ Then, create an instance of the thread object and call
+ QThread::start(). Note that you must create the QApplication (or
+ QCoreApplication) object before you can create a QThread.
+
+ The function will return immediately and the
+ main thread will continue. The code that appears in the
+ \l{QThread::run()}{run()} reimplementation will then be executed
+ in a separate thread.
+
+ Creating threads is explained in more detail in the QThread
+ documentation.
+
+ Note that QCoreApplication::exec() must always be called from the
+ main thread (the thread that executes \c{main()}), not from a
+ QThread. In GUI applications, the main thread is also called the
+ GUI thread because it's the only thread that is allowed to
+ perform GUI-related operations.
+*/
+
+/*!
+ \page threads-synchronizing.html
+ \title Synchronizing Threads
+
+ \previouspage Starting Threads with QThread
+ \contentspage Thread Support in Qt
+ \nextpage Reentrancy and Thread-Safety
+
+ The QMutex, QReadWriteLock, QSemaphore, and QWaitCondition
+ classes provide means to synchronize threads. While the main idea
+ with threads is that they should be as concurrent as possible,
+ there are points where threads must stop and wait for other
+ threads. For example, if two threads try to access the same
+ global variable simultaneously, the results are usually
+ undefined.
+
+ QMutex provides a mutually exclusive lock, or mutex. At most one
+ thread can hold the mutex at any time. If a thread tries to
+ acquire the mutex while the mutex is already locked, the thread will
+ be put to sleep until the thread that currently holds the mutex
+ unlocks it. Mutexes are often used to protect accesses to shared
+ data (i.e., data that can be accessed from multiple threads
+ simultaneously). In the \l{Reentrancy and Thread-Safety} section
+ below, we will use it to make a class thread-safe.
+
+ QReadWriteLock is similar to QMutex, except that it distinguishes
+ between "read" and "write" access to shared data and allows
+ multiple readers to access the data simultaneously. Using
+ QReadWriteLock instead of QMutex when it is possible can make
+ multithreaded programs more concurrent.
+
+ QSemaphore is a generalization of QMutex that protects a certain
+ number of identical resources. In contrast, a mutex protects
+ exactly one resource. The \l{threads/semaphores}{Semaphores}
+ example shows a typical application of semaphores: synchronizing
+ access to a circular buffer between a producer and a consumer.
+
+ QWaitCondition allows a thread to wake up other threads when some
+ condition has been met. One or many threads can block waiting for
+ a QWaitCondition to set a condition with
+ \l{QWaitCondition::wakeOne()}{wakeOne()} or
+ \l{QWaitCondition::wakeAll()}{wakeAll()}. Use
+ \l{QWaitCondition::wakeOne()}{wakeOne()} to wake one randomly
+ selected event or \l{QWaitCondition::wakeAll()}{wakeAll()} to
+ wake them all. The \l{threads/waitconditions}{Wait Conditions}
+ example shows how to solve the producer-consumer problem using
+ QWaitCondition instead of QSemaphore.
+
+ Note that Qt's synchronization classes rely on the use of properly
+ aligned pointers. For instance, you cannot use packed classes with
+ MSVC.
+*/
+
+/*!
+ \page threads-reentrancy.html
+ \title Reentrancy and Thread-Safety
+
+ \keyword reentrant
+ \keyword thread-safe
+
+ \previouspage Synchronizing Threads
+ \contentspage Thread Support in Qt
+ \nextpage Threads and QObjects
+
+ Throughout the documentation, the terms \e{reentrant} and
+ \e{thread-safe} are used to mark classes and functions to indicate
+ how they can be used in multithread applications:
+
+ \list
+ \o A \e thread-safe function can be called simultaneously from
+ multiple threads, even when the invocations use shared data,
+ because all references to the shared data are serialized.
+ \o A \e reentrant function can also be called simultaneously from
+ multiple threads, but only if each invocation uses its own data.
+ \endlist
+
+ Hence, a \e{thread-safe} function is always \e{reentrant}, but a
+ \e{reentrant} function is not always \e{thread-safe}.
+
+ By extension, a class is said to be \e{reentrant} if its member
+ functions can be called safely from multiple threads, as long as
+ each thread uses a \e{different} instance of the class. The class
+ is \e{thread-safe} if its member functions can be called safely
+ from multiple threads, even if all the threads use the \e{same}
+ instance of the class.
+
+ C++ classes are often reentrant, simply because they only access
+ their own member data. Any thread can call a member function on an
+ instance of a reentrant class, as long as no other thread can call
+ a member function on the \e{same} instance of the class at the
+ same time. For example, the \c Counter class below is reentrant:
+
+ \snippet doc/src/snippets/threads/threads.cpp 3
+ \snippet doc/src/snippets/threads/threads.cpp 4
+
+ The class isn't thread-safe, because if multiple threads try to
+ modify the data member \c n, the result is undefined. This is
+ because the \c ++ and \c -- operators aren't always atomic.
+ Indeed, they usually expand to three machine instructions:
+
+ \list 1
+ \o Load the variable's value in a register.
+ \o Increment or decrement the register's value.
+ \o Store the register's value back into main memory.
+ \endlist
+
+ If thread A and thread B load the variable's old value
+ simultaneously, increment their register, and store it back, they
+ end up overwriting each other, and the variable is incremented
+ only once!
+
+ Clearly, the access must be serialized: Thread A must perform
+ steps 1, 2, 3 without interruption (atomically) before thread B
+ can perform the same steps; or vice versa. An easy way to make
+ the class thread-safe is to protect all access to the data
+ members with a QMutex:
+
+ \snippet doc/src/snippets/threads/threads.cpp 5
+ \snippet doc/src/snippets/threads/threads.cpp 6
+
+ The QMutexLocker class automatically locks the mutex in its
+ constructor and unlocks it when the destructor is invoked, at the
+ end of the function. Locking the mutex ensures that access from
+ different threads will be serialized. The \c mutex data member is
+ declared with the \c mutable qualifier because we need to lock
+ and unlock the mutex in \c value(), which is a const function.
+
+ Many Qt classes are \e{reentrant}, but they are not made
+ \e{thread-safe}, because making them thread-safe would incur the
+ extra overhead of repeatedly locking and unlocking a QMutex. For
+ example, QString is reentrant but not thread-safe. You can safely
+ access \e{different} instances of QString from multiple threads
+ simultaneously, but you can't safely access the \e{same} instance
+ of QString from multiple threads simultaneously (unless you
+ protect the accesses yourself with a QMutex).
+
+ Some Qt classes and functions are thread-safe. These are mainly
+ the thread-related classes (e.g. QMutex) and fundamental functions
+ (e.g. QCoreApplication::postEvent()).
+
+ \note Qt Classes are only documented as \e{thread-safe} if they
+ are intended to be used by multiple threads.
+
+ \note Terminology in the multithreading domain isn't entirely
+ standardized. POSIX uses definitions of reentrant and thread-safe
+ that are somewhat different for its C APIs. When using other
+ object-oriented C++ class libraries with Qt, be sure the
+ definitions are understood.
+*/
+
+/*!
+ \page threads-qobject.html
+ \title Threads and QObjects
+
+ \previouspage Reentrancy and Thread Safety
+ \contentspage Thread Support in Qt
+ \nextpage Concurrent Programming
+
+ QThread inherits QObject. It emits signals to indicate that the
+ thread started or finished executing, and provides a few slots as
+ well.
+
+ More interesting is that \l{QObject}s can be used in multiple
+ threads, emit signals that invoke slots in other threads, and
+ post events to objects that "live" in other threads. This is
+ possible because each thread is allowed to have its own event
+ loop.
+
+ Topics:
+
+ \tableofcontents
+
+ \section1 QObject Reentrancy
+
+ QObject is reentrant. Most of its non-GUI subclasses, such as
+ QTimer, QTcpSocket, QUdpSocket, QFtp, and QProcess, are also
+ reentrant, making it possible to use these classes from multiple
+ threads simultaneously. Note that these classes are designed to be
+ created and used from within a single thread; creating an object
+ in one thread and calling its functions from another thread is not
+ guaranteed to work. There are three constraints to be aware of:
+
+ \list
+ \o \e{The child of a QObject must always be created in the thread
+ where the parent was created.} This implies, among other
+ things, that you should never pass the QThread object (\c
+ this) as the parent of an object created in the thread (since
+ the QThread object itself was created in another thread).
+
+ \o \e{Event driven objects may only be used in a single thread.}
+ Specifically, this applies to the \l{timers.html}{timer
+ mechanism} and the \l{QtNetwork}{network module}. For example,
+ you cannot start a timer or connect a socket in a thread that
+ is not the \l{QObject::thread()}{object's thread}.
+
+ \o \e{You must ensure that all objects created in a thread are
+ deleted before you delete the QThread.} This can be done
+ easily by creating the objects on the stack in your
+ \l{QThread::run()}{run()} implementation.
+ \endlist
+
+ Although QObject is reentrant, the GUI classes, notably QWidget
+ and all its subclasses, are not reentrant. They can only be used
+ from the main thread. As noted earlier, QCoreApplication::exec()
+ must also be called from that thread.
+
+ In practice, the impossibility of using GUI classes in other
+ threads than the main thread can easily be worked around by
+ putting time-consuming operations in a separate worker thread and
+ displaying the results on screen in the main thread when the
+ worker thread is finished. This is the approach used for
+ implementing the \l{threads/mandelbrot}{Mandelbrot} and
+ the \l{network/blockingfortuneclient}{Blocking Fortune Client}
+ example.
+
+ \section1 Per-Thread Event Loop
+
+ Each thread can have its own event loop. The initial thread
+ starts its event loops using QCoreApplication::exec(); other
+ threads can start an event loop using QThread::exec(). Like
+ QCoreApplication, QThread provides an
+ \l{QThread::exit()}{exit(int)} function and a
+ \l{QThread::quit()}{quit()} slot.
+
+ An event loop in a thread makes it possible for the thread to use
+ certain non-GUI Qt classes that require the presence of an event
+ loop (such as QTimer, QTcpSocket, and QProcess). It also makes it
+ possible to connect signals from any threads to slots of a
+ specific thread. This is explained in more detail in the
+ \l{Signals and Slots Across Threads} section below.
+
+ \image threadsandobjects.png Threads, objects, and event loops
+
+ A QObject instance is said to \e live in the thread in which it
+ is created. Events to that object are dispatched by that thread's
+ event loop. The thread in which a QObject lives is available using
+ QObject::thread().
+
+ Note that for QObjects that are created before QApplication,
+ QObject::thread() returns zero. This means that the main thread
+ will only handle posted events for these objects; other event
+ processing is not done at all for objects with no thread. Use the
+ QObject::moveToThread() function to change the thread affinity for
+ an object and its children (the object cannot be moved if it has a
+ parent).
+
+ Calling \c delete on a QObject from a thread other than the one
+ that \e owns the object (or accessing the object in other ways) is
+ unsafe, unless you guarantee that the object isn't processing
+ events at that moment. Use QObject::deleteLater() instead, and a
+ \l{QEvent::DeferredDelete}{DeferredDelete} event will be posted,
+ which the event loop of the object's thread will eventually pick
+ up. By default, the thread that \e owns a QObject is the thread
+ that \e creates the QObject, but not after QObject::moveToThread()
+ has been called.
+
+ If no event loop is running, events won't be delivered to the
+ object. For example, if you create a QTimer object in a thread but
+ never call \l{QThread::exec()}{exec()}, the QTimer will never emit
+ its \l{QTimer::timeout()}{timeout()} signal. Calling
+ \l{QObject::deleteLater()}{deleteLater()} won't work
+ either. (These restrictions apply to the main thread as well.)
+
+ You can manually post events to any object in any thread at any
+ time using the thread-safe function
+ QCoreApplication::postEvent(). The events will automatically be
+ dispatched by the event loop of the thread where the object was
+ created.
+
+ Event filters are supported in all threads, with the restriction
+ that the monitoring object must live in the same thread as the
+ monitored object. Similarly, QCoreApplication::sendEvent()
+ (unlike \l{QCoreApplication::postEvent()}{postEvent()}) can only
+ be used to dispatch events to objects living in the thread from
+ which the function is called.
+
+ \section1 Accessing QObject Subclasses from Other Threads
+
+ QObject and all of its subclasses are not thread-safe. This
+ includes the entire event delivery system. It is important to keep
+ in mind that the event loop may be delivering events to your
+ QObject subclass while you are accessing the object from another
+ thread.
+
+ If you are calling a function on an QObject subclass that doesn't
+ live in the current thread and the object might receive events,
+ you must protect all access to your QObject subclass's internal
+ data with a mutex; otherwise, you may experience crashes or other
+ undesired behavior.
+
+ Like other objects, QThread objects live in the thread where the
+ object was created -- \e not in the thread that is created when
+ QThread::run() is called. It is generally unsafe to provide slots
+ in your QThread subclass, unless you protect the member variables
+ with a mutex.
+
+ On the other hand, you can safely emit signals from your
+ QThread::run() implementation, because signal emission is
+ thread-safe.
+
+ \section1 Signals and Slots Across Threads
+
+ Qt supports three types of signal-slot connections:
+
+ \list
+ \o With \l{Qt::DirectConnection}{direct connections}, the
+ slot gets called immediately when the signal is emitted. The
+ slot is executed in the thread that emitted the signal (which
+ is not necessarily the thread where the receiver object
+ lives).
+
+ \o With \l{Qt::QueuedConnection}{queued connections}, the
+ slot is invoked when control returns to the event loop of the
+ thread to which the object belongs. The slot is executed in
+ the thread where the receiver object lives.
+
+ \o With \l{Qt::AutoConnection}{auto connections} (the default),
+ the behavior is the same as with direct connections if
+ the signal is emitted in the thread where the receiver lives;
+ otherwise, the behavior is that of a queued connection.
+ \endlist
+
+ The connection type can be specified by passing an additional
+ argument to \l{QObject::connect()}{connect()}. Be aware that
+ using direct connections when the sender and receiver live in
+ different threads is unsafe if an event loop is running in the
+ receiver's thread, for the same reason that calling any function
+ on an object living in another thread is unsafe.
+
+ QObject::connect() itself is thread-safe.
+
+ The \l{threads/mandelbrot}{Mandelbrot} example uses a queued
+ connection to communicate between a worker thread and the main
+ thread. To avoid freezing the main thread's event loop (and, as a
+ consequence, the application's user interface), all the
+ Mandelbrot fractal computation is done in a separate worker
+ thread. The thread emits a signal when it is done rendering the
+ fractal.
+
+ Similarly, the \l{network/blockingfortuneclient}{Blocking Fortune
+ Client} example uses a separate thread for communicating with
+ a TCP server asynchronously.
+*/
+
+/*!
+ \page threads-qtconcurrent.html
+ \title Concurrent Programming
+
+ \previouspage Threads and QObjects
+ \contentspage Thread Support in Qt
+ \nextpage Thread-Support in Qt Modules
+
+ \target qtconcurrent intro
+
+ The QtConcurrent namespace provides high-level APIs that make it
+ possible to write multi-threaded programs without using low-level
+ threading primitives such as mutexes, read-write locks, wait
+ conditions, or semaphores. Programs written with QtConcurrent
+ automatically adjust the number of threads used according to the
+ number of processor cores available. This means that applications
+ written today will continue to scale when deployed on multi-core
+ systems in the future.
+
+ QtConcurrent includes functional programming style APIs for
+ parallel list processing, including a MapReduce and FilterReduce
+ implementation for shared-memory (non-distributed) systems, and
+ classes for managing asynchronous computations in GUI
+ applications:
+
+ \list
+
+ \o QtConcurrent::map() applies a function to every item in a container,
+ modifying the items in-place.
+
+ \o QtConcurrent::mapped() is like map(), except that it returns a new
+ container with the modifications.
+
+ \o QtConcurrent::mappedReduced() is like mapped(), except that the
+ modified results are reduced or folded into a single result.
+
+ \o QtConcurrent::filter() removes all items from a container based on the
+ result of a filter function.
+
+ \o QtConcurrent::filtered() is like filter(), except that it returns a new
+ container with the filtered results.
+
+ \o QtConcurrent::filteredReduced() is like filtered(), except that the
+ filtered results are reduced or folded into a single result.
+
+ \o QtConcurrent::run() runs a function in another thread.
+
+ \o QFuture represents the result of an asynchronous computation.
+
+ \o QFutureIterator allows iterating through results available via QFuture.
+
+ \o QFutureWatcher allows monitoring a QFuture using signals-and-slots.
+
+ \o QFutureSynchronizer is a convenience class that automatically
+ synchronizes several QFutures.
+
+ \endlist
+
+ Qt Concurrent supports several STL-compatible container and iterator types,
+ but works best with Qt containers that have random-access iterators, such as
+ QList or QVector. The map and filter functions accept both containers and begin/end iterators.
+
+ STL Iterator support overview:
+
+ \table
+ \header
+ \o Iterator Type
+ \o Example classes
+ \o Support status
+ \row
+ \o Input Iterator
+ \o
+ \o Not Supported
+ \row
+ \o Output Iterator
+ \o
+ \o Not Supported
+ \row
+ \o Forward Iterator
+ \o std::slist
+ \o Supported
+ \row
+ \o Bidirectional Iterator
+ \o QLinkedList, std::list
+ \o Supported
+ \row
+ \o Random Access Iterator
+ \o QList, QVector, std::vector
+ \o Supported and Recommended
+ \endtable
+
+ Random access iterators can be faster in cases where Qt Concurrent is iterating
+ over a large number of lightweight items, since they allow skipping to any point
+ in the container. In addition, using random access iterators allows Qt Concurrent
+ to provide progress information trough QFuture::progressValue() and QFutureWatcher::
+ progressValueChanged().
+
+ The non in-place modifying functions such as mapped() and filtered() makes a
+ copy of the container when called. If you are using STL containers this copy operation
+ might take some time, in this case we recommend specifying the begin and end iterators
+ for the container instead.
+*/
+
+/*!
+ \page threads-modules.html
+ \title Thread-Support in Qt Modules
+
+ \previouspage Concurrent Programming
+ \contentspage Thread Support in Qt
+
+ \section1 Threads and the SQL Module
+
+ A connection can only be used from within the thread that created it.
+ Moving connections between threads or creating queries from a different
+ thread is not supported.
+
+ In addition, the third party libraries used by the QSqlDrivers can impose
+ further restrictions on using the SQL Module in a multithreaded program.
+ Consult the manual of your database client for more information
+
+ \section1 Painting in Threads
+
+ QPainter can be used in a thread to paint onto QImage, QPrinter, and
+ QPicture paint devices. Painting onto QPixmaps and QWidgets is \e not
+ supported. On Mac OS X the automatic progress dialog will not be
+ displayed if you are printing from outside the GUI thread.
+
+ Any number of threads can paint at any given time, however only
+ one thread at a time can paint on a given paint device. In other
+ words, two threads can paint at the same time if each paints onto
+ separate QImages, but the two threads cannot paint onto the same
+ QImage at the same time.
+
+ Note that on X11 systems without FontConfig support, Qt cannot
+ render text outside of the GUI thread. You can use the
+ QFontDatabase::supportsThreadedFontRendering() function to detect
+ whether or not font rendering can be used outside the GUI thread.
+
+ \section1 Threads and Rich Text Processing
+
+ The QTextDocument, QTextCursor, and \link richtext.html all
+ related classes\endlink are reentrant.
+
+ Note that a QTextDocument instance created in the GUI thread may
+ contain QPixmap image resources. Use QTextDocument::clone() to
+ create a copy of the document, and pass the copy to another thread for
+ further processing (such as printing).
+
+ \section1 Threads and the SVG module
+
+ The QSvgGenerator and QSvgRenderer classes in the QtSvg module
+ are reentrant.
+
+ \section1 Threads and Implicitly Shared Classes
+
+ Qt uses an optimization called \l{implicit sharing} for many of
+ its value class, notably QImage and QString. Beginning with Qt 4,
+ implicit shared classes can safely be copied across threads, like
+ any other value classes. They are fully
+ \l{Reentrancy and Thread-Safety}{reentrant}. The implicit sharing
+ is really \e implicit.
+
+ In many people's minds, implicit sharing and multithreading are
+ incompatible concepts, because of the way the reference counting
+ is typically done. Qt, however, uses atomic reference counting to
+ ensure the integrity of the shared data, avoiding potential
+ corruption of the reference counter.
+
+ Note that atomic reference counting does not guarantee
+ \l{Reentrancy and Thread-Safety}{thread-safety}. Proper locking should be used
+ when sharing an instance of an implicitly shared class between
+ threads. This is the same requirement placed on all
+ \l{Reentrancy and Thread-Safety}{reentrant} classes, shared or not. Atomic reference
+ counting does, however, guarantee that a thread working on its
+ own, local instance of an implicitly shared class is safe. We
+ recommend using \l{Signals and Slots Across Threads}{signals and
+ slots} to pass data between threads, as this can be done without
+ the need for any explicit locking.
+
+ To sum it up, implicitly shared classes in Qt 4 are really \e
+ implicitly shared. Even in multithreaded applications, you can
+ safely use them as if they were plain, non-shared, reentrant
+ value-based classes.
+*/
diff --git a/doc/src/frameworks-technologies/unicode.qdoc b/doc/src/frameworks-technologies/unicode.qdoc
new file mode 100644
index 0000000..4b979ee
--- /dev/null
+++ b/doc/src/frameworks-technologies/unicode.qdoc
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group string-processing
+ \title Classes for String Data
+
+ \brief Classes for working with string data.
+
+ These classes are relevant when working with string data. See the
+ \l{Unicode in Qt}{information about support for Unicode in Qt} for
+ more information.
+*/
+
+
+/*!
+ \page unicode.html
+ \title Unicode in Qt
+ \brief Information about support for Unicode in Qt.
+
+ \keyword Unicode
+
+ \ingroup frameworks-technologies
+
+ Unicode is a multi-byte character set, portable across all major
+ computing platforms and with decent coverage over most of the world.
+ It is also single-locale; it includes no code pages or other
+ complexities that make software harder to write and test. There is no
+ competing character set that's reasonably cross-platform. For these
+ reasons, Unicode 4.0 is used as the native character set for Qt.
+
+ \section1 Qt's Classes for Working with Strings
+
+ These classes are relevant when working with string data. For information
+ about rendering text, see the \l{Rich Text Processing} overview, and if
+ your string data is in XML, see the \l{XML Processing} overview.
+
+ \annotatedlist string-processing
+
+ \section1 Information about Unicode on the Web
+
+ The \l{http://www.unicode.org/}{Unicode Consortium} has a number
+ of documents available, including
+
+ \list
+
+ \i \l{http://www.unicode.org/unicode/standard/principles.html}{A
+ technical introduction to Unicode}
+ \i \l{http://www.unicode.org/unicode/standard/standard.html}{The
+ home page for the standard}
+
+ \endlist
+
+
+ \section1 The Standard
+
+ The current version of the standard is \l{http://www.unicode.org/versions/Unicode5.1.0/}{Unicode 5.1.0}.
+
+ Previous printed versions of the specification:
+
+ \list
+ \o \l{http://www.amazon.com/Unicode-Standard-Version-5-0-5th/dp/0321480910/trolltech/t}{The Unicode Standard, Version 5.0}
+ \o \l{http://www.amazon.com/exec/obidos/ASIN/0321185781/trolltech/t}{The Unicode Standard, version 4.0}
+ \o \l{http://www.amazon.com/exec/obidos/ASIN/0201616335/trolltech/t}{The Unicode Standard, version 3.2}
+ \o \l{http://www.amazon.com/exec/obidos/ASIN/0201473459/trolltech/t}{The Unicode Standard, version 2.0} \mdash
+ see also the \l{http://www.unicode.org/unicode/reports/tr8.html}{2.1 update} and
+ \l{http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.9}{the 2.1.9 data files} at
+ \l{http://www.unicode.org}.
+ \endlist
+
+ \section1 Unicode in Qt
+
+ In Qt, and in most applications that use Qt, most or all user-visible
+ strings are stored using Unicode. Qt provides:
+
+ \list
+
+ \i Translation to/from legacy encodings for file I/O: see
+ QTextCodec and QTextStream.
+ \i Translation from Input Methods and 8-bit keyboard input.
+ \i Translation to legacy character sets for on-screen display.
+ \i A string class, QString, that stores Unicode characters, with
+ support for migrating from C strings including fast (cached)
+ translation to and from US-ASCII, and all the usual string
+ operations.
+ \i Unicode-aware widgets where appropriate.
+ \i Unicode support detection on Windows, so that Qt provides Unicode
+ even on Windows platforms that do not support it natively.
+
+ \endlist
+
+ To fully benefit from Unicode, we recommend using QString for storing
+ all user-visible strings, and performing all text file I/O using
+ QTextStream. Use QKeyEvent::text() for keyboard input in any custom
+ widgets you write; it does not make much difference for slow typists
+ in Western Europe or North America, but for fast typists or people
+ using special input methods using text() is beneficial.
+
+ All the function arguments in Qt that may be user-visible strings,
+ QLabel::setText() and a many others, take \c{const QString &}s.
+ QString provides implicit casting from \c{const char *}
+ so that things like
+
+ \snippet doc/src/snippets/code/doc_src_unicode.qdoc 0
+
+ will work. There is also a function, QObject::tr(), that provides
+ translation support, like this:
+
+ \snippet doc/src/snippets/code/doc_src_unicode.qdoc 1
+
+ QObject::tr() maps from \c{const char *} to a Unicode string, and
+ uses installable QTranslator objects to do the mapping.
+
+ Qt provides a number of built-in QTextCodec classes, that is,
+ classes that know how to translate between Unicode and legacy
+ encodings to support programs that must talk to other programs or
+ read/write files in legacy file formats.
+
+ By default, conversion to/from \c{const char *} uses a
+ locale-dependent codec. However, applications can easily find codecs
+ for other locales, and set any open file or network connection to use
+ a special codec. It is also possible to install new codecs, for
+ encodings that the built-in ones do not support. (At the time of
+ writing, Vietnamese/VISCII is one such example.)
+
+ Since US-ASCII and ISO-8859-1 are so common, there are also especially
+ fast functions for mapping to and from them. For example, to open an
+ application's icon one might do this:
+
+ \snippet doc/src/snippets/code/doc_src_unicode.qdoc 2
+
+ or
+
+ \snippet doc/src/snippets/code/doc_src_unicode.qdoc 3
+
+ Regarding output, Qt will do a best-effort conversion from
+ Unicode to whatever encoding the system and fonts provide.
+ Depending on operating system, locale, font availability, and Qt's
+ support for the characters used, this conversion may be good or bad.
+ We will extend this in upcoming versions, with emphasis on the most
+ common locales first.
+
+ \sa {Internationalization with Qt}
+*/
diff --git a/doc/src/functions.qdoc b/doc/src/functions.qdoc
deleted file mode 100644
index 254863b..0000000
--- a/doc/src/functions.qdoc
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/****************************************************************************
-**
-** Documentation for class overview.
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt GUI Toolkit.
-** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
-**
-****************************************************************************/
-
-/*!
- \page functions.html
- \title Member Function Index
- \ingroup classlists
-
- Here is the list of all the documented member functions in the Qt
- API with links to the class documentation for each function.
-
- \generatelist functionindex
-*/
diff --git a/doc/src/gallery.qdoc b/doc/src/gallery.qdoc
deleted file mode 100644
index 4f09af5..0000000
--- a/doc/src/gallery.qdoc
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \group gallery
- \title Qt Widget Gallery
- \ingroup topics
- \brief Qt widgets shown in different styles on various platforms.
-
- Qt's support for widget styles and themes enables your application to fit in
- with the native desktop enviroment. Below, you can find links to the various
- widget styles that are supplied with Qt 4.
-
- \raw HTML
- <table align="center" cellspacing="20%" width="100%">
- <colgroup span="2">
- <col width="40%" />
- <col width="40%" />
- </colgroup>
- <tr>
- <td align="center">
- \endraw
- \image plastique-tabwidget.png Plastique Style Widget Gallery
-
- \bold{\l{Plastique Style Widget Gallery}}
-
- The Plastique style is provided by QPlastiqueStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windowsxp-tabwidget.png Windows XP Style Widget Gallery
-
- \bold{\l{Windows XP Style Widget Gallery}}
-
- The Windows XP style is provided by QWindowsXPStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image gtk-tabwidget.png GTK Style Widget Gallery
-
- \bold{\l{GTK Style Widget Gallery}}
-
- The GTK style is provided by QGtkStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image macintosh-tabwidget.png Macintosh Style Widget Gallery
-
- \bold{\l{Macintosh Style Widget Gallery}}
-
- The Macintosh style is provided by QMacStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image cleanlooks-tabwidget.png Cleanlooks Style Widget Gallery
-
- \bold{\l{Cleanlooks Style Widget Gallery}}
-
- The Cleanlooks style is provided by QCleanlooksStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windowsvista-tabwidget.png Windows Vista Style Widget Gallery
-
- \bold{\l{Windows Vista Style Widget Gallery}}
-
- The Windows Vista style is provided by QWindowsVistaStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image motif-tabwidget.png Motif Style Widget Gallery
-
- \bold{\l{Motif Style Widget Gallery}}
-
- The Motif style is provided by QMotifStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windows-tabwidget.png Windows Style Widget Gallery
-
- \bold{\l{Windows Style Widget Gallery}}
-
- The Windows style is provided by QWindowsStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image cde-tabwidget.png CDE Style Widget Gallery
-
- \bold{\l{CDE Style Widget Gallery}}
-
- The Common Desktop Environment style is provided by QCDEStyle.
- \raw HTML
- </td>
- </tr>
- </table>
- \endraw
-*/
diff --git a/doc/src/geometry.qdoc b/doc/src/geometry.qdoc
deleted file mode 100644
index 5866dc3..0000000
--- a/doc/src/geometry.qdoc
+++ /dev/null
@@ -1,150 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page geometry.html
- \title Window Geometry
- \ingroup architecture
- \brief An overview of window geometry handling and management.
-
- QWidget provides several functions that deal with a widget's
- geometry. Some of these functions operate on the pure client area
- (i.e. the window excluding the window frame), others include the
- window frame. The differentiation is done in a way that covers the
- most common usage transparently.
-
- \list
- \o \bold{Including the window frame:}
- \l{QWidget::x()}{x()},
- \l{QWidget::y()}{y()},
- \l{QWidget::frameGeometry()}{frameGeometry()},
- \l{QWidget::pos()}{pos()}, and
- \l{QWidget::move()}{move()}.
- \o \bold{Excluding the window frame:}
- \l{QWidget::geometry()}{geometry()},
- \l{QWidget::width()}{width()},
- \l{QWidget::height()}{height()},
- \l{QWidget::rect()}{rect()}, and
- \l{QWidget::size()}{size()}.
- \endlist
-
- Note that the distinction only matters for decorated top-level
- widgets. For all child widgets, the frame geometry is equal to the
- widget's client geometry.
-
- This diagram shows most of the functions in use:
- \img geometry.png Geometry diagram
-
- Topics:
-
- \tableofcontents
-
- \section1 X11 Peculiarities
-
- On X11, a window does not have a frame until the window manager
- decorates it. This happens asynchronously at some point in time
- after calling QWidget::show() and the first paint event the
- window receives, or it does not happen at all. Bear in mind that
- X11 is policy-free (others call it flexible). Thus you cannot
- make any safe assumption about the decoration frame your window
- will get. Basic rule: There's always one user who uses a window
- manager that breaks your assumption, and who will complain to
- you.
-
- Furthermore, a toolkit cannot simply place windows on the screen. All
- Qt can do is to send certain hints to the window manager. The window
- manager, a separate process, may either obey, ignore or misunderstand
- them. Due to the partially unclear Inter-Client Communication
- Conventions Manual (ICCCM), window placement is handled quite
- differently in existing window managers.
-
- X11 provides no standard or easy way to get the frame geometry
- once the window is decorated. Qt solves this problem with nifty
- heuristics and clever code that works on a wide range of window
- managers that exist today. Don't be surprised if you find one
- where QWidget::frameGeometry() returns wrong results though.
-
- Nor does X11 provide a way to maximize a window.
- QWidget::showMaximized() has to emulate the feature. Its result
- depends on the result of QWidget::frameGeometry() and the
- capability of the window manager to do proper window placement,
- neither of which can be guaranteed.
-
- \section1 Restoring a Window's Geometry
-
- Since version 4.2, Qt provides functions that saves and restores a
- window's geometry and state for you. QWidget::saveGeometry()
- saves the window geometry and maximized/fullscreen state, while
- QWidget::restoreGeometry() restores it. The restore function also
- checks if the restored geometry is outside the available screen
- geometry, and modifies it as appropriate if it is.
-
- The rest of this document describes how to save and restore the
- geometry using the geometry properties. On Windows, this is
- basically storing the result of QWidget::geometry() and calling
- QWidget::setGeometry() in the next session before calling
- \l{QWidget::show()}{show()}. On X11, this won't work because an
- invisible window doesn't have a frame yet. The window manager
- will decorate the window later. When this happens, the window
- shifts towards the bottom/right corner of the screen depending on
- the size of the decoration frame. Although X provides a way to
- avoid this shift, most window managers fail to implement this
- feature.
-
- A workaround is to call \l{QWidget::setGeometry()}{setGeometry()}
- after \l{QWidget::show()}{show()}. This has the two disadvantages
- that the widget appears at a wrong place for a millisecond
- (results in flashing) and that currently only every second window
- manager gets it right. A safer solution is to store both
- \l{QWidget::pos()}{pos()} and \l{QWidget::size()}{size()} and to
- restore the geometry using \l{QWidget::resize()} and
- \l{QWidget::move()}{move()} before calling
- \l{QWidget::show()}{show()}, as demonstrated in the following
- code snippets (from the \l{mainwindows/application}{Application}
- example):
-
- \snippet examples/mainwindows/application/mainwindow.cpp 35
- \codeline
- \snippet examples/mainwindows/application/mainwindow.cpp 38
-
- This method works on Windows, Mac OS X, and most X11 window
- managers.
-*/
diff --git a/doc/src/getting-started/demos.qdoc b/doc/src/getting-started/demos.qdoc
new file mode 100644
index 0000000..feea281
--- /dev/null
+++ b/doc/src/getting-started/demos.qdoc
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page demos.html
+ \title Qt Demonstrations
+ \brief Information about the demonstration programs provided with Qt.
+
+ \previouspage Qt Examples
+ \contentspage How to Learn Qt
+ \nextpage What's New in Qt 4.6
+
+ This is the list of demonstrations in Qt's \c demos directory.
+ These are larger and more complicated programs than the
+ \l{Qt Examples} and are used to highlight certain features of
+ Qt.
+
+ \table 50%
+ \header
+ \o {2,1} Getting an Overview
+ \row
+ \o \inlineimage qtdemo-small.png
+ \o
+ If you run the \l{Examples and Demos Launcher}, you'll see many of Qt's
+ widgets in action.
+
+ The \l{Qt Widget Gallery} also provides overviews of selected Qt
+ widgets in each of the styles used on various supported platforms.
+ \endtable
+
+ If you are new to Qt, and want to start developing applications,
+ you should probably start by going through the \l{Tutorials}.
+
+ \section1 Painting
+
+ \list
+ \o \l{demos/composition}{Composition Modes} demonstrates the range of
+ composition modes available with Qt.
+ \o \l{demos/deform}{Vector Deformation} demonstrates effects that are made
+ possible with a vector-oriented paint engine.
+ \o \l{demos/gradients}{Gradients} shows the different types of gradients
+ that are available in Qt.
+ \o \l{demos/pathstroke}{Path Stroking} shows Qt's built-in dash patterns
+ and shows how custom patterns can be used to extend the range of
+ available patterns.
+ \o \l{demos/affine}{Affine Transformations} demonstrates the different
+ affine transformations that can be used to influence painting operations.
+ \o \l{demos/arthurplugin}{Arthur Plugin} shows the widgets from the
+ other painting demos packaged as a custom widget plugin for \QD.
+ \endlist
+
+ \section1 Item Views
+
+ \list
+ \o \l{demos/interview}{Interview} shows the same model and selection being
+ shared between three different views.
+ \o \l{demos/spreadsheet}{Spreadsheet} demonstrates the use of a table view
+ as a spreadsheet, using custom delegates to render each item according to
+ the type of data it contains.
+ \endlist
+
+ \section1 SQL
+
+ \list
+ \o \l{demos/books}{Books} shows how Qt's SQL support and model/view integration
+ enables the user to modify the contents of a database without requiring
+ knowledge of SQL.
+ \o \l{demos/sqlbrowser}{SQL Browser} demonstrates a console for executing SQL
+ statements on a live database and provides a data browser for interactively
+ visualizing the results.
+ \endlist
+
+ \section1 Rich Text
+
+ \list
+ \o \l{demos/textedit}{Text Edit} shows Qt's rich text editing features and provides
+ an environment for experimenting with them.
+ \endlist
+
+ \section1 Main Window
+
+ \list
+ \o \l{demos/mainwindow}{Main Window} shows Qt's extensive support for main window
+ features, such as tool bars, dock windows, and menus.
+ \o \l{demos/macmainwindow}{Mac Main Window} shows how to create main window applications that has
+ the same appearance as other Mac OS X applications.
+ \endlist
+
+ \section1 Graphics View
+
+ \list
+ \o \l{demos/chip}{40000 Chips} uses the
+ \l{The Graphics View Framework}{Graphics View} framework to efficiently
+ display a large number of individual graphical items on a scrolling canvas,
+ highlighting features such as rotation, zooming, level of detail control,
+ and item selection.
+ \o \l{demos/embeddeddialogs}{Embedded Dialogs} showcases Qt 4.4's \e{Widgets on
+ the Canvas} feature by embedding a multitude of fully-working dialogs into a
+ scene.
+ \o \l{demos/boxes}{Boxes} showcases Qt's OpenGL support and the
+ integration with the Graphics View framework.
+ \endlist
+
+ \section1 Tools
+
+ \list
+ \o \l{demos/undo}{Undo Framework} demonstrates how Qt's
+ \l{Overview of Qt's Undo Framework}{undo framework} is used to
+ provide advanced undo/redo functionality.
+ \endlist
+
+ \section1 QtWebKit
+
+ \list
+ \o \l{Web Browser} demonstrates how Qt's \l{QtWebKit Module}{WebKit module}
+ can be used to implement a small Web browser.
+ \endlist
+
+ \section1 Phonon
+
+ \list
+ \o \l{demos/mediaplayer}{Media Player} demonstrates how the \l{Phonon Module} can be
+ used to implement a basic media player application.
+ \endlist
+
+ \note The Phonon demos are currently not available for the MinGW platform.
+
+*/
diff --git a/doc/src/getting-started/examples.qdoc b/doc/src/getting-started/examples.qdoc
new file mode 100644
index 0000000..b2a9997
--- /dev/null
+++ b/doc/src/getting-started/examples.qdoc
@@ -0,0 +1,1115 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page examples-overview.html
+ \raw HTML
+ <script>
+ document.location.href = "examples.html";
+ </script>
+ \endraw
+ Click this \l{Qt Examples}{link} if you don't get redirected.
+*/
+
+/*!
+ \page examples.html
+ \title Qt Examples
+ \brief The example programs provided with Qt.
+
+ \previouspage Tutorials
+ \contentspage How to Learn Qt
+ \nextpage Qt Demonstrations
+
+ Qt is supplied with a variety of examples that cover almost every aspect
+ of development. They are not all designed to be impressive when you run
+ them, but their source code is carefully written to show good Qt
+ programming practices. You can launch any of these programs from the
+ \l{Examples and Demos Launcher} application.
+
+ These examples are ordered by functional area, but many examples often
+ use features from many parts of Qt to highlight one area in particular.
+ If you are new to Qt, you should probably start by going through the
+ \l{Tutorials} before you have a look at the
+ \l{mainwindows/application}{Application} example.
+
+ In addition to the examples and the tutorial, Qt includes a
+ \l{Qt Demonstrations}{selection of demos} that deliberately show off
+ Qt's features. You might want to look at these as well.
+
+ \table
+ \row
+ \o{2,1} \l{Widgets Examples}{\bold Widgets}
+ \o{2,1} \l{Dialog Examples}{\bold Dialogs}
+ \row
+ \i \image widget-examples.png
+ \i
+ Qt comes with a large range of standard widgets that users of modern
+ applications have come to expect. You can also develop your own custom
+ widgets and controls, and use them alongside standard widgets.
+
+ It is even possible to provide custom styles and themes for widgets that can
+ be used to change the appearance of standard widgets and appropriately
+ written custom widgets.
+
+ \i \image dialog-examples.png Dialogs
+ \i
+ Qt includes standard dialogs for many common operations, such as file
+ selection, printing, and color selection.
+
+ Custom dialogs can also be created for specialized modal or modeless
+ interactions with users.
+
+ \row
+ \o{2,1} \l{Main Window Examples}{\bold{Main Windows}}
+ \o{2,1} \l{Layout Examples}{\bold Layouts}
+
+ \row
+ \i \image mainwindow-examples.png MainWindows
+ \i All the standard features of application main windows are provided by Qt.
+
+ Main windows can have pull down menus, tool bars, and dock windows. These
+ separate forms of user input are unified in an integrated action system that
+ also supports keyboard shortcuts and accelerator keys in menu items.
+
+ \i \image layout-examples.png Layouts
+ \i
+ Qt uses a layout-based approach to widget management. Widgets are arranged in
+ the optimal positions in windows based on simple layout rules, leading to a
+ consistent look and feel.
+
+ Custom layouts can be used to provide more control over the positions and
+ sizes of child widgets.
+
+ \row
+ \o{2,1} \l{Item Views Examples}{\bold{Item Views}}
+ \o{2,1} \l{Graphics View Examples}{\bold{Graphics View}}
+ \row
+ \o \image itemview-examples.png ItemViews
+ \o
+ Item views are widgets that typically display data sets. Qt 4's model/view
+ framework lets you handle large data sets by separating the underlying data
+ from the way it is represented to the user, and provides support for
+ customized rendering through the use of delegates.
+
+ \o \image graphicsview-examples.png GraphicsView
+ \o
+ Qt is provided with a comprehensive canvas through the GraphicsView
+ classes.
+
+ \row
+ \o{2,1} \l{Painting Examples}{\bold{Painting}}
+ \o{2,1} \l{Rich Text Examples}{\bold{Rich Text}}
+ \row
+ \o \image painting-examples.png Painting
+ \o
+ Qt's painting system is able to render vector graphics, images, and outline
+ font-based text with sub-pixel accuracy accuracy using anti-aliasing to
+ improve rendering quality.
+
+ \o \image richtext-examples.png RichText
+ \o
+ Qt provides powerful document-oriented rich text engine that supports Unicode
+ and right-to-left scripts. Documents can be manipulated using a cursor-based
+ API, and their contents can be imported and exported as both HTML and in a
+ custom XML format.
+
+ \row
+ \o{2,1} \l{Desktop Examples}{\bold Desktop}
+ \o{2,1} \l{Drag and Drop Examples}{\bold{Drag and Drop}}
+ \row
+ \o \image desktop-examples.png
+ \o
+ Qt provides features to enable applications to integrate with the user's
+ preferred desktop environment.
+
+ Features such as system tray icons, access to the desktop widget, and
+ support for desktop services can be used to improve the appearance of
+ applications and take advantage of underlying desktop facilities.
+
+ \o \image draganddrop-examples.png DragAndDrop
+ \o
+ Qt supports native drag and drop on all platforms via an extensible
+ MIME-based system that enables applications to send data to each other in the
+ most appropriate formats.
+
+ Drag and drop can also be implemented for internal use by applications.
+
+ \row
+ \o{2,1} \l{Threading and Concurrent Programming Examples}{\bold{Threading and Concurrent Programming}}
+ \o{2,1} \l{Tools Examples}{\bold{Tools}}
+ \row
+ \o \image thread-examples.png
+ \o
+ Qt 4 makes it easier than ever to write multithreaded applications. More
+ classes have been made usable from non-GUI threads, and the signals and slots
+ mechanism can now be used to communicate between threads.
+
+ The QtConcurrent namespace includes a collection of classes and functions
+ for straightforward concurrent programming.
+
+ \o \image tool-examples.png Tools
+ \o
+ Qt is equipped with a range of capable tool classes, from containers and
+ iterators to classes for string handling and manipulation.
+
+ Other classes provide application infrastructure support, handling plugin
+ loading and managing configuration files.
+
+ \row
+ \o{2,1} \l{Network Examples}{\bold{Network}}
+ \o{2,1} \l{Inter-Process Communication Examples}{\bold{Inter-Process Communication}}
+ \row
+ \o \image network-examples.png Network
+ \o
+ Qt is provided with an extensive set of network classes to support both
+ client-based and server side network programming.
+
+ \o \image ipc-examples.png IPC
+ \o
+
+ \row
+ \o{2,1} \l{OpenGL Examples}{\bold OpenGL}
+ \o{2,1} \l{Multimedia Examples}{\bold{Multimedia Framework}}
+ \row
+ \o \image opengl-examples.png OpenGL
+ \o
+ Qt provides support for integration with OpenGL implementations on all
+ platforms, giving developers the opportunity to display hardware accelerated
+ 3D graphics alongside a more conventional user interface.
+
+ \o \image phonon-examples.png
+ \o
+ Qt provides low-level audio support on linux,windows and mac platforms by default and
+ an audio plugin API to allow developers to implement there own audio support for
+ custom devices and platforms.
+
+ The Phonon Multimedia Framework brings multimedia support to Qt applications.
+
+ \row
+ \o{2,1} \l{SQL Examples}{\bold{SQL}}
+ \o{2,1} \l{XML Examples}{\bold{XML}}
+ \row
+ \o \image sql-examples.png SQL
+ \o
+ Qt provides extensive database interoperability, with support for products
+ from both open source and proprietary vendors.
+
+ SQL support is integrated with Qt's model/view architecture, making it easier
+ to provide GUI integration for your database applications.
+
+ \o \image xml-examples.png XML
+ \o
+ XML parsing and handling is supported through SAX and DOM compliant APIs
+ as well as streaming classes.
+
+ The XQuery/XPath and XML Schema engines in the QtXmlPatterns modules
+ provide classes for querying XML files and custom data models.
+
+ \row
+ \o{2,1} \l{Qt Designer Examples}{\bold{Qt Designer}}
+ \o{2,1} \l{UiTools Examples}{\bold UiTools}
+ \row
+ \o \image designer-examples.png Designer
+ \o
+ Qt Designer is a capable graphical user interface designer that lets you
+ create and configure forms without writing code. GUIs created with
+ Qt Designer can be compiled into an application or created at run-time.
+
+ \o \image uitools-examples.png UiTools
+ \o
+
+ \row
+ \o{2,1} \l{Qt Linguist Examples}{\bold{Qt Linguist}}
+ \o{2,1} \l{Qt Script Examples}{\bold{Qt Script}}
+ \row
+ \o \image linguist-examples.png QtLinguist
+ \o
+ Internationalization is a core feature of Qt.
+
+ \o \image qtscript-examples.png
+ \o
+ Qt is provided with a powerful embedded scripting environment through the QtScript
+ classes.
+
+ \row
+ \o{2,1} \l{WebKit Examples}{\bold WebKit}
+ \o{2,1} \l{Help System Examples}{\bold{Help System}}
+ \row
+ \o \image webkit-examples.png
+ \o
+ Qt provides an integrated Web browser component based on WebKit, the popular
+ open source browser engine.
+
+ \o \image assistant-examples.png HelpSystem
+ \o
+ Support for interactive help is provided by the Qt Assistant application.
+ Developers can take advantages of the facilities it offers to display
+ specially-prepared documentation to users of their applications.
+
+ \row
+ \o{2,1} \l{State Machine Examples}{\bold{State Machine}}
+ \o{2,1} \l{Animation Framework Examples}{\bold{Animation Framework}}
+ \row
+ \o \image statemachine-examples.png
+ \o
+ Qt provides a powerful hierarchical finite state machine through the Qt State
+ Machine classes.
+
+ \o \image animation-examples.png
+ \o
+
+ \row
+ \o{2,1} \l{Qt for Embedded Linux Examples}{\bold{Qt for Embedded Linux}}
+ \o{2,1} \l{ActiveQt Examples}{\bold ActiveQt}
+ \row
+ \o \image qt-embedded-examples.png
+ \o
+ Systems with limited resources, specialized hardware, and small
+ screens require special attention.
+
+ \o \image activeqt-examples.png ActiveQt
+ \o
+
+ \row
+ \o{2,1} \l{D-Bus Examples}{\bold{D-Bus}}
+ \o{2,1} \l{Qt Quarterly}{\bold{Qt Quarterly}}
+ \row
+ \o \image dbus-examples.png D-Bus
+ \o
+
+ \o \image qq-thumbnail.png QtQuarterly
+ \o
+ One more valuable source for examples and explanations of Qt
+ features is the archive of the \l {Qt Quarterly}.
+
+ \endtable
+
+\omit
+ In the list below, examples marked with an asterisk (*) are fully
+ documented. Eventually, all the examples will be fully documented,
+ but sometimes we include an example before we have time to write
+ about it.
+\endomit
+*/
+
+/*!
+ \page examples-widgets.html
+ \title Widgets Examples
+
+ \contentspage Qt Examples
+ \nextpage Dialog Examples
+
+ \image widget-examples.png
+
+ Qt comes with a large range of standard widgets that users of modern
+ applications have come to expect.
+
+ You can also develop your own custom widgets and controls, and use them
+ alongside standard widgets.
+
+ It is even possible to provide custom styles and themes for widgets that can
+ be used to change the appearance of standard widgets and appropriately
+ written custom widgets.
+
+ \list
+ \o \l{widgets/analogclock}{Analog Clock}\raisedaster
+ \o \l{widgets/calculator}{Calculator}\raisedaster
+ \o \l{widgets/calendarwidget}{Calendar Widget}\raisedaster
+ \o \l{widgets/charactermap}{Character Map}\raisedaster
+ \o \l{widgets/codeeditor}{Code Editor}\raisedaster
+ \o \l{widgets/digitalclock}{Digital Clock}\raisedaster
+ \o \l{widgets/groupbox}{Group Box}\raisedaster
+ \o \l{widgets/icons}{Icons}\raisedaster
+ \o \l{widgets/imageviewer}{Image Viewer}\raisedaster
+ \o \l{widgets/lineedits}{Line Edits}\raisedaster
+ \o \l{widgets/movie}{Movie}
+ \o \l{widgets/scribble}{Scribble}\raisedaster
+ \o \l{widgets/shapedclock}{Shaped Clock}\raisedaster
+ \o \l{widgets/sliders}{Sliders}\raisedaster
+ \o \l{widgets/spinboxes}{Spin Boxes}\raisedaster
+ \o \l{widgets/styles}{Styles}\raisedaster
+ \o \l{widgets/stylesheet}{Style Sheet}\raisedaster
+ \o \l{widgets/tablet}{Tablet}\raisedaster
+ \o \l{widgets/tetrix}{Tetrix}\raisedaster
+ \o \l{widgets/tooltips}{Tooltips}\raisedaster
+ \o \l{widgets/wiggly}{Wiggly}\raisedaster
+ \o \l{widgets/windowflags}{Window Flags}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-dialogs.html
+ \title Dialog Examples
+
+ \previouspage Widgets Examples
+ \contentspage Qt Examples
+ \nextpage Main Window Examples
+
+ \image dialog-examples.png
+
+ Qt includes standard dialogs for many common operations, such as file
+ selection, printing, and color selection.
+
+ Custom dialogs can also be created for specialized modal or modeless
+ interactions with users.
+
+ \list
+ \o \l{dialogs/classwizard}{Class Wizard}\raisedaster
+ \o \l{dialogs/configdialog}{Config Dialog}
+ \o \l{dialogs/extension}{Extension}\raisedaster
+ \o \l{dialogs/findfiles}{Find Files}\raisedaster
+ \o \l{dialogs/licensewizard}{License Wizard}\raisedaster
+ \o \l{dialogs/standarddialogs}{Standard Dialogs}
+ \o \l{dialogs/tabdialog}{Tab Dialog}\raisedaster
+ \o \l{dialogs/trivialwizard}{Trivial Wizard}
+ \endlist
+*/
+
+/*!
+ \page examples-mainwindow.html
+ \title Main Window Examples
+
+ \previouspage Dialog Examples
+ \contentspage Qt Examples
+ \nextpage Layout Examples
+
+ \image mainwindow-examples.png
+
+ All the standard features of application main windows are provided by Qt.
+
+ Main windows can have pull down menus, tool bars, and dock windows. These
+ separate forms of user input are unified in an integrated action system that
+ also supports keyboard shortcuts and accelerator keys in menu items.
+
+ \list
+ \o \l{mainwindows/application}{Application}\raisedaster
+ \o \l{mainwindows/dockwidgets}{Dock Widgets}\raisedaster
+ \o \l{mainwindows/mdi}{MDI}
+ \o \l{mainwindows/menus}{Menus}\raisedaster
+ \o \l{mainwindows/recentfiles}{Recent Files}
+ \o \l{mainwindows/sdi}{SDI}
+ \endlist
+*/
+
+/*!
+ \page examples-layouts.html
+ \title Layout Examples
+
+ \previouspage Main Window Examples
+ \contentspage Qt Examples
+ \nextpage Item Views Examples
+
+ \image layout-examples.png
+
+ Qt uses a layout-based approach to widget management. Widgets are arranged in
+ the optimal positions in windows based on simple layout rules, leading to a
+ consistent look and feel.
+
+ Custom layouts can be used to provide more control over the positions and
+ sizes of child widgets.
+
+ \list
+ \o \l{layouts/basiclayouts}{Basic Layouts}\raisedaster
+ \o \l{layouts/borderlayout}{Border Layout}
+ \o \l{layouts/dynamiclayouts}{Dynamic Layouts}
+ \o \l{layouts/flowlayout}{Flow Layout}
+ \endlist
+*/
+
+/*!
+ \page examples-itemviews.html
+ \title Item Views Examples
+
+ \previouspage Layout Examples
+ \contentspage Qt Examples
+ \nextpage Graphics View Examples
+
+ \image itemview-examples.png
+
+ Item views are widgets that typically display data sets. Qt 4's model/view
+ framework lets you handle large data sets by separating the underlying data
+ from the way it is represented to the user, and provides support for
+ customized rendering through the use of delegates.
+
+ \list
+ \o \l{itemviews/addressbook}{Address Book}\raisedaster
+ \o \l{itemviews/basicsortfiltermodel}{Basic Sort/Filter Model}
+ \o \l{itemviews/chart}{Chart}
+ \o \l{itemviews/coloreditorfactory}{Color Editor Factory}\raisedaster
+ \o \l{itemviews/combowidgetmapper}{Combo Widget Mapper}\raisedaster
+ \o \l{itemviews/customsortfiltermodel}{Custom Sort/Filter Model}\raisedaster
+ \o \l{itemviews/dirview}{Dir View}
+ \o \l{itemviews/editabletreemodel}{Editable Tree Model}\raisedaster
+ \o \l{itemviews/fetchmore}{Fetch More}\raisedaster
+ \o \l{itemviews/frozencolumn}{Frozen Column}\raisedaster
+ \o \l{itemviews/pixelator}{Pixelator}\raisedaster
+ \o \l{itemviews/puzzle}{Puzzle}
+ \o \l{itemviews/simpledommodel}{Simple DOM Model}\raisedaster
+ \o \l{itemviews/simpletreemodel}{Simple Tree Model}\raisedaster
+ \o \l{itemviews/simplewidgetmapper}{Simple Widget Mapper}\raisedaster
+ \o \l{itemviews/spinboxdelegate}{Spin Box Delegate}\raisedaster
+ \o \l{itemviews/stardelegate}{Star Delegate}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-graphicsview.html
+ \title Graphics View Examples
+
+ \previouspage Item Views Examples
+ \contentspage Qt Examples
+ \nextpage Painting Examples
+
+ \image graphicsview-examples.png
+
+ Qt is provided with a comprehensive canvas through the GraphicsView
+ classes.
+
+ These examples demonstrate the fundamental aspects of canvas programming
+ with Qt.
+
+ \list
+ \o \l{graphicsview/collidingmice}{Colliding Mice}\raisedaster
+ \o \l{graphicsview/diagramscene}{Diagram Scene}\raisedaster
+ \o \l{graphicsview/dragdroprobot}{Drag and Drop Robot}
+ \o \l{graphicsview/elasticnodes}{Elastic Nodes}
+ \o \l{graphicsview/portedasteroids}{Ported Asteroids}
+ \o \l{graphicsview/portedcanvas}{Ported Canvas}
+ \endlist
+*/
+
+/*!
+ \page examples-painting.html
+ \title Painting Examples
+
+ \previouspage Graphics View Examples
+ \contentspage Qt Examples
+ \nextpage Rich Text Examples
+
+ \image painting-examples.png
+
+ Qt's painting system is able to render vector graphics, images, and outline
+ font-based text with sub-pixel accuracy accuracy using anti-aliasing to
+ improve rendering quality.
+
+ These examples show the most common techniques that are used when painting
+ with Qt, from basic concepts such as drawing simple primitives to the use of
+ transformations.
+
+ \list
+ \o \l{painting/basicdrawing}{Basic Drawing}\raisedaster
+ \o \l{painting/concentriccircles}{Concentric Circles}\raisedaster
+ \o \l{painting/fontsampler}{Font Sampler}
+ \o \l{painting/imagecomposition}{Image Composition}\raisedaster
+ \o \l{painting/painterpaths}{Painter Paths}\raisedaster
+ \o \l{painting/svggenerator}{SVG Generator}\raisedaster
+ \o \l{painting/svgviewer}{SVG Viewer}
+ \o \l{painting/transformations}{Transformations}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-richtext.html
+ \title Rich Text Examples
+
+ \previouspage Painting Examples
+ \contentspage Qt Examples
+ \nextpage Desktop Examples
+
+ \image richtext-examples.png
+
+ Qt provides powerful document-oriented rich text engine that supports Unicode
+ and right-to-left scripts. Documents can be manipulated using a cursor-based
+ API, and their contents can be imported and exported as both HTML and in a
+ custom XML format.
+
+ \list
+ \o \l{richtext/calendar}{Calendar}\raisedaster
+ \o \l{richtext/orderform}{Order Form}\raisedaster
+ \o \l{richtext/syntaxhighlighter}{Syntax Highlighter}\raisedaster
+ \o \l{richtext/textobject}{Text Object}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-desktop.html
+ \title Desktop Examples
+
+ \previouspage Rich Text Examples
+ \contentspage Qt Examples
+ \nextpage Drag and Drop Examples
+
+ \image desktop-examples.png
+
+ Qt provides features to enable applications to integrate with the user's
+ preferred desktop environment.
+
+ Features such as system tray icons, access to the desktop widget, and
+ support for desktop services can be used to improve the appearance of
+ applications and take advantage of underlying desktop facilities.
+
+ \list
+ \o \l{desktop/screenshot}{Screenshot}\raisedaster
+ \o \l{desktop/systray}{System Tray}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-draganddrop.html
+ \title Drag and Drop Examples
+
+ \previouspage Desktop Examples
+ \contentspage Qt Examples
+ \nextpage Threading and Concurrent Programming Examples
+
+ \image draganddrop-examples.png
+
+ Qt supports native drag and drop on all platforms via an extensible
+ MIME-based system that enables applications to send data to each other in the
+ most appropriate formats.
+
+ Drag and drop can also be implemented for internal use by applications.
+
+ \list
+ \o \l{draganddrop/delayedencoding}{Delayed Encoding}\raisedaster
+ \o \l{draganddrop/draggableicons}{Draggable Icons}
+ \o \l{draganddrop/draggabletext}{Draggable Text}
+ \o \l{draganddrop/dropsite}{Drop Site}
+ \o \l{draganddrop/fridgemagnets}{Fridge Magnets}\raisedaster
+ \o \l{draganddrop/puzzle}{Drag and Drop Puzzle}
+ \endlist
+*/
+
+/*!
+ \page examples-threadandconcurrent.html
+ \title Threading and Concurrent Programming Examples
+
+ \previouspage Drag and Drop Examples
+ \contentspage Qt Examples
+ \nextpage Tools Examples
+
+ \image thread-examples.png
+
+ Qt 4 makes it easier than ever to write multithreaded applications. More
+ classes have been made usable from non-GUI threads, and the signals and slots
+ mechanism can now be used to communicate between threads.
+
+ Additionally, it is now possible to move objects between threads.
+
+ \list
+ \o \l{threads/queuedcustomtype}{Queued Custom Type}\raisedaster
+ \o \l{threads/mandelbrot}{Mandelbrot}\raisedaster
+ \o \l{threads/semaphores}{Semaphores}\raisedaster
+ \o \l{threads/waitconditions}{Wait Conditions}\raisedaster
+ \endlist
+
+ The QtConcurrent namespace includes a collection of classes and functions
+ for straightforward concurrent programming.
+
+ These examples show how to apply the basic techniques of concurrent
+ programming to simple problems.
+
+ \list
+ \o \l{qtconcurrent/imagescaling}{QtConcurrent Asynchronous Image Scaling}
+ \o \l{qtconcurrent/map}{QtConcurrent Map}
+ \o \l{qtconcurrent/progressdialog}{QtConcurrent Progress Dialog}
+ \o \l{qtconcurrent/runfunction}{QtConcurrent Run Function}
+ \o \l{qtconcurrent/wordcount}{QtConcurrent Word Count}
+ \endlist
+*/
+
+/*!
+ \page examples.tools.html
+ \title Tools Examples
+
+ \previouspage Threading and Concurrent Programming Examples
+ \contentspage Qt Examples
+ \nextpage Network Examples
+
+ \image tool-examples.png
+
+ Qt is equipped with a range of capable tool classes, from containers and
+ iterators to classes for string handling and manipulation.
+
+ Other classes provide application infrastructure support, handling plugin
+ loading and managing configuration files.
+
+ \list
+ \o \l{tools/codecs}{Codecs}
+ \o \l{tools/completer}{Completer}\raisedaster
+ \o \l{tools/customcompleter}{Custom Completer}\raisedaster
+ \o \l{tools/customtype}{Custom Type}\raisedaster
+ \o \l{tools/customtypesending}{Custom Type Sending}\raisedaster
+ \o \l{tools/echoplugin}{Echo Plugin}\raisedaster
+ \o \l{tools/i18n}{I18N}
+ \o \l{tools/plugandpaint}{Plug & Paint}\raisedaster
+ \o Plug & Paint Plugins: \l{tools/plugandpaintplugins/basictools}{Basic Tools}\raisedaster
+ and \l{tools/plugandpaintplugins/extrafilters}{Extra Filters}\raisedaster
+ \o \l{tools/regexp}{RegExp}
+ \o \l{tools/settingseditor}{Settings Editor}
+ \o \l{tools/styleplugin}{Style Plugin}\raisedaster
+ \o \l{tools/treemodelcompleter}{Tree Model Completer}\raisedaster
+ \o \l{tools/undoframework}{Undo Framework}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-network.html
+ \title Network Examples
+
+ \previouspage Tools Examples
+ \contentspage Qt Examples
+ \nextpage Inter-Process Communication Examples
+
+ \image network-examples.png
+
+ Qt is provided with an extensive set of network classes to support both
+ client-based and server side network programming.
+
+ These examples demonstrate the fundamental aspects of network programming
+ with Qt.
+
+ \list
+ \o \l{network/blockingfortuneclient}{Blocking Fortune Client}\raisedaster
+ \o \l{network/broadcastreceiver}{Broadcast Receiver}
+ \o \l{network/broadcastsender}{Broadcast Sender}
+ \o \l{network/network-chat}{Network Chat}
+ \o \l{network/fortuneclient}{Fortune Client}\raisedaster
+ \o \l{network/fortuneserver}{Fortune Server}\raisedaster
+ \o \l{network/ftp}{FTP}\raisedaster
+ \o \l{network/http}{HTTP}
+ \o \l{network/loopback}{Loopback}
+ \o \l{network/threadedfortuneserver}{Threaded Fortune Server}\raisedaster
+ \o \l{network/torrent}{Torrent}
+ \o \l{network/googlesuggest}{Google Suggest}
+ \endlist
+*/
+
+/*!
+ \page examples-ipc.html
+ \title Inter-Process Communication Examples
+
+ \previouspage Network Examples
+ \contentspage Qt Examples
+ \nextpage OpenGL Examples
+
+ \image ipc-examples.png
+
+ \list
+ \o \l{ipc/localfortuneclient}{Local Fortune Client}\raisedaster
+ \o \l{ipc/localfortuneserver}{Local Fortune Server}\raisedaster
+ \o \l{ipc/sharedmemory}{Shared Memory}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-opengl.html
+ \title OpenGL Examples
+
+ \previouspage Inter-Process Communication Examples
+ \contentspage Qt Examples
+ \nextpage Multimedia Examples
+
+ \image opengl-examples.png
+
+ Qt provides support for integration with OpenGL implementations on all
+ platforms, giving developers the opportunity to display hardware accelerated
+ 3D graphics alongside a more conventional user interface.
+
+ These examples demonstrate the basic techniques used to take advantage of
+ OpenGL in Qt applications.
+
+ \list
+ \o \l{opengl/2dpainting}{2D Painting}\raisedaster
+ \o \l{opengl/framebufferobject}{Framebuffer Object}
+ \o \l{opengl/framebufferobject2}{Framebuffer Object 2}
+ \o \l{opengl/grabber}{Grabber}
+ \o \l{opengl/hellogl}{Hello GL}\raisedaster
+ \o \l{opengl/overpainting}{Overpainting}\raisedaster
+ \o \l{opengl/pbuffers}{Pixel Buffers}
+ \o \l{opengl/pbuffers2}{Pixel Buffers 2}
+ \o \l{opengl/samplebuffers}{Sample Buffers}
+ \o \l{opengl/textures}{Textures}
+ \endlist
+*/
+
+/*!
+ \page examples-multimedia.html
+ \title Multimedia Examples
+
+ \previouspage OpenGL Examples
+ \contentspage Qt Examples
+ \nextpage SQL Examples
+
+ \image phonon-examples.png
+
+ \section1 Multimedia
+
+ Qt provides low-level audio support on linux,windows and mac platforms by default and
+ an audio plugin API to allow developers to implement there own audio support for
+ custom devices and platforms.
+
+ These examples demonstrate the basic techniques used to take advantage of
+ Audio API in Qt applications.
+
+ \list
+ \o \l{multimedia/audio/audiodevices}{Audio Devices}
+ \o \l{multimedia/audio/audiooutput}{Audio Output}
+ \o \l{multimedia/audio/audioinput}{Audio Input}
+ \endlist
+
+ \section1 Video Output
+
+ \list
+ \o \l{video/videowidget}{Video Widget}\raisedaster
+ \o \l{video/videographicsitem}{Video Graphics Item}
+ \endlist
+
+ \section1 Phonon
+
+ The Phonon Multimedia Framework brings multimedia support to Qt applications.
+
+ The examples and demonstrations provided show how to play music and movies
+ using the Phonon API.
+
+ \list
+ \o \l{phonon/capabilities}{Capabilities}\raisedaster
+ \o \l{phonon/musicplayer}{Music Player}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-sql.html
+ \title SQL Examples
+
+ \previouspage Multimedia Examples
+ \contentspage Qt Examples
+ \nextpage XML Examples
+
+ \image sql-examples.png
+
+ Qt provides extensive database interoperability, with support for products
+ from both open source and proprietary vendors.
+
+ SQL support is integrated with Qt's model/view architecture, making it easier
+ to provide GUI integration for your database applications.
+
+ \list
+ \o \l{sql/cachedtable}{Cached Table}\raisedaster
+ \o \l{sql/drilldown}{Drill Down}\raisedaster
+ \o \l{sql/querymodel}{Query Model}
+ \o \l{sql/relationaltablemodel}{Relational Table Model}
+ \o \l{sql/tablemodel}{Table Model}
+ \o \l{sql/sqlwidgetmapper}{SQL Widget Mapper}\raisedaster
+ \endlist
+*/
+
+
+/*!
+ \page examples-xml.html
+ \title XML Examples
+
+ \previouspage SQL Examples
+ \contentspage Qt Examples
+ \nextpage Qt Designer Examples
+
+ \image xml-examples.png XML
+
+ XML parsing and handling is supported through SAX and DOM compliant APIs
+ as well as streaming classes.
+
+ \list
+ \o \l{xml/dombookmarks}{DOM Bookmarks}
+ \o \l{xml/saxbookmarks}{SAX Bookmarks}
+ \o \l{xml/streambookmarks}{QXmlStream Bookmarks}\raisedaster
+ \o \l{xml/rsslisting}{RSS-Listing}
+ \o \l{xml/xmlstreamlint}{XML Stream Lint Example}\raisedaster
+ \endlist
+
+ The XQuery/XPath and XML Schema engines in the QtXmlPatterns modules
+ provide classes for querying XML files and custom data models.
+
+ \list
+ \o \l{xmlpatterns/recipes}{Recipes}
+ \o \l{xmlpatterns/filetree}{File System Example}
+ \o \l{xmlpatterns/qobjectxmlmodel}{QObject XML Model Example}
+ \o \l{xmlpatterns/xquery/globalVariables}{C++ Source Code Analyzer Example}
+ \o \l{xmlpatterns/trafficinfo}{Traffic Info}\raisedaster
+ \o \l{xmlpatterns/schema}{XML Schema Validation}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-designer.html
+ \title Qt Designer Examples
+
+ \previouspage XML Examples
+ \contentspage Qt Examples
+ \nextpage UiTools Examples
+
+ \image designer-examples.png QtDesigner
+
+ Qt Designer is a capable graphical user interface designer that lets you
+ create and configure forms without writing code. GUIs created with
+ Qt Designer can be compiled into an application or created at run-time.
+
+ \list
+ \o \l{designer/calculatorbuilder}{Calculator Builder}\raisedaster
+ \o \l{designer/calculatorform}{Calculator Form}\raisedaster
+ \o \l{designer/customwidgetplugin}{Custom Widget Plugin}\raisedaster
+ \o \l{designer/taskmenuextension}{Task Menu Extension}\raisedaster
+ \o \l{designer/containerextension}{Container Extension}\raisedaster
+ \o \l{designer/worldtimeclockbuilder}{World Time Clock Builder}\raisedaster
+ \o \l{designer/worldtimeclockplugin}{World Time Clock Plugin}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-uitools.html
+ \title UiTools Examples
+
+ \previouspage Qt Designer Examples
+ \contentspage Qt Examples
+ \nextpage Qt Linguist Examples
+
+ \image uitools-examples.png UiTools
+
+ \list
+ \o \l{uitools/multipleinheritance}{Multiple Inheritance}\raisedaster
+ \o \l{uitools/textfinder}{Text Finder}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-linguist.html
+ \title Qt Linguist Examples
+
+ \previouspage UiTools Examples
+ \contentspage Qt Examples
+ \nextpage Qt Script Examples
+
+ \image linguist-examples.png
+
+ Internationalization is a core feature of Qt. These examples show how to
+ access translation and localization facilities at run-time.
+
+ \list
+ \o \l{linguist/hellotr}{Hello tr()}\raisedaster
+ \o \l{linguist/arrowpad}{Arrow Pad}\raisedaster
+ \o \l{linguist/trollprint}{Troll Print}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-script.html
+ \title Qt Script Examples
+
+ \previouspage Qt Linguist Examples
+ \contentspage Qt Examples
+ \nextpage WebKit Examples
+
+ \image qtscript-examples.png QtScript
+
+ Qt is provided with a powerful embedded scripting environment through the QtScript
+ classes.
+
+ These examples demonstrate the fundamental aspects of scripting applications
+ with Qt.
+
+ \list
+ \o \l{script/calculator}{Calculator}\raisedaster
+ \o \l{script/context2d}{Context2D}\raisedaster
+ \o \l{script/defaultprototypes}{Default Prototypes}\raisedaster
+ \o \l{script/helloscript}{Hello Script}\raisedaster
+ \o \l{script/qstetrix}{Qt Script Tetrix}\raisedaster
+ \o \l{script/customclass}{Custom Script Class}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-webkit.html
+ \title WebKit Examples
+
+ \previouspage Qt Script Examples
+ \contentspage Qt Examples
+ \nextpage Help System Examples
+
+ \image webkit-examples.png WebKit
+
+ Qt provides an integrated Web browser component based on WebKit, the popular
+ open source browser engine.
+
+ These examples and demonstrations show a range of different uses for WebKit,
+ from displaying Web pages within a Qt user interface to an implementation of
+ a basic function Web browser.
+
+ \list
+ \o \l{webkit/previewer}{Previewer}\raisedaster
+ \o \l{webkit/formextractor}{Form Extractor}
+ \o \l{webkit/googlechat}{Google Chat}
+ \o \l{webkit/fancybrowser}{Fancy Browser}
+ \endlist
+*/
+
+/*!
+ \page examples-helpsystem.html
+ \title Help System Examples
+
+ \previouspage WebKit Examples
+ \contentspage Qt Examples
+ \nextpage State Machine Examples
+
+ \image assistant-examples.png HelpSystem
+
+ Support for interactive help is provided by the Qt Assistant application.
+ Developers can take advantages of the facilities it offers to display
+ specially-prepared documentation to users of their applications.
+
+ \list
+ \o \l{help/simpletextviewer}{Simple Text Viewer}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-statemachine.html
+ \title State Machine Examples
+
+ \previouspage Help System Examples
+ \contentspage Qt Examples
+ \nextpage Animation Framework Examples
+
+ \image statemachine-examples.png StateMachine
+
+ Qt provides a powerful hierarchical finite state machine through the Qt State
+ Machine classes.
+
+ These examples demonstrate the fundamental aspects of implementing
+ Statecharts with Qt.
+
+ \list
+ \o \l{statemachine/eventtransitions}{Event Transitions}\raisedaster
+ \o \l{statemachine/factorial}{Factorial States}\raisedaster
+ \o \l{statemachine/pingpong}{Ping Pong States}\raisedaster
+ \o \l{statemachine/rogue}{Rogue}\raisedaster
+ \o \l{statemachine/trafficlight}{Traffic Light}\raisedaster
+ \o \l{statemachine/twowaybutton}{Two-way Button}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-animation.html
+ \title Animation Framework Examples
+
+ \previouspage State Machine Examples
+ \contentspage Qt Examples
+ \nextpage Qt for Embedded Linux Examples
+
+ \image animation-examples.png Animation
+
+ \list
+ \o \l{animation/moveblocks}{Move Blocks}\raisedaster
+ \o \l{animation/stickman}{Stick man}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-embeddedlinux.html
+ \title Qt for Embedded Linux Examples
+
+ \previouspage Animation Framework Examples
+ \contentspage Qt Examples
+ \nextpage ActiveQt Examples
+
+ \image qt-embedded-examples.png QtEmbedded
+
+ These examples show how to take advantage of features specifically designed
+ for use on systems with limited resources, specialized hardware, and small
+ screens.
+
+ \list
+ \o \l{qws/svgalib}{Accelerated Graphics Driver}\raisedaster
+ \o \l{qws/dbscreen}{Double Buffered Graphics Driver}\raisedaster
+ \o \l{qws/mousecalibration}{Mouse Calibration}\raisedaster
+ \o \l{qws/ahigl}{OpenGL for Embedded Systems}\raisedaster
+ \o \l{qws/simpledecoration}{Simple Decoration}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-activeqt.html
+ \title ActiveQt Examples
+
+ \previouspage Qt for Embedded Linux Examples
+ \contentspage Qt Examples
+ \nextpage D-Bus Examples
+
+ \image activeqt-examples.png ActiveQt
+
+ \list
+ \o \l{activeqt/comapp}{COM App}\raisedaster
+ \o \l{Dot Net Example (ActiveQt)}{Dot Net}\raisedaster
+ \o \l{activeqt/hierarchy}{Hierarchy}\raisedaster
+ \o \l{activeqt/menus}{Menus}\raisedaster
+ \o \l{activeqt/multiple}{Multiple}\raisedaster
+ \o \l{activeqt/opengl}{OpenGL}\raisedaster
+ \o \l{activeqt/qutlook}{Qutlook}\raisedaster
+ \o \l{activeqt/simple}{Simple}\raisedaster
+ \o \l{activeqt/webbrowser}{Web Browser}\raisedaster
+ \o \l{activeqt/wrapper}{Wrapper}\raisedaster
+ \endlist
+*/
+
+/*!
+ \page examples-dbus.html
+ \title D-Bus Examples
+
+ \previouspage ActiveQt Examples
+ \contentspage Qt Examples
+ \nextpage Qt Quarterly
+
+ \list
+ \o \l{dbus/dbus-chat}{Chat}
+ \o \l{dbus/complexpingpong}{Complex Ping Pong}
+ \o \l{dbus/listnames}{List Names}
+ \o \l{dbus/pingpong}{Ping Pong}
+ \o \l{dbus/remotecontrolledcar}{Remote Controlled Car}
+ \endlist
+*/
diff --git a/doc/src/getting-started/how-to-learn-qt.qdoc b/doc/src/getting-started/how-to-learn-qt.qdoc
new file mode 100644